/*
 * Copyright 2014-present 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.store.flow;

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

import java.util.Collections;
import java.util.List;

import org.onosproject.cluster.NodeId;

import com.google.common.base.Objects;
import com.google.common.base.Optional;

/**
 * Class to represent placement information about Master/Backup copy.
 */
public final class ReplicaInfo {

    private final Optional<NodeId> master;
    private final List<NodeId> backups;

    /**
     * Creates a ReplicaInfo instance.
     *
     * @param master NodeId of the node where the master copy should be
     * @param backups list of NodeId, where backup copies should be placed
     */
    public ReplicaInfo(NodeId master, List<NodeId> backups) {
        this.master = Optional.fromNullable(master);
        this.backups = checkNotNull(backups);
    }

    /**
     * Returns the NodeId, if there is a Node where the master copy should be.
     *
     * @return NodeId, where the master copy should be placed
     */
    public Optional<NodeId> master() {
        return master;
    }

    /**
     * Returns the collection of NodeId, where backup copies should be placed.
     *
     * @return collection of NodeId, where backup copies should be placed
     */
    public List<NodeId> backups() {
        return backups;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(master, backups);
    }

    @Override
    public boolean equals(Object other) {
        if (!(other instanceof ReplicaInfo))  {
            return false;
        }
        ReplicaInfo that = (ReplicaInfo) other;
        return Objects.equal(this.master, that.master) &&
                Objects.equal(this.backups, that.backups);
    }

    // for Serializer
    private ReplicaInfo() {
        this.master = Optional.absent();
        this.backups = Collections.emptyList();
    }
}
