/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.onosproject.yms.app.ydt;

import org.onosproject.yangutils.datamodel.YangSchemaNode;
import org.onosproject.yms.app.ydt.exceptions.YdtException;

import static org.onosproject.yms.app.ydt.YdtConstants.FMT_DUP_ENTRY;
import static org.onosproject.yms.app.ydt.YdtConstants.errorMsg;
import static org.onosproject.yms.ydt.YdtType.SINGLE_INSTANCE_LEAF_VALUE_NODE;

/**
 * Represents YDT single instance leaf node which is an atomic element
 * and doesn't have any child.
 */
class YdtSingleInstanceLeafNode extends YdtNode {

    /*
     * Value of the leaf.
     */
    private String value;

    /*
     * Value of the leaf.
     */
    private Boolean isKeyLeaf = false;

    /**
     * Creates a YANG single instance leaf node.
     *
     * @param node schema of YDT single instance leaf node
     */
    YdtSingleInstanceLeafNode(YangSchemaNode node) {
        super(SINGLE_INSTANCE_LEAF_VALUE_NODE, node);
    }

    /**
     * Returns the flag indicating that requested leaf is key-leaf or not.
     *
     * @return isKeyLeaf true, for key leaf; false non key leaf
     */
    public Boolean isKeyLeaf() {
        return isKeyLeaf;
    }

    @Override
    public String getValue() {
        return value;
    }

    @Override
    public void addValue(String value) throws YdtException {
        // Check the value against corresponding data-type.
        //TODO validation need to be decided
//        try {
//            getYangSchemaNode().isValueValid(value);
//        } catch (Exception e) {
//            throw new YdtException(e.getLocalizedMessage());
//        }

        // After validation is successful then add value to node.
        this.value = value;
    }


    @Override
    public void addValueWithoutValidation(String value, boolean isKeyLeaf) {
        this.value = value;
        this.isKeyLeaf = isKeyLeaf;
    }

    @Override
    public void validDuplicateEntryProcessing() throws YdtException {
        throw new YdtException(errorMsg(FMT_DUP_ENTRY, getName()));
    }
}
