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

import org.onosproject.vtnrsc.PortPairGroup;
import org.onosproject.vtnrsc.PortPairGroupId;

/**
 * Service for interacting with the inventory of port pair groups.
 */
public interface PortPairGroupService {

    /**
     * Returns if the port pair group is existed.
     *
     * @param portPairGroupId port pair group identifier
     * @return true or false if one with the given identifier exists.
     */
    boolean exists(PortPairGroupId portPairGroupId);

    /**
     * Returns the number of port pair groups known to the system.
     *
     * @return number of port pair groups.
     */
    int getPortPairGroupCount();

    /**
     * Returns an iterable collection of the currently known port pair groups.
     *
     * @return collection of port pair groups.
     */
    Iterable<PortPairGroup> getPortPairGroups();

    /**
     * Returns the portPairGroup with the given identifier.
     *
     * @param portPairGroupId port pair group identifier
     * @return PortPairGroup or null if port pair group with the given identifier is not
     *         known.
     */
    PortPairGroup getPortPairGroup(PortPairGroupId portPairGroupId);

    /**
     * Creates a PortPairGroup in the store.
     *
     * @param portPairGroup the port pair group to create
     * @return true if given port pair group is created successfully.
     */
    boolean createPortPairGroup(PortPairGroup portPairGroup);

    /**
     * Updates the portPairGroup in the store.
     *
     * @param portPairGroup the port pair group to update
     * @return true if given port pair group is updated successfully.
     */
    boolean updatePortPairGroup(PortPairGroup portPairGroup);

    /**
     * Deletes portPairGroup by given portPairGroupId.
     *
     * @param portPairGroupId id of port pair group to remove
     * @return true if the give port pair group is deleted successfully.
     */
    boolean removePortPairGroup(PortPairGroupId portPairGroupId);

    /**
     * Adds the specified listener to Port-Pair-Group manager.
     *
     * @param listener Port-Pair-Group listener
     */
    void addListener(PortPairGroupListener listener);

    /**
     * Removes the specified listener to Port-Pair-Group manager.
     *
     * @param listener Port-Pair-Group listener
     */
    void removeListener(PortPairGroupListener listener);
}
