/*
 * Copyright 2016 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.tenbi.topology.impl;

import static com.google.common.base.Preconditions.checkNotNull;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.event.AbstractListenerManager;
import org.onosproject.tetopology.management.api.TeTopologyEvent;
import org.onosproject.tetopology.management.api.TeTopologyListener;
import org.onosproject.tetopology.management.api.TeTopologyService;
import org.onosproject.teyang.api.OperationType;
import org.onosproject.teyang.utils.topology.NetworkConverter;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork.OnosYangOpType;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetworkOpParam;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetworkService;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworksState;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.IetfNetworkTopology;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
        .rev20151208.IetfNetworkTopologyOpParam;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
        .rev20151208.IetfNetworkTopologyService;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.IetfTeTopology;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.IetfTeTopologyOpParam;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.IetfTeTopologyService;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
        .IetfTeTopologyEvent;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
        .IetfTeTopologyEventListener;
import org.onosproject.yms.ymsm.YmsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * The IETF TE Topology NBI Manager implementation.
 */
@Component(immediate = true)
@Service
public class TeTopologyNbiManager
        extends AbstractListenerManager<IetfTeTopologyEvent, IetfTeTopologyEventListener>
        implements IetfNetworkService, IetfNetworkTopologyService, IetfTeTopologyService {

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

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected TeTopologyService teTopologyService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected YmsService ymsService;


    /**
     * Activation helper function.
     */
    private void activateBasics() {
        eventDispatcher.addSink(IetfTeTopologyEvent.class, listenerRegistry);
    }

    /**
     * Deactivation helper function.
     */
    private void deactivateBasics() {
        eventDispatcher.removeSink(IetfTeTopologyEvent.class);
    }

    @Activate
    protected void activate() {
        activateBasics();

        // Register 3 services with YMS.
        ymsService.registerService(this, IetfNetworkService.class, null);
        ymsService.registerService(this, IetfNetworkTopologyService.class, null);
        ymsService.registerService(this, IetfTeTopologyService.class, null);

        // Listens to TE Topology events
        teTopologyService.addListener(new InternalTeTopologyListener());

        log.info("Started");
    }

    @Deactivate
    protected void deactivate() {
        deactivateBasics();

        // Unregister 3 services.
        ymsService.unRegisterService(this, IetfNetworkService.class);
        ymsService.unRegisterService(this, IetfNetworkTopologyService.class);
        ymsService.unRegisterService(this, IetfTeTopologyService.class);

        teTopologyService.removeListener(new InternalTeTopologyListener());
        log.info("Stopped");
    }

    @Override
    public IetfNetwork getIetfNetwork(IetfNetworkOpParam ietfNetwork) {
        checkNotNull(ietfNetwork, "getIetfNetwork: ietfNetwork cannot be null");

        // Get the entire data tree from TE Subsystem core.
        org.onosproject.tetopology.management.api.Networks teNetworks = teTopologyService.networks();

        // Build the sample networks for RESTCONF/YMS integration test
//        org.onosproject.tetopology.management.api.Networks teNetworks = new DefaultNetworks(DefaultBuilder
//                .sampleDomain1Networks());

        // Convert the TE Subsystem core data into YANG Objects.
        Networks networks = NetworkConverter
                .teSubsystem2YangNetworks(teNetworks, OperationType.QUERY,
                                          teTopologyService);
        NetworksState networkStates = NetworkConverter.teSubsystem2YangNetworkStates(teNetworks, OperationType.QUERY);

        IetfNetworkOpParam.IetfNetworkBuilder builder = new IetfNetworkOpParam.IetfNetworkBuilder();
        IetfNetwork newNetwork = builder.networks(networks)
                .networksState(networkStates)
                .yangIetfNetworkOpType(OnosYangOpType.NONE)
                .build();

        // processSubtreeFiltering() filters the entire data tree based on the
        // user's query and returns the filtered data.
        IetfNetwork result = ietfNetwork.processSubtreeFiltering(
                newNetwork,
                false);
        log.debug("result is: {}", result);
        return result;
    }

    @Override
    public void setIetfNetwork(IetfNetworkOpParam ietfNetwork) {
        // In H release, topology is discovered from south, no NBI Set is supported.
    }

    @Override
    public IetfTeTopology getIetfTeTopology(IetfTeTopologyOpParam ietfTeTopology) {
        // unused method.
        return ietfTeTopology;
    }

    @Override
    public void setIetfTeTopology(IetfTeTopologyOpParam ietfTeTopology) {
        // unused methods.
    }

    @Override
    public IetfTeTopology getAugmentedIetfTeTopologyTeLinkEvent(IetfTeTopologyOpParam ietfTeTopology) {
        // unused methods.
        return ietfTeTopology;
    }

    @Override
    public void setAugmentedIetfTeTopologyTeLinkEvent(IetfTeTopologyOpParam augmentedIetfTeTopologyTeLinkEvent) {
        // unused methods.
    }

    @Override
    public IetfNetworkTopology getIetfNetworkTopology(IetfNetworkTopologyOpParam ietfNetworkTopology) {
        // unused methods.
        return ietfNetworkTopology;
    }

    @Override
    public void setIetfNetworkTopology(IetfNetworkTopologyOpParam ietfNetworkTopology) {
        // unused methods.
    }

    @Override
    public IetfNetwork getAugmentedIetfNetworkNetworks(IetfNetworkOpParam ietfNetwork) {
        // unused methods.
        return ietfNetwork;
    }

    @Override
    public void setAugmentedIetfNetworkNetworks(IetfNetworkOpParam augmentedIetfNetworkNetworks) {
        // unused methods.
    }

    private class InternalTeTopologyListener implements TeTopologyListener {
        @Override
        public void event(TeTopologyEvent event) {
            IetfTeTopologyEvent yangEvent = NetworkConverter
                    .teTopoEvent2YangIetfTeTopoEvent(event);
            post(yangEvent);
        }
    }
}
