/*
 * Copyright 2014 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.pcep.api;

import java.net.URI;
import java.net.URISyntaxException;

import org.onosproject.pcep.tools.PcepTools;

/**
 * The class representing a network switch PCEPDid. This class is immutable.
 */
public final class PcepDpid {

    private static final String SCHEME = "pcep";
    private static final long UNKNOWN = 0;
    private long nodeId;

    /**
     * Default constructor.
     */
    public PcepDpid() {
        this.nodeId = PcepDpid.UNKNOWN;
    }

    /**
     * Constructor from a long value.
     *
     * @param value long value for construct
     */
    public PcepDpid(long value) {
        this.nodeId = value;
    }

    /**
     * Constructor from a String.
     *
     * @param value string value for construct
     */
    public PcepDpid(String value) {
        this.nodeId = Long.parseLong(value, 16);
    }

    /**
     * Produces device URI from the given DPID.
     *
     * @param dpid device dpid
     * @return device URI
     */
    public static URI uri(PcepDpid dpid) {
        return uri(dpid.nodeId);
    }

    /**
     * Produces device long from the given string which comes from the uri
     * method.
     *
     * @param value string value which produced by uri method.
     * @return a long value.
     */
    public static long toLong(String value) {
        return PcepTools.ipToLong(value.replace(SCHEME, ""));
    }

    /**
     * Produces device URI from the given DPID long.
     *
     * @param value device dpid as long
     * @return device URI
     */
    public static URI uri(long value) {
        try {
            return new URI(SCHEME, PcepTools.longToIp(value), null);
        } catch (URISyntaxException e) {
            return null;
        }
    }

    /**
     * Return a device id with the form of long.
     *
     * @return long value
     */
    public long value() {
        return this.nodeId;
    }

}
