/*
 * Copyright 2019-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.k8snode.api;

import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onosproject.k8snode.api.K8sApiConfig.Mode;
import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;

/**
 * Representation of a node used in k8s-networking service.
 */
public interface K8sNode {

    /**
     * Lists of kubernetes node types.
     */
    enum Type {
        /**
         * Signifies that this is a kubernetes master node.
         */
        MASTER,

        /**
         * Signifies that this is a kubernetes minion node.
         */
        MINION,
    }

    /**
     * Returns cluster name of the node.
     *
     * @return cluster name
     */
    String clusterName();

    /**
     * Returns host short name.
     *
     * @return host short name
     */
    String hostShortName();

    /**
     * Returns a unique string with the given length and string.
     *
     * @param length target string length
     * @return a unique string
     */
    String uniqueString(int length);

    /**
     * Returns the segmentation ID.
     *
     * @return segmentation ID
     */
    int segmentId();

    /**
     * Returns the key of VXLAN/GRE/GENEVE tunnel.
     *
     * @return key of various tunnel
     */
    String tunnelKey();

    /**
     * Returns the CNI running mode.
     *
     * @return CNI running mode
     */
    Mode mode();

    /**
     * Returns hostname of the node.
     *
     * @return hostname
     */
    String hostname();

    /**
     * Returns the type of the node.
     *
     * @return node type
     */
    Type type();

    /**
     * Returns the OVSDB device ID of the node.
     *
     * @return ovsdb device id
     */
    DeviceId ovsdb();

    /**
     * Returns the device ID of the integration bridge at the node.
     *
     * @return device id
     */
    DeviceId intgBridge();

    /**
     * Returns the device ID of the external bridge at the node.
     *
     * @return device id
     */
    DeviceId extBridge();

    /**
     * Returns the device ID of the local bridge at the node.
     *
     * @return device id
     */
    DeviceId localBridge();

    /**
     * Returns the device ID of the tunnel bridge at the node.
     *
     * @return device id
     */
    DeviceId tunBridge();

    /**
     * Returns the external interface name.
     *
     * @return external interface name
     */
    String extIntf();

    /**
     * Returns new kubernetes node instance with given integration bridge.
     *
     * @param deviceId  integration bridge device ID
     * @return updated kubernetes node
     */
    K8sNode updateIntgBridge(DeviceId deviceId);

    /**
     * Returns new kubernetes node instance with given external bridge.
     *
     * @param deviceId external bridge device ID
     * @return updated kubernetes node
     */
    K8sNode updateExtBridge(DeviceId deviceId);

    /**
     * Returns new kubernetes node instance with given local bridge.
     *
     * @param deviceId local bridge device ID
     * @return updated kubernetes node
     */
    K8sNode updateLocalBridge(DeviceId deviceId);

    /**
     * Returns new kubernetes node instance with given tun bridge.
     *
     * @param deviceId tunnel bridge device ID
     * @return updated kubernetes node
     */
    K8sNode updateTunBridge(DeviceId deviceId);

    /**
     * Returns the management network IP address of the node.
     *
     * @return ip address
     */
    IpAddress managementIp();

    /**
     * Returns the data network IP address used for tunneling.
     *
     * @return ip address; null if vxlan mode is not enabled
     */
    IpAddress dataIp();

    /**
     * Returns the initialization state of the node.
     *
     * @return node state
     */
    K8sNodeState state();

    /**
     * Returns the POD CIDR of the node.
     *
     * @return POD CIDR (e.g., 10.10.0.0/24)
     */
    String podCidr();

    /**
     * Returns new kubernetes node instance with given state.
     *
     * @param newState updated state
     * @return updated kubernetes node
     */
    K8sNode updateState(K8sNodeState newState);

    /**
     * Returns new kubernetes node instance with given external gateway MAC address.
     *
     * @param macAddress updated MAC address
     * @return updated kubernetes node
     */
    K8sNode updateExtGatewayMac(MacAddress macAddress);

    /**
     * Returns GRE port name.
     *
     * @return GRE port name
     */
    String grePortName();

