/*
 * 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.app.ypm;

import org.onosproject.yms.ydt.YdtContext;
import org.onosproject.yms.ypm.DefaultYpmNode;
import org.onosproject.yms.ypm.YpmContext;
import org.onosproject.yms.ypm.YpmService;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Represents implementation of YANG protocol metadata manager.
 */
@Component(immediate = true, service = YpmService.class)
public class YpmManager implements YpmService {

    private final Logger log = LoggerFactory.getLogger(getClass());
    private YpmContext rootYpmNode;

    @Activate
    public void activate() {
        log.info("Started");
    }

    @Deactivate
    public void deactivate() {
        log.info("Stopped");
    }

    @Override
    public YpmContext getProtocolData(YdtContext rootYdtNode) {
        if (rootYdtNode == null) {
            log.debug("Input data is null. So, will not proceed.");
            return null;
        }

        // Iterate through YDT and search the path in YPM tree and create new YPM tree equivalent to given YDT
        // and return it.
        if (rootYpmNode == null) {
            log.debug("YPM tree has no data.");
            return null;
        }

        YdtContext currentYdtNode = rootYdtNode;
        YpmContext currentYpmNode = rootYpmNode;
        YpmContext rootRetYpmNode = new DefaultYpmNode(currentYdtNode.getName());
        YpmContext currRetYpmNode = rootRetYpmNode;
        while (currentYdtNode != null) {
            // Each ypm node can have children. So, create new corresponding ypm child
            // and add it to new returning ypm tree, otherwise return new ypm tree.
            YdtContext nextNode = currentYdtNode.getFirstChild();
            if (nextNode != null) {
                YpmContext ypmChild = currentYpmNode.getChild(nextNode.getName());
                if (ypmChild != null) {
                    currRetYpmNode.addChild(ypmChild.getName());
                } else {
                    return rootRetYpmNode;
                }
                currentYdtNode = nextNode;
                currentYpmNode = currentYpmNode.getChild(nextNode.getName());
                currRetYpmNode = currRetYpmNode.getChild(nextNode.getName());
                currRetYpmNode.setMetaData(currentYpmNode.getMetaData());
                continue;
            }

            // No child nodes, so walk tree
            while (currentYdtNode != null) {
                // Each ypm node can have sibling. So, create new corresponding ypm sibling node
                // and add it to new returning ypm tree, otherwise return new ypm tree.
                nextNode = currentYdtNode.getNextSibling();
                if (nextNode != null) {
                    YpmContext ypmSibling = currentYpmNode.getSibling(nextNode.getName());
                    if (ypmSibling != null) {
                        currRetYpmNode.addSibling(ypmSibling.getName());
                    } else {
                        return rootRetYpmNode;
                    }
                    currentYdtNode = nextNode;
                    currentYpmNode = currentYpmNode.getSibling(nextNode.getName());
                    currRetYpmNode = currRetYpmNode.getSibling(nextNode.getName());
                    currRetYpmNode.setMetaData(currentYpmNode.getMetaData());
                    break;
                }

                // Move up
                if (currentYdtNode == rootYdtNode) {
                    currentYdtNode = null;
                } else {
                    currentYdtNode = currentYdtNode.getParent();
                    currentYpmNode = currentYpmNode.getParent();
                    currRetYpmNode = currRetYpmNode.getParent();
                }
            }
        }

        return rootRetYpmNode;
    }

    @Override
    public void setProtocolData(YdtContext rootYdtNode, Object data) {
        if (rootYdtNode == null || data == null) {
            log.debug("Input data is null. So, will not proceed.");
            return;
        }

        // Iterate through YDT and add each node of this path to ypm tree if it is not exists
        YdtContext currentYdtNode = rootYdtNode;
        YpmContext currentYpmNode = rootYpmNode;
        while (currentYdtNode != null) {
            // Check the ypm root node first
            if (rootYpmNode == null) {
                rootYpmNode = new DefaultYpmNode(currentYdtNode.getName());
                currentYpmNode = rootYpmNode;
                // In logical node, should not set protocol metadata
            }

            // Move down to first child
            YdtContext nextNode = currentYdtNode.getFirstChild();
            if (nextNode != null) {
                // Each ypm node can have sibling. So, get corresponding sibling node, otherwise create it.
                if (currentYpmNode.getChild(nextNode.getName()) == null) {
                    currentYpmNode.addChild(nextNode.getName());
                }
                currentYpmNode = currentYpmNode.getChild(nextNode.getName());
                // Set/update protocol metadata
                currentYpmNode.setMetaData(data);
                currentYdtNode = nextNode;
                continue;
            }

            // No child nodes, so walk tree
            while (currentYdtNode != null) {
                // Move to sibling if possible.
                nextNode = currentYdtNode.getNextSibling();
                if (nextNode != null) {
                    // Each ypm node can have children (sibling). So, get corresponding ypm child, otherwise create it.
                    if (currentYpmNode.getSibling(nextNode.getName()) == null) {
                        currentYpmNode.addSibling(nextNode.getName());
                    }
                    currentYpmNode = currentYpmNode.getSibling(nextNode.getName());
                    // Set/update protocol metadata
                    currentYpmNode.setMetaData(data);
                    currentYdtNode = nextNode;
                    break;
                }

                // Move up
                if (currentYdtNode == rootYdtNode) {
                    currentYdtNode = null;
                } else {
                    currentYdtNode = currentYdtNode.getParent();
                    currentYpmNode = currentYpmNode.getParent();
                }
            }
        }
    }
}
