/*******************************************************************************
 * Copyright 2017 General Electric Company
 *
 * 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.
 *
 * SPDX-License-Identifier: Apache-2.0
 *******************************************************************************/

package com.ge.predix.acs.rest;

import java.util.LinkedHashSet;
import java.util.Set;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

import com.ge.predix.acs.model.Attribute;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@SuppressWarnings({ "javadoc", "nls" })
@ApiModel(description = "Policy evaluation request for V1.")
public class PolicyEvaluationRequestV1 {

    @Deprecated
    public static final LinkedHashSet<String> EMPTY_POLICY_EVALUATION_ORDER = new LinkedHashSet<>();

    private String resourceIdentifier;

    private String subjectIdentifier;

    private Set<Attribute> subjectAttributes;

    private Set<Attribute> resourceAttributes;

    private String action;

    private LinkedHashSet<String> policySetsEvaluationOrder = new LinkedHashSet<>();

    @ApiModelProperty(value = "The resource URI to be consumed",
            required = true)
    public String getResourceIdentifier() {
        return this.resourceIdentifier;
    }

    public void setResourceIdentifier(final String resourceUri) {
        this.resourceIdentifier = resourceUri;
    }

    @ApiModelProperty(value = "The subject identifier",
            required = true)
    public String getSubjectIdentifier() {
        return this.subjectIdentifier;
    }

    public void setSubjectIdentifier(final String subjectIdentifier) {
        this.subjectIdentifier = subjectIdentifier;
    }

    @ApiModelProperty(value = "Supplemental resource attributes provided by the requestor")
    public Set<Attribute> getResourceAttributes() {
        return this.resourceAttributes;
    }

    public void setResourceAttributes(final Set<Attribute> resourceAttributes) {
        this.resourceAttributes = resourceAttributes;
    }

    /**
     * @return the subjectAttributes
     */
    @ApiModelProperty(value = "Supplemental subject attributes provided by the requestor")
    public Set<Attribute> getSubjectAttributes() {
        return this.subjectAttributes;
    }

    /**
     * @param subjectAttributes the subjectAttributes to set
     */
    public void setSubjectAttributes(final Set<Attribute> subjectAttributes) {
        this.subjectAttributes = subjectAttributes;
    }

    @ApiModelProperty(value = "The action on the given resource URI",
            required = true)
    public String getAction() {
        return this.action;
    }

    public void setAction(final String action) {
        this.action = action;
    }

    @ApiModelProperty(value =
            "This list of policy set IDs specifies the order in which the service will evaluate policies. "
                    + "Evaluation stops when a policy with matching target is found and the condition returns true, "
                    + "Or all policies are exhausted.")
    public LinkedHashSet<String> getPolicySetsEvaluationOrder() {
        return this.policySetsEvaluationOrder;
    }

    public void setPolicySetsEvaluationOrder(final LinkedHashSet<String> policySetIds) {
        if (policySetIds != null) {
            this.policySetsEvaluationOrder = policySetIds;
        }
    }

    @Override
    public int hashCode() {
        HashCodeBuilder hashCodeBuilder = new HashCodeBuilder();
        hashCodeBuilder.append(this.action).append(this.resourceIdentifier).append(this.subjectIdentifier);
        if (null != this.subjectAttributes) {
            for (Attribute attribute : this.subjectAttributes) {
                hashCodeBuilder.append(attribute);
            }
        }
        for (String policyID : this.policySetsEvaluationOrder) {
            hashCodeBuilder.append(policyID);
        }
        return hashCodeBuilder.toHashCode();
    }

    @Override
    public boolean equals(final Object obj) {

        if (obj instanceof PolicyEvaluationRequestV1) {
            final PolicyEvaluationRequestV1 other = (PolicyEvaluationRequestV1) obj;
            EqualsBuilder equalsBuilder = new EqualsBuilder();

            // Element by element comparison may produce true negative in Sets so use built in equals
            // From AbstractSet's (HashSet's ancestor) documentation
            // This implementation first checks if the specified object is this set; if so it returns true.
            // Then, it checks if the specified object is a set whose size is identical to the size of this set;
            // if not, it returns false. If so, it returns containsAll((Collection) o).
            equalsBuilder.append(this.subjectAttributes, other.subjectAttributes);
            equalsBuilder.append(this.policySetsEvaluationOrder, other.policySetsEvaluationOrder);

            equalsBuilder.append(this.action, other.action).append(this.resourceIdentifier, other.resourceIdentifier)
                    .append(this.subjectIdentifier, other.subjectIdentifier);
            return equalsBuilder.isEquals();
        }
        return false;
    }

    @Override
    public String toString() {
        return "PolicyEvaluationRequest [resourceIdentifier=" + this.resourceIdentifier + ", subjectIdentifier="
                + this.subjectIdentifier + ", action=" + this.action + "]";
    }

}
