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

import java.util.Objects;

import org.onosproject.net.DeviceId;
import org.onosproject.net.ElementId;

import com.google.common.base.MoreObjects;

/**
 * Abstraction of a network termination point expressed as a pair of the network element identifier and device
 * interface.
 */
public class TerminationPoint {
    private final ElementId elementId;
    private final DeviceInterface deviceInterface;

    /**
     * Constructor to initialize its parameters.
     *
     * @param elementId network element identifier
     * @param deviceInterface device interface
     */
    public TerminationPoint(ElementId elementId, DeviceInterface deviceInterface) {
        this.elementId = elementId;
        this.deviceInterface = deviceInterface;
    }

    /**
     * Returns the network element identifier.
     *
     * @return element identifier
     */
    public ElementId elementId() {
        return elementId;
    }

    /**
     * Returns the identifier of the infrastructure device if the termination
     * point belongs to a network element which is indeed an ip
     * device.
     *
     * @return network element identifier as a device identifier
     * @throws java.lang.IllegalStateException if termination point is not
     *                                         associated with a device
     */
    public DeviceId deviceId() {
        if (elementId instanceof DeviceId) {
            return (DeviceId) elementId;
        }
        throw new IllegalStateException("Termination point not associated " +
                "with an ip device");
    }

    /**
     * Returns Device interface details.
     *
     * @return device interface details
     */
    public DeviceInterface deviceInterface() {
        return deviceInterface;
    }

    @Override
    public int hashCode() {
        return Objects.hash(elementId, deviceInterface);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof TerminationPoint) {
            final TerminationPoint other = (TerminationPoint) obj;
            return Objects.equals(this.elementId, other.elementId)
                    && Objects.equals(this.deviceInterface, other.deviceInterface);
        }
        return false;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
                .add("elementId", elementId)
                .add("deviceInterface", deviceInterface)
                .toString();
    }
}