/*
 * Copyright 2015-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.pcep.api;

import org.onosproject.net.DeviceId;

/**
 * Abstraction of an PCEP controller. Serves as a one stop shop for obtaining
 * PCEP devices and (un)register listeners on PCEP events
 */
public interface PcepController {

    /**
     * Returns all switches known to this PCEP controller.
     *
     * @return Iterable of did elements
     */
    Iterable<PcepSwitch> getSwitches();

    /**
     * Return a switch with a specified did.
     *
     * @param did of a device
     * @return a pcep device
     */
    PcepSwitch getSwitch(PcepDpid did);

    /**
     * Register a listener for meta events that occur to PCEP devices.
     *
     * @param listener the listener to notify
     */
    void addListener(PcepSwitchListener listener);

    /**
     * Unregister a listener.
     *
     * @param listener the listener to unregister
     */
    void removeListener(PcepSwitchListener listener);

    /**
     * Register a listener for meta events that occur to PCEP links.
     *
     * @param listener the listener to notify
     */
    void addLinkListener(PcepLinkListener listener);

    /**
     * Unregister a link listener.
     *
     * @param listener the listener to unregister
     */
    void removeLinkListener(PcepLinkListener listener);

    /**
     * Register a listener for meta events that occur to PCEP tunnel.
     *
     * @param listener the listener to notify
     */
    void addTunnelListener(PcepTunnelListener listener);

    /**
     * Unregister a tunnel listener.
     *
     * @param listener the listener to unregister
     */
    void removeTunnelListener(PcepTunnelListener listener);

    /**
     * Setup a tunnel through pcep controller.
     *
     * @param srcDid src deviceId of tunnel
     * @param dstDid dst deviceId of tunnel
     * @param srcPort src port
     * @param dstPort dst port
     * @param bandwidth andwidth of tunnel
     * @param name tunnel name
     * @return pcep tunnel
     */
    PcepTunnel applyTunnel(DeviceId srcDid, DeviceId dstDid,
                                  long srcPort, long dstPort, long bandwidth,
                                  String name);

    /**
     * Delete tunnel by id.
     *
     * @param id pcep tunnel id.
     * @return true or false
     */
    Boolean deleteTunnel(String id);

    /**
     * Update tunnel bandwidth by tunnel id.
     *
     * @param id tunnel id
     * @param bandwidth bandwidth of a tunnel
     * @return true or false
     */
    Boolean updateTunnelBandwidth(String id, long bandwidth);

    /**
     * Send statistic request by tunnel id.
     *
     * @param pcepTunnelId PCEP tunnel id
     */
    void getTunnelStatistics(String pcepTunnelId);

}