    /**
     * Returns VXLAN port name.
     *
     * @return VXLAN port name
     */
    String vxlanPortName();

    /**
     * Returns GENEVE port name.
     *
     * @return GENEVE port name
     */
    String genevePortName();

    /**
     * Returns integration bridge name.
     *
     * @return integration bridge name
     */
    String intgBridgeName();

    /**
     * Returns external bridge name.
     *
     * @return external bridge name
     */
    String extBridgeName();

    /**
     * Returns local bridge name.
     *
     * @return local bridge name
     */
    String localBridgeName();

    /**
     * Returns tun bridge name.
     *
     * @return tun bridge name
     */
    String tunBridgeName();

    /**
     * Returns integration bridge port name.
     *
     * @return integration bridge port name
     */
    String intgBridgePortName();

    /**
     * Returns external bridge port name.
     *
     * @return external bridge port name
     */
    String extBridgePortName();

    /**
     * Returns local bridge port name.
     *
     * @return local bridge port name
     */
    String localBridgePortName();

    /**
     * Returns tunnel bridge port name.
     *
     * @return tunnel bridge port name
     */
    String tunBridgePortName();

    /**
     * Returns integration to external patch port name.
     *
     * @return integration to external patch port name
     */
    String intgToExtPatchPortName();

    /**
     * Returns integration to tunnel patch port name.
     *
     * @return integration to tunnel patch port name
     */
    String intgToTunPatchPortName();

    /**
     * Returns integration to local patch port name.
     *
     * @return integration to local patch port name
     */
    String intgToLocalPatchPortName();

    /**
     * Returns local to integration patch port name.
     *
     * @return local to integration patch port name
     */
    String localToIntgPatchPortName();

    /**
     * Returns external to integration patch port name.
     *
     * @return external to integration patch port name
     */
    String extToIntgPatchPortName();

    /**
     * Returns tunnel to integration patch port name.
     *
     * @return tunnel to integration patch port name
     */
    String tunToIntgPatchPortName();

    /**
     * Returns the GRE tunnel port number.
     *
     * @return GRE port number; null if the GRE tunnel port does not exist
     */
    PortNumber grePortNum();

    /**
     * Returns the VXLAN tunnel port number.
     *
     * @return VXLAN port number; null if tunnel port does not exist
     */
    PortNumber vxlanPortNum();

    /**
     * Returns the GENEVE tunnel port number.
     *
     * @return GENEVE port number; null if the GRE tunnel port does not exist
     */
    PortNumber genevePortNum();

    /**
     * Returns the host port number.
     *
     * @return host port number; null if the host port does not exist
     */
    PortNumber intgBridgePortNum();

    /**
     * Returns the integration to external patch port number.
     *
     * @return patch port number
     */
    PortNumber intgToExtPatchPortNum();

    /**
     * Returns the integration to local patch port number.
     *
     * @return patch port number
     */
    PortNumber intgToLocalPatchPortNum();

    /**
     * Returns the local to integration patch port number.
     *
     * @return patch port number
     */
    PortNumber localToIntgPatchPortNum();

    /**
     * Returns the external to integration patch port number.
     *
     * @return patch port number
     */
    PortNumber extToIntgPatchPortNum();

    /**
     * Returns the integration to tunnel patch port number.
     *
     * @return patch port number
     */
    PortNumber intgToTunPortNum();

    /**
     * Returns the tunnel to integration patch port number.
     *
     * @return patch port number
     */
    PortNumber tunToIntgPortNum();

    /**
     * Returns the external bridge to router port number.
     *
     * @return port number, null if the port does not exist
     */
    PortNumber extBridgePortNum();

    /**
     * Returns the external interface (attached to external bridge) port number.
     *
     * @return port number, null if the port does ont exist
     */
    PortNumber extIntfPortNum();

    /**
     * Returns the integration bridge's MAC address.
     *
     * @return MAC address; null if the MAC address does not exist
     */
    MacAddress intgBridgeMac();

    /**
     * Returns the external bridge's IP address.
     *
     * @return IP address; null if the IP address does not exist
     */
    IpAddress extBridgeIp();

