/*
 * Copyright 2016 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.incubator.net.key;

import java.util.Objects;

import static com.google.common.base.Preconditions.checkNotNull;

/**
 * Device key Id definition.
 */
public final class DeviceKeyId {
    private final String identifier;

    /**
     * Constructor for serialization.
     */
    private DeviceKeyId() {
        this.identifier = null;
    }

    /**
     * Constructs the ID corresponding to a given string value.
     *
     * @param value the underlying value of this ID
     */
    private DeviceKeyId(String value) {
        this.identifier = checkNotNull(value, "Device Key Id cannot be null.");
    }

    /**
     * Static  method to construct a device key identifier.
     *
     * @param id for the device key identifier
     * @return device key identifier
     */
    public static final DeviceKeyId deviceKeyId(String id) {
        return new DeviceKeyId(id);
    }

    /**
     * Returns the identifier of the device key identifier.
     *
     * @return identifier
     */
    public String id() {
        return identifier;
    }

    /**
     * Returns the hashcode of the identifier.
     *
     * @return hashcode
     */
    @Override
    public int hashCode() {
        return identifier.hashCode();
    }

    /**
     * Compares two device key identifiers for equality.
     *
     * @param obj to compare against
     * @return true if the objects are equal, false otherwise.
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof DeviceKeyId) {
            final DeviceKeyId that = (DeviceKeyId) obj;
            return this.getClass() == that.getClass() &&
                    Objects.equals(this.identifier, that.identifier);
        }
        return false;
    }

    /**
     * Returns a string representation of a DeviceKeyId.
     *
     * @return string
     */
    public String toString() {
        return identifier;
    }
}
