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

import java.util.Collection;

import org.onlab.packet.IpAddress;
import org.onosproject.vtnrsc.FloatingIp;
import org.onosproject.vtnrsc.FloatingIpId;
import org.onosproject.vtnrsc.TenantId;

/**
 * Service for interacting with the inventory of floating IP.
 */
public interface FloatingIpService {
    /**
     * Returns exists or not of specific floatingIp identifier.
     *
     * @param floatingIpId floatingIp identifier
     * @return true or false
     */
    boolean exists(FloatingIpId floatingIpId);

    /**
     * Returns is used or not of specific floating IP address.
     *
     * @param floatingIpAddr floatingIp address
     * @param floatingIpId floatingIp identifier
     * @return true or false
     */
    boolean floatingIpIsUsed(IpAddress floatingIpAddr, FloatingIpId floatingIpId);

    /**
     * Returns is used or not of specific fixed IP address.
     *
     * @param fixedIpAddr fixedIp address
     * @param tenantId the tenant identifier of floating IP
     * @param floatingIpId floatingIp identifier
     * @return true or false
     */
    boolean fixedIpIsUsed(IpAddress fixedIpAddr, TenantId tenantId, FloatingIpId floatingIpId);

    /**
     * Returns a collection of the currently known floating IP.
     *
     * @return collection of floating IP
     */
    Collection<FloatingIp> getFloatingIps();

    /**
     * Returns the floatingIp with the specified identifier.
     *
     * @param floatingIpId floatingIp identifier
     * @return floatingIp or null if one with the given identifier is not known
     */
    FloatingIp getFloatingIp(FloatingIpId floatingIpId);

    /**
     * Creates new floatingIps.
     *
     * @param floatingIps the collection of floatingIp
     * @return true if the identifier floatingIp has been created right
     */
    boolean createFloatingIps(Collection<FloatingIp> floatingIps);

    /**
     * Updates existing floatingIps.
     *
     * @param floatingIps the collection of floatingIp
     * @return true if all floatingIp were updated successfully
     */
    boolean updateFloatingIps(Collection<FloatingIp> floatingIps);

    /**
     * Removes the specified floatingIp from the store.
     *
     * @param floatingIpIds the collection of floatingIp identifier
     * @return true if remove identifier floatingIp successfully
     */
    boolean removeFloatingIps(Collection<FloatingIpId> floatingIpIds);

    /**
     * Adds the specified listener to floating Ip manager.
     *
     * @param listener floating Ip listener
     */
    void addListener(FloatingIpListener listener);

    /**
     * Removes the specified listener to floating Ip manager.
     *
     * @param listener floating Ip listener
     */
    void removeListener(FloatingIpListener listener);
}
