/*
 * Copyright 2016-present 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.opencord.cordvtn.api.net;

import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
import org.openstack4j.model.network.Port;

import java.util.Comparator;
import java.util.Objects;
import java.util.Set;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;

/**
 * Representation of a port holding the basic virtual port and additional service
 * port specific information.
 * All the services making use of CordVtnService are intended to interface
 * with this VtnPort, and not allowed to directly access {@link Port} or
 * {@link ServicePort}.
 */
public final class VtnPort extends ServicePort {

    private static final String ERR_IP_MISSING = "VTN port IP address is missing";

    private final NetworkId netId;
    private final MacAddress mac;
    private final IpAddress ip;

    private VtnPort(PortId id,
                    NetworkId netId,
                    MacAddress mac,
                    IpAddress ip,
                    VlanId vlanId,
                    Set<AddressPair> addressPairs) {
        super(id, vlanId, addressPairs);
        this.netId = netId;
        this.mac = mac;
        this.ip = ip;
    }

    public static final Comparator<VtnPort> VTN_PORT_COMPARATOR =
            (port1, port2) -> port1.netId().id().compareTo(port2.netId().id());

    /**
     * Returns the network ID of this port.
     *
     * @return network id
     */
    public NetworkId netId() {
        return netId;
    }

    /**
     * Returns the MAC address of this port.
     *
     * @return mac address
     */
    public MacAddress mac() {
        return mac;
    }

    /**
     * Returns the IP address of this port.
     *
     * @return ip address
     */
    public IpAddress ip() {
        return ip;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj instanceof VtnPort) {
            VtnPort that = (VtnPort) obj;
            if (Objects.equals(id, that.id) &&
                    Objects.equals(netId, that.netId) &&
                    Objects.equals(mac, that.mac) &&
                    Objects.equals(ip, that.ip) &&
                    Objects.equals(vlanId, that.vlanId) &&
                    Objects.equals(addressPairs, that.addressPairs)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, netId, mac, ip, vlanId, addressPairs);
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass())
                .add("id", id)
                .add("netId", netId)
                .add("mac", mac)
                .add("ip", ip)
                .add("vlanId", vlanId)
                .add("addressPairs", addressPairs)
                .toString();
    }

    /**
     * Returns the immutable VTN port with the supplied Neutron port with additional
     * vtn port information.
     *
     * @param port        neutron port
     * @param servicePort vtn port
     * @return vtn port
     */
    public static VtnPort of(Port port, ServicePort servicePort) {
        validateNeutronPort(port);
        if (servicePort != null) {
            checkArgument(Objects.equals(port.getId(), servicePort.id().id()));
        }

        return builder().id(PortId.of(port.getId()))
                .netId(NetworkId.of(port.getNetworkId()))
                .mac(MacAddress.valueOf(port.getMacAddress()))
                .ip(IpAddress.valueOf(port.getFixedIps().iterator().next().getIpAddress()))
                .vlanId(servicePort == null ? null : servicePort.vlanId().orElse(null))
                .addressPairs(servicePort == null ? ImmutableSet.of() : servicePort.addressPairs())
                .build();
    }

    private static void validateNeutronPort(Port port) {
        checkNotNull(port);
        checkArgument(port.getFixedIps().size() > 0, ERR_IP_MISSING);
    }

    /**
     * Returns the immutable VTN port with the supplied VTN port with additional
     * vtn port information.
     *
     * @param vtnPort     vtn port
     * @param servicePort vtn port
     * @return vtn port
     */
    public static VtnPort of(VtnPort vtnPort, ServicePort servicePort) {
        return builder(vtnPort)
                .vlanId(servicePort.vlanId().orElse(null))
                .addressPairs(servicePort.addressPairs())
                .build();
    }

    /**
     * Returns new vtn port builder instance.
     *
     * @return vtn port builder
     */
    public static Builder builder() {
        return new Builder();
    }

    /**
     * Returns new vtn port builder instance with copy of the supplied vtn port.
     *
     * @param vtnPort vtn port
     * @return vtn port builder
     */
    public static Builder builder(VtnPort vtnPort) {
        return new Builder().id(vtnPort.id())
                .netId(vtnPort.netId())
                .mac(vtnPort.mac())
                .ip(vtnPort.ip())
                .vlanId(vtnPort.vlanId().orElse(null))
                .addressPairs(vtnPort.addressPairs());
    }

    /**
     * Builder of the vtn port entities.
     */
    public static final class Builder {
        private PortId id;
        private NetworkId netId;
        private MacAddress mac;
        private IpAddress ip;
        private VlanId vlanId;
        private Set<AddressPair> addressPairs = ImmutableSet.of();

        private Builder() {
        }

        /**
         * Builds an immutable vtn port.
         *
         * @return vtn port instance
         */
        public VtnPort build() {
            checkNotNull(id, "VtnPort port id cannot be null");
            checkNotNull(netId, "VtnPort network id cannot be null");
            checkNotNull(mac, "VtnPort mac address cannot be null");
            checkNotNull(ip, "VtnPort ip address cannot be null");
            addressPairs = addressPairs == null ? ImmutableSet.of() : addressPairs;

            return new VtnPort(id, netId, mac, ip, vlanId, addressPairs);
        }

        /**
         * Returns vtn port builder with the supplied port id.
         *
         * @param id port id
         * @return vtn port builder
         */
        public Builder id(PortId id) {
            this.id = id;
            return this;
        }

        /**
         * Returns vtn port builder with the supplied network id.
         *
         * @param netId network id
         * @return vtn port builder
         */
        public Builder netId(NetworkId netId) {
            this.netId = netId;
            return this;
        }

        /**
         * Returns vtn port builder with the supplied mac address.
         *
         * @param mac mac address
         * @return vtn port builder
         */
        public Builder mac(MacAddress mac) {
            this.mac = mac;
            return this;
        }

        /**
         * Returns vtn port builder with the supplied ip address.
         *
         * @param ip ip address
         * @return vtn port builder
         */
        public Builder ip(IpAddress ip) {
            this.ip = ip;
            return this;
        }

        /**
         * Returns vtn port builder with the supplied VLAN ID.
         *
         * @param vlanId vlan id
         * @return vtn port builder
         */
        public Builder vlanId(VlanId vlanId) {
            this.vlanId = vlanId;
            return this;
        }

        /**
         * Returns vtn port builder with the supplied address pairs.
         *
         * @param addressPairs set of address pairs
         * @return vtn port builder
         */
        public Builder addressPairs(Set<AddressPair> addressPairs) {
            this.addressPairs = addressPairs;
            return this;
        }

        /**
         * Returns vtn port builder with the given additional address pair.
         *
         * @param addressPair address pair to add
         * @return vtn port builder
         */
        public Builder addAddressPair(AddressPair addressPair) {
            checkNotNull(addressPair, "VtnPort address pair cannot be null");

            Set<AddressPair> updated = Sets.newHashSet(this.addressPairs);
            updated.add(addressPair);
            this.addressPairs = ImmutableSet.copyOf(updated);
            return this;
        }
    }
}
