/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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.apache.directory.server.ntp.messages;


import java.util.Arrays;
import java.util.Collections;
import java.util.List;


/**
 * Reference Identifier: This is a 32-bit bitstring identifying the
 * particular reference source. In the case of NTP Version 3 or Version
 * 4 stratum-0 (unspecified) or stratum-1 (primary) servers, this is a
 * four-character ASCII string, left justified and zero padded to 32
 * bits. In NTP Version 3 secondary servers, this is the 32-bit IPv4
 * address of the reference source. In NTP Version 4 secondary servers,
 * this is the low order 32 bits of the latest transmit timestamp of the
 * reference source. NTP primary (stratum 1) servers should set this
 * field to a code identifying the external reference source according
 * to the following list. If the external reference is one of those
 * listed, the associated code should be used. Codes for sources not
 * listed can be contrived as appropriate.
 * 
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class ReferenceIdentifier implements Comparable<ReferenceIdentifier>
{
    /**
     * Constant for the "INIT" reference identifier type.
     */
    public static final ReferenceIdentifier INIT = new ReferenceIdentifier( 0, "INIT", "initializing" );

    /**
     * Constant for the "LOCL" reference identifier type.
     */
    public static final ReferenceIdentifier LOCL = new ReferenceIdentifier( 1, "LOCL", "uncalibrated local clock" );

    /**
     * Constant for the "PPL" reference identifier type.
     */
    public static final ReferenceIdentifier PPS = new ReferenceIdentifier( 2, "PPL", "pulse-per-second source" );

    /**
     * Constant for the "ACTS" reference identifier type.
     */
    public static final ReferenceIdentifier ACTS = new ReferenceIdentifier( 3, "ACTS", "NIST dialup modem service" );

    /**
     * Constant for the "USNO" reference identifier type.
     */
    public static final ReferenceIdentifier USNO = new ReferenceIdentifier( 4, "USNO", "USNO modem service" );

    /**
     * Constant for the "PTB" reference identifier type.
     */
    public static final ReferenceIdentifier PTB = new ReferenceIdentifier( 5, "PTB", "PTB (Germany) modem service" );

    /**
     * Constant for the "TDF" reference identifier type.
     */
    public static final ReferenceIdentifier TDF = new ReferenceIdentifier( 6, "TDF", "Allouis (France) Radio 164 kHz" );

    /**
     * Constant for the "DCF" reference identifier type.
     */
    public static final ReferenceIdentifier DCF = new ReferenceIdentifier( 7, "DCF",
        "Mainflingen (Germany) Radio 77.5 kHz" );

    /**
     * Constant for the "MSF" reference identifier type.
     */
    public static final ReferenceIdentifier MSF = new ReferenceIdentifier( 8, "MSF", "Rugby (UK) Radio 60 kHz" );

    /**
     * Constant for the "WWV" reference identifier type.
     */
    public static final ReferenceIdentifier WWV = new ReferenceIdentifier( 9, "WWV",
        "Ft. Collins (US) Radio 2.5, 5, 10, 15, 20 MHz" );

    /**
     * Constant for the "WWVB" reference identifier type.
     */
    public static final ReferenceIdentifier WWVB = new ReferenceIdentifier( 10, "WWVB", "Boulder (US) Radio 60 kHz" );

    /**
     * Constant for the "WWVH" reference identifier type.
     */
    public static final ReferenceIdentifier WWVH = new ReferenceIdentifier( 11, "WWVH",
        "Kaui Hawaii (US) Radio 2.5, 5, 10, 15 MHz" );

    /**
     * Constant for the "CHU" reference identifier type.
     */
    public static final ReferenceIdentifier CHU = new ReferenceIdentifier( 12, "CHU",
        "Ottawa (Canada) Radio 3330, 7335, 14670 kHz" );

    /**
     * Constant for the "LORC" reference identifier type.
     */
    public static final ReferenceIdentifier LORC = new ReferenceIdentifier( 13, "LORC",
        "LORAN-C radionavigation system" );

    /**
     * Constant for the "OMEG" reference identifier type.
     */
    public static final ReferenceIdentifier OMEG = new ReferenceIdentifier( 14, "OMEG", "OMEGA radionavigation system" );

    /**
     * Constant for the "GPS" reference identifier type.
     */
    public static final ReferenceIdentifier GPS = new ReferenceIdentifier( 15, "GPS", "Global Positioning Service" );

    /**
     * Constant for the "GOES" reference identifier type.
     */
    public static final ReferenceIdentifier GOES = new ReferenceIdentifier( 16, "GOES",
        "Geostationary Orbit Environment Satellite" );

    /**
     * Constant for the "CDMA" reference identifier type.
     */
    public static final ReferenceIdentifier CDMA = new ReferenceIdentifier( 17, "CDMA",
        "CDMA mobile cellular/PCS telephone system" );

    /**
     * Array for building a List of VALUES.
     */
    private static final ReferenceIdentifier[] values =
        { INIT, LOCL, PPS, ACTS, USNO, PTB, TDF, DCF, MSF, WWV, WWVB, WWVH, CHU, LORC, OMEG, GPS, GOES, CDMA };

    /**
     * A list of all the reference identifier type constants.
     */
    public static final List<ReferenceIdentifier> VALUES = Collections.unmodifiableList( Arrays.asList( values ) );

    /**
     * The value/code for the reference identifier type.
     */
    private final int ordinal;

    /**
     * The name of the reference identifier type.
     */
    private final String name;

    /**
     * The code of the reference identifier type.
     */
    private final String code;


    /**
     * Private constructor prevents construction outside of this class.
     */
    private ReferenceIdentifier( int ordinal, String code, String name )
    {
        this.ordinal = ordinal;
        this.code = code;
        this.name = name;
    }


    /**
     * Returns the reference identifier type when specified by its ordinal.
     *
     * @param type
     * @return The reference identifier type.
     */
    public static ReferenceIdentifier getTypeByOrdinal( int type )
    {
        for ( int ii = 0; ii < values.length; ii++ )
        {
            if ( values[ii].ordinal == type )
            {
                return values[ii];
            }
        }

        return LOCL;
    }


    /**
     * Returns the reference identifier type when specified by its name.
     *
     * @param type
     * @return The reference identifier type.
     */
    public static ReferenceIdentifier getTypeByName( String type )
    {
        for ( int ii = 0; ii < values.length; ii++ )
        {
            if ( values[ii].code.equalsIgnoreCase( type ) )
            {
                return values[ii];
            }
        }

        return LOCL;
    }


    /**
     * Returns the code associated with this reference identifier type.
     *
     * @return The reference identifier type code.
     */
    public String getCode()
    {
        return code;
    }


    /**
     * Returns the number associated with this reference identifier type.
     *
     * @return The reference identifier type ordinal.
     */
    public int getOrdinal()
    {
        return ordinal;
    }


    /**
     * {@inheritDoc}
     */
    public int compareTo( ReferenceIdentifier that )
    {
        return ordinal - that.ordinal;
    }


    /**
     * {@inheritDoc}
     */
    public int hashCode()
    {
        return ordinal;
    }


    /**
     * {@inheritDoc}
     */
    public boolean equals( Object that )
    {
        if ( that == this )
        {
            return true;
        }

        if ( !( that instanceof ReferenceIdentifier ) )
        {
            return false;
        }

        ReferenceIdentifier thatRef = ( ReferenceIdentifier ) that;

        return ordinal == thatRef.ordinal;
    }


    public String toString()
    {
        return name;
    }
}
