/*
 * Copyright 2014-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.segmentrouting.grouphandler;

import org.onlab.packet.IpPrefix;
import org.onosproject.net.DeviceId;

import java.util.Objects;

/**
 * Class definition of Key for Subnet to NextObjective store.
 */
public class SubnetNextObjectiveStoreKey {
    private final DeviceId deviceId;
    private final IpPrefix prefix;

    public SubnetNextObjectiveStoreKey(DeviceId deviceId,
                                       IpPrefix prefix) {
        this.deviceId = deviceId;
        this.prefix = prefix;
    }

    /**
     * Gets device id in this SubnetNextObjectiveStoreKey.
     *
     * @return device id
     */
    public DeviceId deviceId() {
        return this.deviceId;
    }

    /**
     * Gets subnet information in this SubnetNextObjectiveStoreKey.
     *
     * @return subnet information
     */
    public IpPrefix prefix() {
        return this.prefix;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof SubnetNextObjectiveStoreKey)) {
            return false;
        }
        SubnetNextObjectiveStoreKey that =
                (SubnetNextObjectiveStoreKey) o;
        return (Objects.equals(this.deviceId, that.deviceId) &&
                Objects.equals(this.prefix, that.prefix));
    }

    @Override
    public int hashCode() {
        return Objects.hash(deviceId, prefix);
    }

    @Override
    public String toString() {
        return "Device: " + deviceId + " Subnet: " + prefix;
    }
}
