/*
 * Copyright 2015 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.net.newresource.impl;

import com.google.common.annotations.Beta;
import com.google.common.collect.ImmutableList;

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.onosproject.mastership.MastershipService;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.config.ConfigFactory;
import org.onosproject.net.config.NetworkConfigListener;
import org.onosproject.net.config.NetworkConfigRegistry;
import org.onosproject.net.device.DeviceListener;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.driver.DriverService;
import org.onosproject.net.newresource.BandwidthCapacity;
import org.onosproject.net.newresource.ResourceAdminService;
import org.onosproject.net.newresource.ResourceService;
import org.slf4j.Logger;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import static org.onlab.util.Tools.groupedThreads;
import static org.onosproject.net.config.basics.SubjectFactories.CONNECT_POINT_SUBJECT_FACTORY;
import static org.slf4j.LoggerFactory.getLogger;

/**
 * A class registering resources when they are detected.
 */
@Component(immediate = true)
@Beta
public final class ResourceRegistrar {

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected ResourceAdminService adminService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected ResourceService resourceService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected DriverService driverService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected DeviceService deviceService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected MastershipService mastershipService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected NetworkConfigRegistry cfgRegistry;

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

    private final List<ConfigFactory<?, ?>> factories = ImmutableList.of(
     new ConfigFactory<ConnectPoint, BandwidthCapacity>(CONNECT_POINT_SUBJECT_FACTORY,
             BandwidthCapacity.class, BandwidthCapacity.CONFIG_KEY) {
         @Override
         public BandwidthCapacity createConfig() {
             return new BandwidthCapacity();
         }
     });


    private DeviceListener deviceListener;

    private final ExecutorService executor =
            Executors.newSingleThreadExecutor(groupedThreads("onos/resource", "registrar"));

    private NetworkConfigListener cfgListener;

    @Activate
    public void activate() {
        factories.forEach(cfgRegistry::registerConfigFactory);

        cfgListener = new ResourceNetworkConfigListener(adminService, cfgRegistry, mastershipService, executor);
        cfgRegistry.addListener(cfgListener);

        deviceListener = new ResourceDeviceListener(adminService, resourceService,
                deviceService, mastershipService, driverService, cfgRegistry, executor);
        deviceService.addListener(deviceListener);

        // TODO Attempt initial registration of existing resources?

        log.info("Started");
    }

    @Deactivate
    public void deactivate() {
        deviceService.removeListener(deviceListener);
        cfgRegistry.removeListener(cfgListener);

        executor.shutdownNow();

        factories.forEach(cfgRegistry::unregisterConfigFactory);

        log.info("Stopped");
    }
}
