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

import org.onlab.packet.IpPrefix;

import java.util.Objects;

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

/**
 * Represents Openstack Security Group Rules.
 */
public final class OpenstackSecurityGroupRule {

    private final Direction direction;
    private final String ethertype;
    private final String id;
    private final int portRangeMax;
    private final int portRangeMin;
    private final String protocol;
    private final String remoteGroupId;
    private final IpPrefix remoteIpPrefix;
    private final String secuityGroupId;
    private final String tenantId;

    /**
     * Direction of the Security Group.
     *
     */
    public enum Direction {
        INGRESS,
        EGRESS
    }

    private OpenstackSecurityGroupRule(Direction direction,
                                       String ethertype,
                                       String id,
                                       int portRangeMax,
                                       int portRangeMin,
                                       String protocol,
                                       String remoteGroupId,
                                       IpPrefix remoteIpPrefix,
                                       String securityGroupId,
                                       String tenantId) {
        this.direction = direction;
        this.ethertype = ethertype;
        this.id = checkNotNull(id);
        this.portRangeMax = portRangeMax;
        this.portRangeMin = portRangeMin;
        this.protocol = protocol;
        this.remoteGroupId = remoteGroupId;
        this.remoteIpPrefix = remoteIpPrefix;
        this.secuityGroupId = securityGroupId;
        this.tenantId = tenantId;
    }

    /**
     * Returns the builder object for the OpenstackSecurityGroupRule.
     *
     * @return OpenstackSecurityGroupRule builder object
     */
    public static OpenstackSecurityGroupRule.Builder builder() {
        return new Builder();
    }

    /**
     * Returns the direction.
     *
     * @return direction
     */
    public Direction direction() {
        return direction;
    }

    /**
     * Returns the Ethernet type.
     *
     * @return Ethernet type
     */
    public String ethertype() {
        return ethertype;
    }

    /**
     * Returns the Security Group ID.
     *
     * @return Security Group ID
     */
    public String id() {
        return id;
    }

    /**
     * Returns the max of the port range.
     *
     * @return max of the port range
     */
    public int portRangeMax() {
        return portRangeMax;
    }

    /**
     * Returns the min of the port range.
     *
     * @return min of the port range
     */
    public int portRangeMin() {
        return portRangeMin;
    }

    /**
     * Returns the IP protocol.
     *
     * @return IP protocol
     */
    public String protocol() {
        return protocol;
    }

    /**
     * Returns the remote group ID.
     *
     * @return remote group ID
     */
    public String remoteGroupId() {
        return remoteGroupId;
    }

    /**
     * Returns the remote IP address.
     *
     * @return remote IP address
     */
    public IpPrefix remoteIpPrefix() {
        return this.remoteIpPrefix;
    }

    /**
     * Returns the Security Group ID.
     *
     * @return security group ID
     */
    public String secuityGroupId() {
        return secuityGroupId;
    }

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

    @Override
    public String toString() {
        return new StringBuilder(" [")
                .append(direction + ",")
                .append(ethertype + ",")
                .append(id + ",")
                .append(portRangeMax + ",")
                .append(portRangeMin + ",")
                .append(protocol + ",'")
                .append(remoteGroupId + ",")
                .append(remoteIpPrefix + ",")
                .append(secuityGroupId + ",")
                .append(tenantId + "] ")
                .toString();
    }

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

        if (this instanceof OpenstackSecurityGroupRule) {
            OpenstackSecurityGroupRule that = (OpenstackSecurityGroupRule) o;
            return this.direction.equals(that.direction) &&
                    this.ethertype.equals(that.direction) &&
                    this.id.equals(that.id) &&
                    this.portRangeMax == that.portRangeMax &&
                    this.portRangeMin == that.portRangeMin &&
                    this.protocol.equals(that.protocol) &&
                    this.remoteGroupId.equals(that.remoteGroupId) &&
                    this.secuityGroupId.equals(that.secuityGroupId) &&
                    this.remoteIpPrefix.equals(that.remoteIpPrefix) &&
                    this.tenantId.equals(that.tenantId);
        }

        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(direction, ethertype, id, portRangeMax, portRangeMin, protocol,
                remoteGroupId, remoteIpPrefix, secuityGroupId, tenantId);
    }

    /**
     * Represents a security group rule builder object.
     */
    public static final class Builder {

        private String direction;
        private String etherType;
        private String id;
        private String portRangeMax;
        private String portRangeMin;
        private String protocol;
        private String remoteGroupId;
        private String remoteIpPrefix;
        private String secuityGroupId;
        private String tenantId;


        /**
         * Sets the direction of the security group rule.
         *
         * @param direction direction (ingress or egress)
         * @return builder object
         */
        public Builder direction(String direction) {
            this.direction = direction;
            return this;
        }

        /**
         * Sets the Ethernet Type.
         *
         * @param etherType Ethernet Type
         * @return builder object
         */
        public Builder etherType(String etherType) {
            this.etherType = etherType;
            return this;
        }

        /**
         * Sets the Security Group Rule ID.
         *
         * @param id security group rule ID
         * @return builder object
         */
        public Builder id(String id) {
            this.id = id;
            return this;
        }

        /**
         * Sets the port range max value.
         *
         * @param portRangeMax port range max value
         * @return builder object
         */
        public Builder portRangeMax(String portRangeMax) {
            this.portRangeMax = portRangeMax;
            return this;
        }

        /**
         * Sets the port range min value.
         *
         * @param portRangeMin port range min value
         * @return builder object
         */
        public Builder portRangeMin(String portRangeMin) {
            this.portRangeMin = portRangeMin;
            return this;
        }

        /**
         * Sets the protocol.
         *
         * @param protocol protocol
         * @return builder object
         */
        public Builder protocol(String protocol) {
            this.protocol = protocol;
            return this;
        }

        /**
         * Sets the remote security group ID.
         *
         * @param remoteGroupId remote security group ID
         * @return builder
         */
        public Builder remoteGroupId(String remoteGroupId) {
            this.remoteGroupId = remoteGroupId;
            return this;
        }

        /**
         * Sets the remote IP address as prefix.
         *
         * @param remoteIpPrefix remote IP address
         * @return builder object
         */
        public Builder remoteIpPrefix(String remoteIpPrefix) {
            this.remoteIpPrefix = remoteIpPrefix;
            return this;
        }

        /**
         * Sets the Security Group ID.
         *
         * @param securityGroupId security group ID
         * @return builder object
         */
        public Builder securityGroupId(String securityGroupId) {
            this.secuityGroupId = securityGroupId;
            return this;
        }

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

        /**
         * Creates a OpenstackSecurityGroupRule instance.
         *
         * @return OpenstackSecurityGroupRule object
         */
        public OpenstackSecurityGroupRule build() {

            int portRangeMinInt = (portRangeMin == null || portRangeMin.equals("null")) ?
                    -1 : Integer.parseInt(portRangeMax);
            int portRangeMaxInt = (portRangeMax == null || portRangeMax.equals("null")) ?
                    -1 : Integer.parseInt(portRangeMax);
            IpPrefix ipPrefix = (remoteIpPrefix == null || remoteIpPrefix.equals("null")) ?
                    null : IpPrefix.valueOf(remoteIpPrefix);

            return new OpenstackSecurityGroupRule(Direction.valueOf(direction.toUpperCase()), etherType, id,
                    portRangeMaxInt, portRangeMinInt, protocol, remoteGroupId, ipPrefix, secuityGroupId, tenantId);
        }
    }
}
