/*
 * Copyright 2016-present 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.sdxl2;

import java.util.Optional;
import java.util.Set;

/**
 * Service that allows the creation of L2 Virtual Circuits
 * between edge ports of a given SDN network.
 */
public interface SdxL2VCService {

    /**
     * Creates an L2 Virtual Circuit between two SDX-L2 Connection Points.
     *
     * @param sdxl2 name of SDX-L2
     * @param sdxl2cplhs name of SDX-L2 CP, left hand side of the VC
     * @param sdxl2cprhs name of SDX-L2 CP, right hand side of the VC
     */
    void addVC(String sdxl2, SdxL2ConnectionPoint sdxl2cplhs, SdxL2ConnectionPoint sdxl2cprhs);

    /**
     * Deletes a Virtual Circuit from an SDX-L2.
     *
     * @param sdxl2cplhs name of SDX-L2 CP, left hand side of the VC
     * @param sdxl2cprhs name of SDX-L2 CP, right hand side of the VC
     */
    void removeVC(SdxL2ConnectionPoint sdxl2cplhs, SdxL2ConnectionPoint sdxl2cprhs);

    /**
     * Deletes a Virtual Circuit where a given SDX-L2 CP acts as endpoint.
     *
     * @param cp Connection Point
     */
    void removeVC(SdxL2ConnectionPoint cp);

    /**
     * Removes all Virtual Circuits created in a given SDX-L2.
     *
     * @param sdxl2 name of SDX-L2
     */
    void removeVCs(String sdxl2);

    /**
     * Returns Virtual Circuits (either all or those created in a given SDX-L2).
     *
     * @param sdxl2 name of SDX-L2
     * @return the set of virtual circuits name
     */
    Set<String> getVCs(Optional<String> sdxl2);

    /**
     * Returns an encoded Virtual Circuit in a given SDX-L2.
     *
     * @param lhs left hand side of the VC
     * @param rhs right hand side of the VC
     * @return encoded VC
     */
    String getVC(SdxL2ConnectionPoint lhs, SdxL2ConnectionPoint rhs);
}
