/**
 * @file plugins_exts.c
 * @author Radek Krejci <rkrejci@cesnet.cz>
 * @brief Internally implemented YANG extensions.
 *
 * 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 "plugins_exts.h"

#include <stdint.h>
#include <string.h>

#include "common.h"
#include "plugins_exts_metadata.c"
#include "plugins_exts_nacm.c"

/**
 * @brief list of all extension plugins implemented internally
 */
struct lyext_plugins_list lyext_plugins_internal[6] = {
    {"ietf-netconf-acm", "2012-02-22", "default-deny-write", &nacm_plugin},
    {"ietf-netconf-acm", "2018-02-14", "default-deny-write", &nacm_plugin},
    {"ietf-netconf-acm", "2012-02-22", "default-deny-all", &nacm_plugin},
    {"ietf-netconf-acm", "2018-02-14", "default-deny-all", &nacm_plugin},
    {"ietf-yang-metadata", "2016-08-05", "annotation", &metadata_plugin},
    {NULL, NULL, NULL, NULL} /* terminating item */
};

/* TODO support for external extension plugins */

struct lyext_plugin *
lyext_get_plugin(struct lysc_ext *ext)
{
    for (uint8_t u = 0; lyext_plugins_internal[u].module; ++u) {
        if (!strcmp(ext->name, lyext_plugins_internal[u].name) &&
                !strcmp(ext->module->name, lyext_plugins_internal[u].module) &&
                (!lyext_plugins_internal[u].revision || !strcmp(ext->module->revision, lyext_plugins_internal[u].revision))) {
            /* we have the match */
            return lyext_plugins_internal[u].plugin;
        }
    }

    return NULL;
}

API const char *
lyext_parent2str(LYEXT_PARENT type)
{
    switch (type) {
    case LYEXT_PAR_MODULE:
        return "module";
    case LYEXT_PAR_NODE:
        return "data node";
    case LYEXT_PAR_INPUT:
        return "input";
    case LYEXT_PAR_OUTPUT:
        return "output";
    case LYEXT_PAR_TYPE:
        return "type";
    case LYEXT_PAR_TYPE_BIT:
        return "bit";
    case LYEXT_PAR_TYPE_ENUM:
        return "enum";
    case LYEXT_PAR_MUST:
        return "must";
    case LYEXT_PAR_PATTERN:
        return "pattern";
    case LYEXT_PAR_LENGTH:
        return "length";
    case LYEXT_PAR_RANGE:
        return "range";
    case LYEXT_PAR_WHEN:
        return "when";
    case LYEXT_PAR_IDENT:
        return "identity";
    case LYEXT_PAR_EXT:
        return "extension instance";
    case LYEXT_PAR_IMPORT:
        return "import";
    /* YANG allows extension instances inside the following statements,
     * but they do not have any meaning in current libyang
        case LYEXT_PAR_TPDF:
            return "typedef";
        case LYEXT_PAR_EXTINST:
            return "extension";
        case LYEXT_PAR_REFINE:
            return "refine";
        case LYEXT_PAR_DEVIATION:
            return "deviation";
        case LYEXT_PAR_DEVIATE:
            return "deviate";
        case LYEXT_PAR_INCLUDE:
            return "include";
        case LYEXT_PAR_REVISION:
            return "revision";
     */
    default:
        return "unknown";
    }
}
