/*
 * 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 java.util.Objects;

import org.onlab.packet.Ip4Address;
import org.onlab.packet.Ip6Address;

import com.google.common.base.MoreObjects;

/**
 * Representation of device interface.
 */
public class DeviceInterface {
    private final Ip4Address ip4Address;
    private final Ip6Address ip6Address;
    private final InterfaceIdentifier interfaceId;

    /**
     * Constructor to initialize its parameter.
     *
     * @param ip4Address ipv4 interface address
     * @param ip6Address ipv6 interface address
     * @param interfaceId interface Identifier
     */
    public DeviceInterface(Ip4Address ip4Address, Ip6Address ip6Address, InterfaceIdentifier interfaceId) {
        this.ip4Address = ip4Address;
        this.ip6Address = ip6Address;
        this.interfaceId = interfaceId;
    }

    /**
     * obtains ipv4 address of an interface.
     *
     * @return ipv4 interface address
     */
    public Ip4Address ip4Address() {
        return ip4Address;
    }

    /**
     * obtains ipv6 interface address.
     *
     * @return ipv6 interface address
     */
    public Ip6Address ip6Address() {
        return ip6Address;
    }

    /**
     * obtains interface identifier.
     *
     * @return interface identifier
     */
    public InterfaceIdentifier interfaceId() {
        return interfaceId;
    }

    @Override
    public int hashCode() {
        return Objects.hash(ip4Address, ip6Address, interfaceId);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof DeviceInterface) {
            final DeviceInterface other = (DeviceInterface) obj;
            return Objects.equals(this.ip4Address, other.ip4Address)
                    && Objects.equals(this.ip6Address, other.ip6Address)
                    && Objects.equals(this.interfaceId, other.interfaceId);
        }
        return false;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
                .add("ip4Address", ip4Address)
                .add("ip6Address", ip6Address)
                .add("interfaceId", interfaceId)
                .toString();
    }
}