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

import static com.google.common.base.MoreObjects.toStringHelper;

import java.util.Objects;

import org.onlab.packet.Ip4Address;
import org.onlab.packet.Ip6Address;

/**
 * Represents Ip Link Identifier.
 */
public class IpLinkIdentifier {
    private final InterfaceIdentifier localIndentifier;
    private final InterfaceIdentifier remoteIndentifier;
    private final Ip4Address localIpv4Addr;
    private final Ip4Address remoteIpv4Addr;
    private final Ip6Address localIpv6Addr;
    private final Ip6Address remoteIpv6Addr;
    private final TopologyId topologyId;

    /**
     * Constructor to initialize its parameters.
     *
     * @param localIndentifier  local interface identifier of the link
     * @param remoteIndentifier remote interface identifier of the link
     * @param localIpv4Addr     local IPv4 address of the link
     * @param remoteIpv4Addr    remote IPv4 address of the link
     * @param localIpv6Addr     local IPv6 address of the link
     * @param remoteIpv6Addr    remote IPv6 address of the link
     * @param topologyId        link topology identifier
     */
    public IpLinkIdentifier(InterfaceIdentifier localIndentifier, InterfaceIdentifier remoteIndentifier,
                            Ip4Address localIpv4Addr, Ip4Address remoteIpv4Addr, Ip6Address localIpv6Addr,
                            Ip6Address remoteIpv6Addr, TopologyId topologyId) {
        this.localIndentifier = localIndentifier;
        this.remoteIndentifier = remoteIndentifier;
        this.localIpv4Addr = localIpv4Addr;
        this.remoteIpv4Addr = remoteIpv4Addr;
        this.localIpv6Addr = localIpv6Addr;
        this.remoteIpv6Addr = remoteIpv6Addr;
        this.topologyId = topologyId;
    }

    /**
     * Obtains link local identifier.
     *
     * @return link local identifier
     */
    public InterfaceIdentifier localIndentifier() {
        return localIndentifier;
    }

    /**
     * Obtains link local identifier.
     *
     * @return link local identifier
     */
    public InterfaceIdentifier remoteIndentifier() {
        return remoteIndentifier;
    }

    /**
     * Obtains local IPv4 address of the link.
     *
     * @return local IPv4  address of the link
     */
    public Ip4Address localIpv4Addr() {
        return localIpv4Addr;
    }

    /**
     * Obtains remote IPv4 address of the link.
     *
     * @return remote IPv4  address of the link
     */
    public Ip4Address remoteIpv4Addr() {
        return remoteIpv4Addr;
    }

    /**
     * Obtains local IPv6 address of the link.
     *
     * @return local IPv6 address of the link
     */
    public Ip6Address localIpv6Addr() {
        return localIpv6Addr;
    }

    /**
     * Obtains remote IPv6 address of the link.
     *
     * @return remote IPv6 address of the link
     */
    public Ip6Address remoteIpv6Addr() {
        return remoteIpv6Addr;
    }

    /**
     * Obtains Topology ID of the link.
     *
     * @return Topology ID of the link
     */
    public TopologyId topologyId() {
        return topologyId;
    }

    @Override
    public int hashCode() {
        return Objects.hash(localIndentifier, remoteIndentifier, localIpv4Addr, remoteIpv4Addr,
                localIpv6Addr, remoteIpv6Addr, topologyId);
    }

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

        if (obj instanceof IpLinkIdentifier) {
            IpLinkIdentifier other = (IpLinkIdentifier) obj;
            return Objects.equals(topologyId, other.topologyId)
                    && Objects.equals(localIndentifier, other.localIndentifier)
                    && Objects.equals(remoteIndentifier, other.remoteIndentifier)
                    && Objects.equals(localIpv4Addr, other.localIpv4Addr)
                    && Objects.equals(remoteIpv4Addr, other.remoteIpv4Addr)
                    && Objects.equals(localIpv6Addr, other.localIpv6Addr)
                    && Objects.equals(remoteIpv6Addr, other.remoteIpv6Addr);
        }
        return false;
    }

    @Override
    public String toString() {
        return toStringHelper(this)
                .omitNullValues()
                .add("localIndentifier", localIndentifier)
                .add("remoteIndentifier", remoteIndentifier)
                .add("localIpv4Addr", localIpv4Addr)
                .add("remoteIpv4Addr", remoteIpv4Addr)
                .add("localIpv6Addr", localIpv6Addr)
                .add("remoteIpv6Addr", remoteIpv6Addr)
                .add("topologyId", topologyId)
                .toString();
    }
}