/**
 * @file plugins_exts_nacm.c
 * @author Radek Krejci <rkrejci@cesnet.cz>
 * @brief libyang extension plugin - Metadata (RFC 7952)
 *
 * Copyright (c) 2019 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
 */
#include "common.h"

#include <stdlib.h>

#include "plugins_exts.h"
#include "tree_schema.h"
#include "plugins_exts_metadata.h"

/**
 * @brief Storage for ID used to check plugin API version compatibility.
 * Ignored here in the internal plugin.
LYEXT_VERSION_CHECK
 */

struct lysc_ext_substmt annotation_substmt[7] = {
    {LY_STMT_IF_FEATURE, LY_STMT_CARD_ANY, NULL},
    {LY_STMT_UNITS, LY_STMT_CARD_OPT, NULL},
    {LY_STMT_STATUS, LY_STMT_CARD_OPT, NULL},
    {LY_STMT_TYPE, LY_STMT_CARD_MAND, NULL},
    {LY_STMT_DESCRIPTION, LY_STMT_CARD_OPT, NULL},
    {LY_STMT_REFERENCE, LY_STMT_CARD_OPT, NULL},
    {0, 0, 0} /* terminating item */
};

/**
 * @brief Compile annotation extension instances.
 *
 * Implementation of lyext_clb_compile callback set as lyext_plugin::compile.
 */
LY_ERR
annotation_compile(struct lysc_ctx *cctx, const struct lysp_ext_instance *p_ext, struct lysc_ext_instance *c_ext)
{
    struct lyext_metadata *annotation;
    struct lysc_module *mod_c;
    unsigned int u;

    /* annotations can appear only at the top level of a YANG module or submodule */
    if (c_ext->parent_type != LYEXT_PAR_MODULE) {
        lyext_log(c_ext, LY_LLERR, LY_EVALID, cctx->path, "Extension %s is allowed only at the top level of a YANG module or submodule, but it is placed in \"%s\" statement.",
                  p_ext->name, lyext_parent2str(c_ext->parent_type));
        return LY_EVALID;
    }
    /* check mandatory argument */
    if (!c_ext->argument) {
        lyext_log(c_ext, LY_LLERR, LY_EVALID, cctx->path, "Extension %s is instantiated without mandatory argument representing metadata name.",
                  p_ext->name);
        return LY_EVALID;
    }

    mod_c = (struct lysc_module *)c_ext->parent;

    /* check for duplication */
    LY_ARRAY_FOR(mod_c->exts, u) {
        if (&mod_c->exts[u] != c_ext && mod_c->exts[u].def == c_ext->def && !strcmp(mod_c->exts[u].argument, c_ext->argument)) {
            /* duplication of the same annotation extension in a single module */
            lyext_log(c_ext, LY_LLERR, LY_EVALID, cctx->path, "Extension %s is instantiated multiple times.", p_ext->name);
            return LY_EVALID;
        }
    }

    /* compile annotation substatements */
    c_ext->data = annotation = calloc(1, sizeof *annotation);
    LY_CHECK_ERR_RET(!annotation, LOGMEM(cctx->ctx), LY_EMEM);
    annotation_substmt[0].storage = &annotation->iffeatures;
    annotation_substmt[1].storage = &annotation->units;
    annotation_substmt[2].storage = &annotation->flags;
    annotation_substmt[3].storage = &annotation->type;
    /* description and reference are allowed, but not compiled */

    LY_CHECK_RET(lys_compile_extension_instance(cctx, p_ext, annotation_substmt));

    return LY_SUCCESS;
}

/**
 * @brief Free annotation extension instances' data.
 *
 * Implementation of lyext_clb_free callback set as lyext_plugin::free.
 */
void
annotation_free(struct ly_ctx *ctx, struct lysc_ext_instance *ext)
{
    if (!ext->data) {
        return;
    }

    struct lyext_metadata *annotation = (struct lyext_metadata*)ext->data;
    annotation_substmt[0].storage = &annotation->iffeatures;
    annotation_substmt[1].storage = &annotation->units;
    annotation_substmt[2].storage = &annotation->flags;
    annotation_substmt[3].storage = &annotation->type;

   lysc_extension_instance_free(ctx, annotation_substmt);
   free(ext->data);
}

/**
 * @brief Plugin for the Metadata's annotation extension
 */
struct lyext_plugin metadata_plugin = {
    .id = "libyang 2 - metadata, version 1",
    .compile = &annotation_compile,
    .validate = NULL,
    .free = annotation_free
};
