/*
 * 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 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();
    }
}