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

import java.util.List;

/**
 * Abstraction of an entity providing Port Pair Group information.
 * A port pair group consists of one or more port pairs.
 */
public interface PortPairGroup {

    /**
     * Returns the ID of this port pair group.
     *
     * @return the port pair group id
     */
    PortPairGroupId portPairGroupId();

    /**
     * Returns the tenant id of this port pair group.
     *
     * @return the tenant id
     */
    TenantId tenantId();

    /**
     * Returns the name of this port pair group.
     *
     * @return name of port pair group
     */
    String name();

    /**
     * Returns the description of this port pair group.
     *
     * @return description of port pair group
     */
    String description();

    /**
     * Returns the list of port pairs associated with this port pair group.
     *
     * @return list of port pairs
     */
    List<PortPairId> portPairs();

    /**
     * Adds the load on the given port pair id.
     *
     * @param portPairId port pair id.
     */
    public void addLoad(PortPairId portPairId);

    /**
     * Get the load on the given port pair id.
     *
     * @param portPairId port pair id
     * @return load on the given port pair id.
     */
    public int getLoad(PortPairId portPairId);

    /**
     * Returns whether this port pair group is an exact match to the
     * port pair group given in the argument.
     * <p>
     * Exact match means the Port pairs match with the given port pair group.
     * It does not consider the port pair group id, name and description.
     * </p>
     * @param portPairGroup other port pair group to match against
     * @return true if the port pairs are an exact match, otherwise false
     */
    boolean exactMatch(PortPairGroup portPairGroup);

    /**
     * A port pair group builder..
     */
    interface Builder {

        /**
         * Assigns the port pair group id to this object.
         *
         * @param portPairGroupId the port pair group id
         * @return this the builder object
         */
        Builder setId(PortPairGroupId portPairGroupId);

        /**
         * Assigns tenant id to this object.
         *
         * @param tenantId tenant id of port pair group
         * @return this the builder object
         */
        Builder setTenantId(TenantId tenantId);

        /**
         * Assigns the name to this object.
         *
         * @param name name of the port pair group
         * @return this the builder object
         */
        Builder setName(String name);

        /**
         * Assigns the description to this object.
         *
         * @param description description of the port pair group
         * @return this the builder object
         */
        Builder setDescription(String description);

        /**
         * Assigns the port pairs associated with the port pair group
         * to this object.
         *
         * @param portPairs list of port pairs
         * @return this the builder object
         */
        Builder setPortPairs(List<PortPairId> portPairs);

        /**
         * Builds a port pair group object.
         *
         * @return a port pair group object.
         */
        PortPairGroup build();
    }
}
