/*
 * Copyright 2016-present Open Networking Foundation
 *
 * 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.ypm;

/**
 * Represents implementation of interfaces to build and obtain YANG protocol metadata tree node.
 */
public class DefaultYpmNode implements YpmContext {

    /**
     * Name of the node.
     */
    private String name;

    /**
     * Parent reference.
     */
    private DefaultYpmNode parent;

    /**
     * First child reference.
     */
    private DefaultYpmNode child;

    /**
     * Next sibling reference.
     */
    private DefaultYpmNode nextSibling;

    /**
     * Previous sibling reference.
     */
    private DefaultYpmNode previousSibling;

    /**
     * Protocol metadata object.
     */
    private Object metaData;

    /**
     * Creates a specific type of node.
     *
     * @param name of ypm node
     */
    public DefaultYpmNode(String name) {
        setName(name);
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public DefaultYpmNode getParent() {
        return parent;
    }

    @Override
    public void setParent(YpmContext parent) {
        this.parent = (DefaultYpmNode) parent;
    }

    @Override
    public YpmContext getFirstChild() {
        return child;
    }

    @Override
    public YpmContext getChild(String ypmName) {
        if (ypmName == null) {
            // Input is null. So, will not proceed.
            return null;
        }

        if (child == null) {
            // No children
            return null;
        }

        // Check the first child
        if (child.name.equals(ypmName)) {
            return child;
        }

        // Check its siblings
        YpmContext currentChild = child;
        while (currentChild.getNextSibling() != null) {
            currentChild = currentChild.getNextSibling();
            if (currentChild.getName().equals(ypmName)) {
                return currentChild;
            }
        }

        return null;
    }

    @Override
    public void addChild(String ypmName) {
        if (ypmName == null) {
            // Input is null. So, will not proceed.
            return;
        }

        if (getChild(ypmName) != null) {
            // Already available with the same name. So, no need to add
            return;
        }

        // Create new ypm node and attach to its parent
        DefaultYpmNode newNode = new DefaultYpmNode(ypmName);
        newNode.setParent(this);

        // Check the first child
        if (child == null) {
            child = newNode;
            return;
        }

        // Add it to its siblings
        YpmContext currentChild = child;
        // Go to the last child
        while (currentChild.getNextSibling() != null) {
            currentChild = currentChild.getNextSibling();
        }
        currentChild.setNextSibling(newNode);
        newNode.setPreviousSibling((DefaultYpmNode) currentChild);
    }

    @Override
    public YpmContext getSibling(String ypmName) {
        if (ypmName == null) {
            // Input is null. So, will not proceed.
            return null;
        }

        YpmContext sibling = getNextSibling();
        while (sibling != null) {
            if (sibling.getName().equals(ypmName)) {
                return sibling;
            }
            sibling = sibling.getNextSibling();
        }
        return null;
    }

    @Override
    public void addSibling(String ypmName) {
        if (ypmName == null) {
            // Input is null. So, will not proceed.
            return;
        }

        if (getSibling(ypmName) != null) {
            // Already available with the same name. So, no need to add
            return;
        }

        // Create new ypm node and attach to its parent
        DefaultYpmNode newSibling = new DefaultYpmNode(ypmName);
        newSibling.setParent(this.getParent());

        // Add it as its sibling
        YpmContext sibling = getNextSibling();
        if (sibling == null) {
            setNextSibling(newSibling);
            newSibling.setPreviousSibling(this);
        } else {
            // Go to the last sibling
            while (sibling.getNextSibling() != null) {
                sibling = sibling.getNextSibling();
            }
            sibling.setNextSibling(newSibling);
            newSibling.setPreviousSibling((DefaultYpmNode) sibling);
        }
    }

    @Override
    public DefaultYpmNode getNextSibling() {
        return nextSibling;
    }

    @Override
    public void setNextSibling(DefaultYpmNode sibling) {
        nextSibling = sibling;
    }

    @Override
    public DefaultYpmNode getPreviousSibling() {
        return previousSibling;
    }

    @Override
    public void setPreviousSibling(DefaultYpmNode sibling) {
        this.previousSibling = sibling;
    }

    @Override
    public Object getMetaData() {
        return this.metaData;
    }

    @Override
    public void setMetaData(Object data) {
        this.metaData = data;
    }
}
