/*
 * 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;

/**
 * Represents IP Device Identifiers.
 */
public class IpDeviceIdentifier {

    private final RouteDistinguisher routeDish;
    private final RouteInstance routeInstance;
    private final AsNumber asNum;
    private final DomainId domainIdentifier;
    private final AreaId areaId;
    private final RouteIdentifier routerIdentifier;

    /**
     * Constructor to initialize parameters.
     *
     * @param routeDish routing distinguisher instance
     * @param routeInstance routing protocol instance
     * @param asNum AS number
     * @param domainIdentifier BGP-LS domain
     * @param areaId Area ID
     * @param routerIdentifier IGP router ID
     */
    public IpDeviceIdentifier(RouteDistinguisher routeDish, RouteInstance routeInstance, AsNumber asNum,
                           DomainId domainIdentifier, AreaId areaId, RouteIdentifier routerIdentifier) {
        this.routeDish = routeDish;
        this.areaId = areaId;
        this.asNum = asNum;
        this.domainIdentifier = domainIdentifier;
        this.routeInstance = routeInstance;
        this.routerIdentifier = routerIdentifier;
    }

    /**
     * Obtains Route Distinguisher of Ip Device.
     *
     * @return Area ID
     */
    public RouteDistinguisher routeDish() {
        return routeDish;
    }

    /**
     * Obtains Area ID if Ip Device.
     *
     * @return Area ID
     */
    public AreaId areaId() {
        return areaId;
    }

    /**
     * Obtains AS number of Ip Device.
     *
     * @return AS number
     */
    public AsNumber asNum() {
        return asNum;
    }

    /**
     * Obtains domain identifier of Ip Device.
     *
     * @return domain identifier
     */
    public DomainId domainIdentifier() {
        return domainIdentifier;
    }

    /**
     * Obtains Router id of Ip Device.
     *
     * @return Router id
     */
    public RouteIdentifier routerIdentifier() {
        return routerIdentifier;
    }

    /**
     * Obtains routing protocol instance.
     *
     * @return routing protocol instance
     */
    public RouteInstance routeInstance() {
        return routeInstance;
    }

    @Override
    public int hashCode() {
        return Objects.hash(routeDish, areaId, asNum, domainIdentifier, routerIdentifier, routeInstance);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj instanceof IpDeviceIdentifier) {
            IpDeviceIdentifier other = (IpDeviceIdentifier) obj;
            return Objects.equals(areaId, other.areaId) && Objects.equals(asNum, other.asNum)
                    && Objects.equals(domainIdentifier, other.domainIdentifier)
                    && Objects.equals(routerIdentifier, other.routerIdentifier)
                    && Objects.equals(routeInstance, other.routeInstance)
                    && Objects.equals(routeDish, other.routeDish);
        }
        return false;
    }

    @Override
    public String toString() {
        return toStringHelper(this)
                .omitNullValues()
                .add("areaId", areaId)
                .add("asNum", asNum)
                .add("domainIdentifier", domainIdentifier)
                .add("routerIdentifier", routerIdentifier)
                .add("routeInstance", routeInstance)
                .add("routeDish", routeDish)
                .toString();
    }
}