/*
 * Copyright 2017-present Open Networking Foundation
 *
 * 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.openstacknetworking.api;

import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;

/**
 * Representation of virtual instance port.
 */
public interface InstancePort {

    /**
     * List of instance port states.
     */
    enum State {

        /**
         * Signifies that the given instance port is in active state.
         */
        ACTIVE,

        /**
         * Signifies that the given instance port is in inactive state due to
         * host termination.
         */
        INACTIVE,

        /**
         * Signifies that the given instance port is in pending removal state.
         */
        PENDING_REMOVAL,

        /**
         * Signifies that the given instance port is in migrating state.
         */
        MIGRATING,

        /**
         * Signifies that the given instance port will be removed soon.
         */
        REMOVED,

        /**
         * Signifies that the given instance port has been migrated.
         */
        MIGRATED,
    }

    /**
     * Returns the OpenStack network ID of the instance port.
     *
     * @return openstack network id
     */
    String networkId();

    /**
     * Returns the OpenStack port ID of a given host.
     *
     * @return openstack port id
     */
    String portId();

    /**
     * Returns the MAC address of the instance port.
     *
     * @return mac address
     */
    MacAddress macAddress();

    /**
     * Returns the IP address of the instance port.
     *
     * @return ip address
     */
    IpAddress ipAddress();

    /**
     * Returns the device ID of the instance port.
     *
     * @return device id
     */
    DeviceId deviceId();

    /**
     * Returns the old device ID of the instance port.
     * This method returns valid value only if the VM is in migration phase.
     *
     * @return device id
     */
    DeviceId oldDeviceId();

    /**
     * Returns the port number of the instance port.
     *
     * @return port number
     */
    PortNumber portNumber();

    /**
     * Returns the old port number of the instance port.
     * This method returns valid value only if the VM is in migration phase.
     *
     * @return port number
     */
    PortNumber oldPortNumber();

    /**
     * Returns the state of the instance port.
     *
     * @return state of port
     */
    State state();

    /**
     * Returns new instance port instance with given state.
     *
     * @param newState updated state
     * @return updated instance port
     */
    InstancePort updateState(State newState);

    /**
     * Returns new instance port instance with given prev data.
     *
     * @param oldDeviceId       old device ID
     * @param oldPortNumber     old port number
     * @return updated instance port
     */
    InstancePort updatePrevData(DeviceId oldDeviceId, PortNumber oldPortNumber);

    /**
     * Builder of new instance port.
     */
    interface Builder {

        /**
         * Builds an immutable instance port instance.
         *
         * @return instance port
         */
        InstancePort build();

        /**
         * Returns instance port builder with supplied network identifier.
         *
         * @param networkId network identifier
         * @return instance port builder
         */
        Builder networkId(String networkId);

        /**
         * Returns instance port builder with supplied port identifier.
         *
         * @param portId port identifier
         * @return instance port builder
         */
        Builder portId(String portId);

        /**
         * Returns instance port builder with supplied Mac Address.
         *
         * @param macAddress MAC address
         * @return instance port builder
         */
        Builder macAddress(MacAddress macAddress);

        /**
         * Returns instance port builder with supplied IP Address.
         *
         * @param ipAddress IP address
         * @return instance port builder
         */
        Builder ipAddress(IpAddress ipAddress);

        /**
         * Returns instance port builder with supplied Device identifier.
         *
         * @param deviceId device identifier
         * @return instance port builder
         */
        Builder deviceId(DeviceId deviceId);

        /**
         * Returns instance port builder with supplied old Device identifier.
         *
         * @param oldDeviceId device identifier
         * @return instance port builder
         */
        Builder oldDeviceId(DeviceId oldDeviceId);

        /**
         * Returns instance port builder with supplied port number.
         *
         * @param portNumber port number
         * @return instance port builder
         */
        Builder portNumber(PortNumber portNumber);

        /**
         * Returns instance port builder with supplied old port number.
         *
         * @param oldPortNumber port number
         * @return instance port builder
         */
        Builder oldPortNumber(PortNumber oldPortNumber);

        /**
         * Returns instance port builder with supplied state.
         *
         * @param state state
         * @return instance port builder
         */
        Builder state(State state);
    }
}
