/*
 * Copyright 2016-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.tetopology.management.api;

import java.net.URI;
import java.util.Objects;

/**
 * Representation of an key identifier in URI.
 */
public class KeyId {
    /**
     * Represents either no uri, or an unspecified uri.
     */
    public static final KeyId NONE = keyId("none:none");

    private final URI uri;
    private final String str;

    // Public construction is prohibited
    private KeyId(URI uri) {
        this.uri = uri;
        //this.str = uri.toString().toLowerCase();
        this.str = uri.toString();
    }


    /**
     * Default constructor for serialization of KeyId.
     */
    protected KeyId() {
        this.uri = null;
        this.str = null;
    }

    /**
     * Returns the backing URI.
     *
     * @return backing URI
     */
    public URI uri() {
        return uri;
    }

    @Override
    public int hashCode() {
        return str.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof KeyId) {
            KeyId that = (KeyId) obj;
            return this.getClass() == that.getClass() &&
                    Objects.equals(this.str, that.str);
        }
        return false;
    }

    @Override
    public String toString() {
        return str;
    }

    /**
     * Creates a uri id using the supplied URI.
     *
     * @param uri URI
     * @return UriId
     */
    public static KeyId keyId(URI uri) {
        return new KeyId(uri);
    }

    /**
     * Creates a uri id using the supplied URI string.
     *
     * @param string URI string
     * @return UriId
     */
    public static KeyId keyId(String string) {
        return keyId(URI.create(string));
    }

}
