/*
 * Copyright 2016 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.openstacknetworking;

import org.onlab.packet.Ip4Address;

import java.util.Objects;

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

/**
 *  An Openstack Neutron Floating IP Model.
 */
public final class OpenstackFloatingIP {

    public enum FloatingIpStatus {
        UP,
        DOWN,
        ACTIVE,
    }

    private final String tenantId;
    private final String networkId;
    private final Ip4Address fixedIpAddress;
    private String portId;
    private String routerId;
    private final String id;
    private final Ip4Address floatingIpAddress;
    private final FloatingIpStatus status;

    private OpenstackFloatingIP(FloatingIpStatus status, String id, String tenantId,
                                String networkId, Ip4Address fixedIpAddress, String portId,
                                String routerId, Ip4Address floatingIpAddress) {
        this.status = status;
        this.id = id;
        this.tenantId = tenantId;
        this.networkId = networkId;
        this.fixedIpAddress = fixedIpAddress;
        this.portId = portId;
        this.routerId = routerId;
        this.floatingIpAddress = floatingIpAddress;
    }

    /**
     * Returns floating IP status.
     *
     * @return floating IP status
     */
    public FloatingIpStatus status() {
        return status;
    }

    /**
     * Returns floating IP`s ID.
     *
     * @return floating IP`s ID
     */
    public String id() {
        return id;
    }

    /**
     * Returns tenant ID.
     *
     * @return tenant ID
     */
    public String tenantId() {
        return tenantId;
    }

    /**
     * Returns network ID.
     *
     * @return network ID
     */
    public String networkId() {
        return networkId;
    }

    /**
     * Returns fixed IP Address.
     *
     * @return fixed IP Address
     */
    public Ip4Address fixedIpAddress() {
        return fixedIpAddress;
    }

    /**
     * Returns port ID.
     *
     * @return port ID
     */
    public String portId() {
        return portId;
    }

    /**
     * Updates port ID.
     *
     * @param portId Updated port ID
     */
    public void updatePortId(String portId) {
        this.portId = portId;
    }

    /**
     * Returns router ID.
     *
     * @return router ID
     */
    public String routerId() {
        return routerId;
    }

    /**
     * Updates router ID.
     *
     * @param routerId Updated router ID
     */
    public void updateRouterId(String routerId) {
        this.routerId = routerId;
    }

    /**
     * Returns floating IP address.
     *
     * @return Floating IP address
     */
    public Ip4Address floatingIpAddress() {
        return floatingIpAddress;
    }

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

        if (o instanceof  OpenstackFloatingIP) {
            OpenstackFloatingIP that = (OpenstackFloatingIP) o;

            return this.status.equals(that.status) &&
                    this.id.equals(that.id) &&
                    this.tenantId.equals(that.tenantId) &&
                    this.networkId.equals(that.networkId) &&
                    this.fixedIpAddress.equals(that.fixedIpAddress) &&
                    this.floatingIpAddress.equals(that.floatingIpAddress) &&
                    this.portId.equals(that.portId) &&
                    this.routerId.equals(that.routerId);
        }

        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(status, id, tenantId, networkId, floatingIpAddress, fixedIpAddress, portId, routerId);
    }

    /**
     * An Openstack Floating IP Builder class.
     */
    public static final class Builder {
        private String tenantId;
        private String networkId;
        private Ip4Address fixedIpAddress;
        private String portId;
        private String routerId;
        private String id;
        private Ip4Address floatingIpAddress;
        private FloatingIpStatus status;

        /**
         * Sets tenant ID.
         *
         * @param tenantId tenant ID
         * @return Builder object
         */
        public Builder tenantId(String tenantId) {
            this.tenantId = tenantId;
            return this;
        }

        /**
         * Sets floating IP status.
         *
         * @param status Floating IP status
         * @return Builder object
         */
        public Builder status(FloatingIpStatus status) {
            this.status = status;
            return this;
        }

        /**
         * Sets Floating IP`s ID.
         *
         * @param id Floating IP`s ID
         * @return Builder object
         */
        public Builder id(String id) {
            this.id = id;
            return this;
        }

        /**
         * Sets network ID.
         *
         * @param networkId Network ID
         * @return Builder object
         */
        public Builder networkId(String networkId) {
            this.networkId = networkId;
            return this;
        }

        /**
         * Sets fixed IP address.
         *
         * @param fixedIpAddress Fixed IP address
         * @return Builder object
         */
        public Builder fixedIpAddress(Ip4Address fixedIpAddress) {
            this.fixedIpAddress = fixedIpAddress;
            return this;
        }

        /**
         * Sets port ID.
         *
         * @param portId port ID
         * @return Builder object
         */
        public Builder portId(String portId) {
            this.portId = portId;
            return this;
        }

        /**
         * Sets router ID.
         *
         * @param routerId router ID
         * @return Builder object
         */
        public Builder routerId(String routerId) {
            this.routerId = routerId;
            return this;
        }

        /**
         * Sets floating IP address.
         *
         * @param floatingIpAddress Floating IP address
         * @return Builder object
         */
        public Builder floatingIpAddress(Ip4Address floatingIpAddress) {
            this.floatingIpAddress = floatingIpAddress;
            return this;
        }

        /**
         * Builds an OpenstackFloatingIP object.
         *
         * @return OpenstackFloatingIP object
         */
        public OpenstackFloatingIP build() {
            return new OpenstackFloatingIP(checkNotNull(status), checkNotNull(id), checkNotNull(tenantId),
                    checkNotNull(networkId), fixedIpAddress, portId,
                    routerId, checkNotNull(floatingIpAddress));

        }
    }
}
