/*
 * Copyright 2015-present Open Networking Foundation
 *
 * 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.segmentrouting.grouphandler;

import java.util.List;

/**
 * Representation of policy based group identifiers.
 * Opaque to group handler applications and only the outermost
 * policy group identifier in a chain is visible to the applications.
 */
public class PolicyGroupIdentifier {
    private String id;
    private List<PolicyGroupParams> inputParams;
    private List<GroupBucketIdentifier> bucketIds;

    /**
     * Constructs policy group identifier.
     *
     * @param id unique identifier associated with the policy group
     * @param input policy group params associated with this group
     * @param bucketIds buckets associated with this group
     */
    protected PolicyGroupIdentifier(String id,
                                 List<PolicyGroupParams> input,
                                 List<GroupBucketIdentifier> bucketIds) {
        this.id = id;
        this.inputParams = input;
        this.bucketIds = bucketIds;
    }

    /**
     * Returns the bucket identifier list associated with the policy
     * group identifier.
     *
     * @return list of bucket identifier
     */
    protected List<GroupBucketIdentifier> bucketIds() {
        return this.bucketIds;
    }

    @Override
    public int hashCode() {
        int result = 17;
        int combinedHash = 0;
        for (PolicyGroupParams input:inputParams) {
            combinedHash = combinedHash + input.hashCode();
        }
        for (GroupBucketIdentifier bucketId:bucketIds) {
            combinedHash = combinedHash + bucketId.hashCode();
        }
        result = 31 * result + combinedHash;

        return result;
    }

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

        if (obj instanceof PolicyGroupIdentifier) {
            PolicyGroupIdentifier that = (PolicyGroupIdentifier) obj;
            boolean result = this.id.equals(that.id);
            result = result &&
                    this.inputParams.containsAll(that.inputParams) &&
                    that.inputParams.containsAll(this.inputParams);
            result = result &&
                    this.bucketIds.containsAll(that.bucketIds) &&
                    that.bucketIds.containsAll(this.bucketIds);
            return result;
        }

        return false;
    }
}