    /**
     * Returns the external bridge's MAC address.
     *
     * @return MAC address; null if the MAC address does not exist
     */
    MacAddress extBridgeMac();

    /**
     * Returns the external gateway IP address.
     *
     * @return IP address; null if the IP address does not exist
     */
    IpAddress extGatewayIp();

    /**
     * Returns the external gateway MAC address.
     *
     * @return MAC address; null if the MAC address does not exist
     */
    MacAddress extGatewayMac();

    /**
     * Builder of new node entity.
     */
    interface Builder {

        /**
         * Builds an immutable kubernetes node instance.
         *
         * @return kubernetes node instance
         */
        K8sNode build();

        /**
         * Returns kubernetes node builder with supplied cluster name.
         *
         * @param clusterName cluster name
         * @return kubernetes node builder
         */
        Builder clusterName(String clusterName);

        /**
         * Returns kubernetes node builder with supplied hostname.
         *
         * @param hostname hostname of the node
         * @return kubernetes node builder
         */
        Builder hostname(String hostname);

        /**
         * Returns kubernetes node builder with supplied type.
         *
         * @param type kubernetes node type
         * @return kubernetes node builder
         */
        Builder type(Type type);

        /**
         * Returns kubernetes node builder with supplied segment ID.
         *
         * @param segmentId kubernetes node segment ID
         * @return kubernetes node builder
         */
        Builder segmentId(int segmentId);

        /**
         * Return kubernetes node builder with supplied mode.
         *
         * @param mode kubernetes CNI running mode
         * @return kubernetes node builder
         */
        Builder mode(Mode mode);

        /**
         * Returns kubernetes node builder with supplied integration bridge name.
         *
         * @param deviceId integration bridge device ID
         * @return kubernetes node builder
         */
        Builder intgBridge(DeviceId deviceId);

        /**
         * Returns kubernetes node builder with supplied external bridge name.
         *
         * @param deviceId external bridge device ID
         * @return kubernetes node builder
         */
        Builder extBridge(DeviceId deviceId);

        /**
         * Returns kubernetes node builder with supplied local bridge name.
         *
         * @param deviceId local bridge device ID
         * @return kubernetes node builder
         */
        Builder localBridge(DeviceId deviceId);

        /**
         * Returns kubernetes node builder with supplied tunnel bridge name.
         *
         * @param deviceId tunnel bridge device ID
         * @return kubernetes node builder
         */
        Builder tunBridge(DeviceId deviceId);

        /**
         * Returns kubernetes node builder with supplied external interface.
         *
         * @param intf external interface
         * @return kubernetes node builder
         */
        Builder extIntf(String intf);

        /**
         * Returns kubernetes node builder with supplied management IP address.
         *
         * @param managementIp management IP address
         * @return kubernetes node builder
         */
        Builder managementIp(IpAddress managementIp);

        /**
         * Returns kubernetes node builder with supplied data IP address.
         *
         * @param dataIp data IP address
         * @return kubernetes node builder
         */
        Builder dataIp(IpAddress dataIp);

        /**
         * Returns kubernetes node builder with supplied node state.
         *
         * @param state kubernetes node state
         * @return kubernetes node builder
         */
        Builder state(K8sNodeState state);

        /**
         * Returns kubernetes node builder with supplied external bridge IP.
         *
         * @param extBridgeIp external bridge IP
         * @return kubernetes node builder
         */
        Builder extBridgeIp(IpAddress extBridgeIp);

        /**
         * Returns kubernetes node builder with supplied gateway IP.
         *
         * @param extGatewayIp external gateway IP
         * @return kubernetes node builder
         */
        Builder extGatewayIp(IpAddress extGatewayIp);

        /**
         * Returns kubernetes node builder with supplied external gateway MAC.
         *
         * @param extGatewayMac external gateway MAC address
         * @return kubernetes node builder
         */
        Builder extGatewayMac(MacAddress extGatewayMac);

        /**
         * Returns kubernetes node builder with supplied POD CIDR.
         *
         * @param podCidr POD CIDR
         * @return kubernetes node builder
         */
        Builder podCidr(String podCidr);
    }
}
