// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
 *******************************************************************************
 * Copyright (C) 2007, International Business Machines Corporation and         *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.dev.test.util;

/**
 * @author srl
 *
 */

public class DebugUtilities {
    
    /**
     * Count enum types
     * @return the number of enum types available, starting at 0
     */
    public static int typeCount() {
        return DebugUtilitiesData.TYPES.length;
    }
    
    /**
     * Fetch the name of a particular type of enum
     * @param type the enum type
     * @return the name of the enum
     */
    public static String typeString(int type) {
        return enumString(DebugUtilitiesData.UDebugEnumType, type);
    }

    /**
     * Count the number of available enum values for an item, from 0
     * @param type which enum to look up, such as DebugUtilitiesData.UCalendarDateFields
     * @return the number of available enum values
     */
    public static int enumCount(int type) {
        return DebugUtilitiesData.NAMES[type].length;
    }
    
    /**
     * Fetch the name of an enum
     * @param type which enum to look up, such as DebugUtilitiesData.UCalendarDateFields
     * @param field which enum value to look up
     * @return the found name. Will throw an exception on out of bounds.
     */
    public static String enumString(int type, int field) {
        return DebugUtilitiesData.NAMES[type][field];
    }
    
    /**
     * Lookup an enum by string
     * @param type which enum to look up, such as DebugUtilitiesData.UCalendarDateFields
     * @param string the string to search for
     * @return the found enum value, or -1 if not found
     */
    public static int enumByString(int type, String string) {
        for(int j=0;j<DebugUtilitiesData.NAMES[type].length;j++) {
            if(string.equals(DebugUtilitiesData.NAMES[type][j])) {
                return j;
            }
        }
        return -1;
    }
    
    /**
     * for consistency checking
     * @param type the type of enum
     * @return the expected ordinal value (should be equal to "field")
     * @internal
     */
    public static int enumArrayValue(int type, int field) {
        return DebugUtilitiesData.VALUES[type][field];
    }

}
