/*
 * 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.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();

    /**
     * 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();
    }
}
