// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
/*
 *******************************************************************************
 * 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];
    }

}
