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

import java.util.Objects;

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

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

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

    private OpenstackSecurityGroupRule(String direction,
                                       String ethertype,
                                       String id,
                                       String portRangeMax,
                                       String portRangeMin,
                                       String protocol,
                                       String remoteGroupId,
                                       String 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;
    }

    @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.equals(that.portRangeMax) &&
                    this.portRangeMin.equals(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() {
            return new OpenstackSecurityGroupRule(direction, etherType, id, portRangeMax,
                    portRangeMin, protocol, remoteGroupId, remoteIpPrefix, secuityGroupId, tenantId);
        }
    }
}
