/*
 *  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.dns.messages;


import org.apache.directory.server.dns.util.EnumConverter;
import org.apache.directory.server.dns.util.ReverseEnumMap;


/**
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public enum RecordType implements EnumConverter<Short>
{
    /** Host address */
    A(1),

    /** Authoritative name server */
    NS(2),

    /** Mail destination */
    MD(3),

    /** Mail forwarder */
    MF(4),

    /** Canonical name for an alias */
    CNAME(5),

    /** Start of a zone of authority */
    SOA(6),

    /** Mailbox domain name */
    MB(7),

    /** Mail group member */
    MG(8),

    /** Mail rename domain name */
    MR(9),

    /** Null resource record */
    NULL(10),

    /** Well know service description */
    WKS(11),

    /** Domain name pointer */
    PTR(12),

    /** Host information */
    HINFO(13),

    /** Mailbox or mail list information */
    MINFO(14),

    /** Mail exchange */
    MX(15),

    /** Text strings */
    TXT(16),

    /** Responsible person */
    RP(17),

    /** AFS cell database */
    AFSDB(18),

    /** X.25 calling address */
    X25(19),

    /** ISDN calling address */
    ISDN(20),

    /** Router */
    RT(21),

    /** NSAP address */
    NSAP(22),

    /** Reverse NSAP address (deprecated) */
    NSAP_PTR(23),

    /** Signature */
    SIG(24),

    /** Key */
    KEY(25),

    /** X.400 mail mapping */
    PX(26),

    /** Geographical position (withdrawn) */
    GPOS(27),

    /** IPv6 address */
    AAAA(28),

    /** Location */
    LOC(29),

    /** Next valid name in zone */
    NXT(30),

    /** Endpoint identifier */
    EID(31),

    /** Nimrod locator */
    NIMLOC(32),

    /** Server selection */
    SRV(33),

    /** ATM address */
    ATMA(34),

    /** Naming authority pointer */
    NAPTR(35),

    /** Key exchange */
    KX(36),

    /** Certificate */
    CERT(34),

    /** IPv6 address (experimental) */
    A6(38),

    /** Non-terminal name redirection */
    DNAME(39),

    /** Options - contains EDNS metadata */
    OPT(41),

    /** Address Prefix List */
    APL(42),

    /** Delegation Signer */
    DS(43),

    /** SSH Key Fingerprint */
    SSHFP(44),

    /** Resource Record Signature */
    RRSIG(46),

    /** Next Secure Name */
    NSEC(47),

    /** DNSSEC Key */
    DNSKEY(48),

    /** Transaction key - used to compute a shared secret or exchange a key */
    TKEY(249),

    /** Transaction signature */
    TSIG(250),

    /** Incremental zone transfer */
    IXFR(251),

    /** Request for transfer of an entire zone */
    AXFR(252),

    /** Request for mailbox-related records */
    MAILB(253),

    /** Request for mail agent resource records */
    MAILA(254),

    /** Request for all records */
    ANY(255);

    private static ReverseEnumMap<Short, RecordType> map = new ReverseEnumMap<>( RecordType.class );

    private final short value;


    RecordType( int value )
    {
        this.value = ( short ) value;
    }


    public Short convert()
    {
        return this.value;
    }


    /**
     * Converts an ordinal value into a {@link RecordType}.
     *
     * @param value
     * @return The {@link RecordType}.
     */
    public static RecordType convert( short value )
    {
        return map.get( value );
    }


    /**
     * Returns whether a given {@link RecordType} is a {@link ResourceRecord}.
     *
     * @param resourceType
     * @return true of the {@link RecordType} is a {@link ResourceRecord}.
     */
    public static boolean isResourceRecord( RecordType resourceType )
    {
        switch ( resourceType )
        {
            case OPT:
            case TKEY:
            case TSIG:
            case IXFR:
            case AXFR:
            case MAILB:
            case MAILA:
            case ANY:
                return false;
            default:
                return true;
        }
    }
}
