/*
 *  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.kerberos.shared.messages.value.types;


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


/**
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 * @version $Rev: 540371 $, $Date: 2007-05-22 02:00:43 +0200 (Tue, 22 May 2007) $
 */
public enum AuthorizationType
{
    /**
     * Constant for the "null" authorization type.
     */
    NULL( 0 ),

    /**
     * Constant for the "if relevant" authorization type.
     * 
     * RFC 4120
     */
    AD_IF_RELEVANT( 1 ),

    /**
     * Constant for the "intended for server" authorization type.
     * 
     * RFC 4120
     */
    AD_INTENDED_FOR_SERVER( 2 ),

    /**
     * Constant for the  "intended for application class" authorization type.
     * 
     * RFC 4120
     */
    AD_INTENDED_FOR_APPLICATION_CLASS( 3 ),

    /**
     * Constant for the "kdc issued" authorization type.
     * 
     * RFC 4120
     */
    AD_KDC_ISSUED( 4 ),

    /**
     * Constant for the "or" authorization type.
     * 
     * RFC 4120
     */
    AD_OR( 5 ),

    /**
     * Constant for the "mandatory ticket extensions" authorization type.
     * 
     * RFC 4120
     */
    AD_MANDATORY_TICKET_EXTENSIONS( 6 ),

    /**
     * Constant for the "in ticket extensions" authorization type.
     * 
     * RFC 4120
     */
    AD_IN_TICKET_EXTENSIONS( 7 ),

    /**
     * Constant for the "mandatory-for-kdc" authorization type.
     * 
     * RFC 4120
     */
    AD_MANDATORY_FOR_KDC( 8 ),

    /**
     * Constant for the "OSF DCE" authorization type.
     * 
     * RFC 1510
     */
    OSF_DCE( 64 ),

    /**
     * Constant for the "sesame" authorization type.
     * 
     * RFC 1510
     */
    SESAME( 65 ),

    /**
     * Constant for the "OSF-DCE pki certid" authorization type.
     * 
     * RFC 1510
     */
    AD_OSF_DCE_PKI_CERTID( 66 ),

    /**
     * Constant for the "sesame" authorization type.
     * 
     * RFC 1510
     */
    AD_WIN2K_PAC( 128 ),

    /**
     * Constant for the "sesame" authorization type.
     * 
     * RFC 1510
     */
    AD_ETYPE_NEGOTIATION( 129 );

    /**
     * Array for building a List of VALUES.
     */
    private static final AuthorizationType[] values =
        { 
    		NULL, 
    		AD_IF_RELEVANT, 
    		AD_INTENDED_FOR_SERVER, 
    		AD_INTENDED_FOR_APPLICATION_CLASS, 
    		AD_KDC_ISSUED, 
    		AD_OR,
    		AD_MANDATORY_TICKET_EXTENSIONS,
    		AD_MANDATORY_FOR_KDC,
    		AD_IN_TICKET_EXTENSIONS, 
            OSF_DCE, 
            SESAME,
            AD_OSF_DCE_PKI_CERTID,
            AD_WIN2K_PAC,
            AD_ETYPE_NEGOTIATION
        };

    /**
     * A List of all the authorization type constants.
     */
    public static final List VALUES = Collections.unmodifiableList( Arrays.asList( values ) );

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


    /**
     * Private constructor prevents construction outside of this class.
     */
    private AuthorizationType( int ordinal )
    {
        this.ordinal = ordinal;
    }


    /**
     * Returns the authorization type when specified by its ordinal.
     *
     * @param type
     * @return The authorization type.
     */
    public static AuthorizationType getTypeByOrdinal( int type )
    {
    	switch ( type )
    	{
	    	case 1 : 	return AD_IF_RELEVANT;
	    	case 2 : 	return AD_INTENDED_FOR_SERVER;
	    	case 3 :	return AD_INTENDED_FOR_APPLICATION_CLASS;
	    	case 4 : 	return AD_KDC_ISSUED;
	    	case 5 : 	return AD_OR;
	    	case 6 : 	return AD_MANDATORY_TICKET_EXTENSIONS;
	    	case 7 : 	return AD_IN_TICKET_EXTENSIONS;
	    	case 8 : 	return AD_MANDATORY_FOR_KDC;
	    	case 64 : 	return OSF_DCE;
	    	case 65 : 	return SESAME;
	    	case 66 : 	return AD_OSF_DCE_PKI_CERTID;
	    	case 128 : 	return AD_WIN2K_PAC;
	    	case 129 :	return AD_ETYPE_NEGOTIATION;
	    	default :  	return NULL;
    	}
    }


    /**
     * Returns the number associated with this authorization type.
     *
     * @return The authorization type ordinal.
     */
    public int getOrdinal()
    {
        return ordinal;
    }
    
    /**
     * @see Object#toString()
     */
    public String toString()
    {
    	switch ( this )
    	{
    		case AD_IF_RELEVANT 					: 
    			return "if relevant" + "(" + ordinal + ")";
    		
    		case AD_INTENDED_FOR_SERVER : 
    			return "intended for server" + "(" + ordinal + ")";
    		
    		case AD_INTENDED_FOR_APPLICATION_CLASS : 
    			return "intended for application class" + "(" + ordinal + ")";
    		
    		case AD_KDC_ISSUED : 
    			return "kdc issued" + "(" + ordinal + ")";
    		
    		case AD_OR : 
    			return "or" + "(" + ordinal + ")";
    		
    		case AD_MANDATORY_TICKET_EXTENSIONS : 
    			return "mandatory ticket extensions" + "(" + ordinal + ")";
    		
    		case AD_IN_TICKET_EXTENSIONS : 
    			return "in ticket extensions" + "(" + ordinal + ")";
    		
    		case AD_MANDATORY_FOR_KDC : 
    			return "mandatory-for-kdc" + "(" + ordinal + ")";
    		
    		case OSF_DCE : 
    			return "OSF DCE" + "(" + ordinal + ")";
    		
    		case SESAME : 
    			return "sesame" + "(" + ordinal + ")";
    			
    		case AD_OSF_DCE_PKI_CERTID :
    			return "OSF DCE pki certid" + "(" + ordinal + ")";
    		
    		case AD_WIN2K_PAC :
    			return "win 2000 PAC" + "(" + ordinal + ")";
    		
    		case AD_ETYPE_NEGOTIATION :
    			return "etype negociation" + "(" + ordinal + ")";
    		
    		default : 
    			return "null" + "(" + ordinal + ")";
    	}
    }
}
