/*
 * 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 org.onosproject.net.AbstractElement;
import org.onosproject.net.Annotations;
import org.onosproject.net.DeviceId;
import org.onosproject.net.provider.ProviderId;

import java.util.Objects;

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

/**
 * Default ip device model implementation.
 */
public class DefaultIpDevice extends AbstractElement implements IpDevice {

    private final Type type;
    private final IpDeviceIdentifier deviceIdentifier;
    private final DeviceTed deviceTed;


    /**
     * For Serialization.
     */
    private DefaultIpDevice() {
        this.type = null;
        this.deviceIdentifier = null;
        this.deviceTed = null;
    }

    /**
     * Creates a network element attributed to the specified provider.
     *
     * @param providerId   identity of the provider
     * @param id           device identifier
     * @param type         device type
     * @param deviceIdentifier provides device identifier details
     * @param deviceTed device traffic engineering parameters
     * @param annotations  optional key/value annotations
     */
    public DefaultIpDevice(ProviderId providerId, DeviceId id, Type type,
                         IpDeviceIdentifier deviceIdentifier, DeviceTed deviceTed,
                         Annotations... annotations) {
        super(providerId, id, annotations);
        this.type = type;
        this.deviceIdentifier = deviceIdentifier;
        this.deviceTed = deviceTed;
    }

    @Override
    public DeviceId id() {
        return (DeviceId) id;
    }

    @Override
    public Type type() {
        return type;
    }

    @Override
    public IpDeviceIdentifier deviceIdentifier() {
        return deviceIdentifier;
    }

    @Override
    public DeviceTed deviceTed() {
        return deviceTed; }

    @Override
    public int hashCode() {
        return Objects.hash(type, deviceIdentifier, deviceTed);
    }

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

        if (obj instanceof DefaultIpDevice) {
            final DefaultIpDevice other = (DefaultIpDevice) obj;
            return Objects.equals(this.id, other.id) &&
                    Objects.equals(this.type, other.type) &&
                    Objects.equals(this.deviceIdentifier, other.deviceIdentifier) &&
                    Objects.equals(this.deviceTed, other.deviceTed);
        }
        return false;
    }
    @Override
    public String toString() {
        return toStringHelper(this)
                .omitNullValues()
                .add("id", id)
                .add("deviceIdentifier", deviceIdentifier)
                .add("deviceTed", deviceTed)
                .toString();
    }
}