/*
 *  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.ui.impl.topo.util;

import org.onlab.osgi.ServiceDirectory;
import org.onosproject.cluster.ClusterService;
import org.onosproject.incubator.net.PortStatisticsService;
import org.onosproject.incubator.net.tunnel.TunnelService;
import org.onosproject.mastership.MastershipAdminService;
import org.onosproject.mastership.MastershipService;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.driver.DriverService;
import org.onosproject.net.flow.FlowRuleService;
import org.onosproject.net.host.HostService;
import org.onosproject.net.intent.IntentService;
import org.onosproject.net.link.LinkService;
import org.onosproject.net.statistic.StatisticService;
import org.onosproject.net.topology.TopologyService;

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

/**
 * A bundle of services that the topology view(s) require to get the job done.
 */
public class ServicesBundle {

    private ClusterService clusterService;

    private TopologyService topologyService;
    private DeviceService deviceService;
    private DriverService driverService;
    private HostService hostService;
    private LinkService linkService;
    private TunnelService tunnelService;

    private MastershipService mastershipService;
    private MastershipAdminService mastershipAdminService;
    private IntentService intentService;
    private FlowRuleService flowService;
    private StatisticService flowStatsService;
    private PortStatisticsService portStatsService;


    /**
     * Creates the services bundle, from the given directly.
     *
     * @param directory service directory
     */
    public ServicesBundle(ServiceDirectory directory) {
        checkNotNull(directory, "Directory cannot be null");

        clusterService = directory.get(ClusterService.class);

        topologyService = directory.get(TopologyService.class);
        deviceService = directory.get(DeviceService.class);
        driverService = directory.get(DriverService.class);
        hostService = directory.get(HostService.class);
        linkService = directory.get(LinkService.class);
        tunnelService = directory.get(TunnelService.class);

        mastershipService = directory.get(MastershipService.class);
        mastershipAdminService = directory.get(MastershipAdminService.class);
        intentService = directory.get(IntentService.class);
        flowService = directory.get(FlowRuleService.class);
        flowStatsService = directory.get(StatisticService.class);
        portStatsService = directory.get(PortStatisticsService.class);
    }

    /**
     * Returns a reference to the cluster service.
     *
     * @return cluster service reference
     */
    public ClusterService cluster() {
        return clusterService;
    }

    /**
     * Returns a reference to the topology service.
     *
     * @return topology service reference
     */
    public TopologyService topology() {
        return topologyService;
    }

    /**
     * Returns a reference to the device service.
     *
     * @return device service reference
     */
    public DeviceService device() {
        return deviceService;
    }

    /**
     * Returns a reference to the driver service.
     *
     * @return driver service reference
     */
    public DriverService driver() {
        return driverService;
    }

    /**
     * Returns a reference to the host service.
     *
     * @return host service reference
     */
    public HostService host() {
        return hostService;
    }

    /**
     * Returns a reference to the link service.
     *
     * @return link service reference
     */
    public LinkService link() {
        return linkService;
    }

    /**
     * Returns a reference to the tunnel service.
     *
     * @return tunnel service reference
     */
    public TunnelService tunnel() {
        return tunnelService;
    }

    /**
     * Returns a reference to the mastership service.
     *
     * @return mastership service reference
     */
    public MastershipService mastership() {
        return mastershipService;
    }

    /**
     * Returns a reference to the mastership admin service.
     *
     * @return mastership admin service reference
     */
    public MastershipAdminService mastershipAdmin() {
        return mastershipAdminService;
    }

    /**
     * Returns a reference to the intent service.
     *
     * @return intent service reference
     */
    public IntentService intent() {
        return intentService;
    }

    /**
     * Returns a reference to the flow rule service.
     *
     * @return flow service reference
     */
    public FlowRuleService flow() {
        return flowService;
    }

    /**
     * Returns a reference to the flow statistics service.
     *
     * @return flow statistics service reference
     */
    public StatisticService flowStats() {
        return flowStatsService;
    }

    /**
     * Returns a reference to the port statistics service.
     *
     * @return port statistics service reference
     */
    public PortStatisticsService portStats() {
        return portStatsService;
    }
}
