/**
 * @file cmd_add.c
 * @author Michal Vasko <mvasko@cesnet.cz>
 * @author Radek Krejci <rkrejci@cesnet.cz>
 * @author Adam Piecek <piecek@cesnet.cz>
 * @brief 'add' command of the libyang's yanglint tool.
 *
 * Copyright (c) 2015-2023 CESNET, z.s.p.o.
 *
 * This source code is licensed under BSD 3-Clause License (the "License").
 * You may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 */

#define _GNU_SOURCE

#include "cmd.h"

#include <assert.h>
#include <getopt.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

#include "libyang.h"

#include "common.h"
#include "yl_opt.h"

void
cmd_add_help(void)
{
    printf("Usage: add [-iD] <schema1> [<schema2> ...]\n"
            "                  Add a new module from a specific file.\n\n"
            "  -D, --disable-searchdir\n"
            "                  Do not implicitly search in current working directory for\n"
            "                  the import schema modules. If specified a second time, do not\n"
            "                  even search in the module directory (all modules must be \n"
            "                  explicitly specified).\n"
            "  -F FEATURES, --features=FEATURES\n"
            "                  Features to support, default all in all implemented modules.\n"
            "                  Specify separately for each module.\n"
            "                  <modname>:[<feature>,]*\n"
            "  -i, --make-implemented\n"
            "                  Make the imported modules \"referenced\" from any loaded\n"
            "                  <schema> module also implemented. If specified a second time,\n"
            "                  all the modules are set implemented.\n"
            "  -X, --extended-leafref\n"
            "                  Allow usage of deref() XPath function within leafref.\n");
}

int
cmd_add_opt(struct yl_opt *yo, const char *cmdline, char ***posv, int *posc)
{
    int rc = 0, argc = 0;
    int opt, opt_index;
    struct option options[] = {
        {"disable-searchdir", no_argument, NULL, 'D'},
        {"features", required_argument, NULL, 'F'},
        {"help", no_argument, NULL, 'h'},
        {"make-implemented", no_argument, NULL, 'i'},
        {"extended-leafref", no_argument, NULL, 'X'},
        {NULL, 0, NULL, 0}
    };

    if ((rc = parse_cmdline(cmdline, &argc, &yo->argv))) {
        return rc;
    }

    while ((opt = getopt_long(argc, yo->argv, commands[CMD_ADD].optstring, options, &opt_index)) != -1) {
        switch (opt) {
        case 'D': /* --disable--search */
            if (yo->ctx_options & LY_CTX_DISABLE_SEARCHDIRS) {
                YLMSG_W("The -D option specified too many times.\n");
            }
            yo_opt_update_disable_searchdir(yo);
            break;

        case 'F': /* --features */
            if (parse_features(optarg, &yo->schema_features)) {
                return 1;
            }
            break;

        case 'h':
            cmd_add_help();
            return 1;

        case 'i': /* --make-implemented */
            yo_opt_update_make_implemented(yo);
            break;

        case 'X': /* --extended-leafref */
            yo->ctx_options |= LY_CTX_LEAFREF_EXTENDED;
            break;

        default:
            YLMSG_E("Unknown option.\n");
            return 1;
        }
    }

    *posv = &yo->argv[optind];
    *posc = argc - optind;

    return 0;
}

int
cmd_add_dep(struct yl_opt *yo, int posc)
{
    if (yo->interactive && !posc) {
        /* no argument */
        cmd_add_help();
        return 1;
    }
    if (!yo->schema_features.count) {
        /* no features, enable all of them */
        yo->ctx_options |= LY_CTX_ENABLE_IMP_FEATURES;
    }

    return 0;
}

static int
store_parsed_module(const char *filepath, struct lys_module *mod, struct yl_opt *yo)
{
    assert(!yo->interactive);

    if (yo->schema_out_format || yo->feature_param_format) {
        if (ly_set_add(&yo->schema_modules, (void *)mod, 1, NULL)) {
            YLMSG_E("Storing parsed schema module (%s) for print failed.\n", filepath);
            return 1;
        }
    }

    return 0;
}

int
cmd_add_exec(struct ly_ctx **ctx, struct yl_opt *yo, const char *posv)
{
    const char *all_features[] = {"*", NULL};
    LY_ERR ret;
    uint8_t path_unset = 1; /* flag to unset the path from the searchpaths list (if not already present) */
    char *dir, *modname = NULL;
    const char **features = NULL;
    struct ly_in *in = NULL;
    struct lys_module *mod;

    assert(posv);

    if (yo->ctx_options) {
        ly_ctx_set_options(*ctx, yo->ctx_options);
    }

    if (parse_schema_path(posv, &dir, &modname)) {
        return 1;
    }

    if (!yo->interactive) {
        /* The module should already be parsed if yang_lib_file was set. */
        if (yo->yang_lib_file && (mod = ly_ctx_get_module_implemented(*ctx, modname))) {
            ret = store_parsed_module(posv, mod, yo);
            goto cleanup;
        }
        /* parse module */
    }

    /* add temporarily also the path of the module itself */
    if (ly_ctx_set_searchdir(*ctx, dir) == LY_EEXIST) {
        path_unset = 0;
    }

    /* get features list for this module */
    if (!yo->schema_features.count) {
        features = all_features;
    } else {
        get_features(&yo->schema_features, modname, &features);
    }

    /* prepare input handler */
    ret = ly_in_new_filepath(posv, 0, &in);
    if (ret) {
        goto cleanup;
    }

    /* parse the file */
    ret = lys_parse(*ctx, in, LYS_IN_UNKNOWN, features, &mod);
    ly_in_free(in, 1);
    ly_ctx_unset_searchdir_last(*ctx, path_unset);
    if (ret) {
        goto cleanup;
    }

    if (!yo->interactive) {
        if ((ret = store_parsed_module(posv, mod, yo))) {
            goto cleanup;
        }
    }

cleanup:
    free(dir);
    free(modname);

    return ret;
}
