/*
 *******************************************************************************
 * Copyright (C) 1998-2003, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * Created on Dec 09, 2003
 *
 * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/layout/ThaiCharacterClasses.java,v $
 * $Date: 2003/12/09 23:55:16 $
 * $Revision: 1.1 $
 * 
 *******************************************************************************
 */
package com.ibm.icu.dev.tool.layout;

import com.ibm.icu.impl.Utility;
import java.io.PrintStream;

public class ThaiCharacterClasses
{
    public static final int NON	=  0;
    public static final int CON	=  1;
    public static final int COA	=  2;
    public static final int COD	=  3;
    public static final int LVO =  4;
    public static final int FV1	=  5;
    public static final int FV2	=  6;
    public static final int FV3	=  7;
    public static final int BV1	=  8;
    public static final int BV2	=  9;
    public static final int BDI = 10;
    public static final int TON	= 11;
    public static final int AD1	= 12;
    public static final int AD2	= 13;
    public static final int AD3	= 14;
    public static final int NIK	= 15;
    public static final int AV1	= 16;
    public static final int AV2	= 17;
    public static final int AV3	= 18;
    public static final int cCount = 19;

    // Indexed by unicode - '\u0E00'
    // FIXME: MS Fonts - Should 0E2E has no ascender (it does in WT font)
    // FIXME: MS Fonts - 0E47 (MAITAIKHU) and 0E4D (NIKHAHIT) only have vowel forms
    // FIXME: MS Fonts - 0E4E (YAMAKKAN) only has one form
    private static final int classTable[] = {
	//       0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
	//       -------------------------------------------------------------------------------
	/*0E00*/ NON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, COD, COD, COD, 
	/*0E10*/ COD, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, COA, CON, COA, CON, COA, 
	/*0E20*/ CON, CON, CON, CON, FV3, CON, FV3, CON, CON, CON, CON, CON, CON, CON, CON, NON, 
	/*0E30*/ FV1, AV2, FV1, FV1, AV1, AV3, AV2, AV3, BV1, BV2, BDI, NON, NON, NON, NON, NON, 
	/*0E40*/ LVO, LVO, LVO, LVO, LVO, FV2, NON, AD2, TON, TON, TON, TON, AD1, NIK, AD3, NON, 
	/*0E50*/ NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON
    };

    private static String[] classNames =
    {
        "NON",
        "CON",
        "COA",
        "COD",
        "LVO",
        "FV1",
        "FV2",
        "FV3",
        "BV1",
        "BV2",
        "BDI",
        "TON",
        "AD1",
        "AD2",
        "AD3",
        "NIK",
        "AV1",
        "AV2",
        "AV3"
    };

    private static final char pairTable[][] = {
      //------------------------------------------------------------------------------------------------
      //  N    C    C    C    L    F    F    F    B    B    B    T    A    A    A    N    A    A    A
      //  O    O    O    O    V    V    V    V    V    V    D    O    D    D    D    I    V    V    V
      //  N    N    A    D    O    1    2    3    1    2    I    N    1    2    3    K    1    2    3
      //------------------------------------------------------------------------------------------------
/*NON*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*CON*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'C', 'C', 'C', 'E', 'E', 'E', 'C', 'E', 'C', 'C', 'C'},
/*COA*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'C', 'C', 'C', 'F', 'F', 'F', 'D', 'F', 'D', 'D', 'D'},
/*COD*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'H', 'H', 'H', 'E', 'E', 'E', 'C', 'E', 'C', 'C', 'C'},
/*LVO*/ {'S', 'A', 'A', 'A', 'S', 'S', 'S', 'S', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*FV1*/ {'S', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*FV2*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*FV3*/ {'A', 'A', 'A', 'A', 'A', 'S', 'A', 'S', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*BV1*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'E', 'E', 'R', 'R', 'E', 'R', 'R', 'R'},
/*BV2*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'E', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*BDI*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*TON*/ {'A', 'A', 'A', 'A', 'A', 'I', 'A', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*AD1*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*AD2*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*AD3*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*NIK*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'G', 'R', 'R', 'R', 'R', 'R', 'R'},
/*AV1*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'G', 'R', 'R', 'G', 'R', 'R', 'R'},
/*AV2*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
/*AV3*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'R', 'G', 'R', 'R', 'R', 'R', 'R'}
    };

    public static int getCharClass(char ch)
    {
        int charClass = NON;
        
        if (ch >= '\u0E00' && ch <= '\u0E5B') {
            charClass = classTable[ch - '\u0E00'];
        }
        
        return charClass;
    }
    
    public static String getClassName(int classID)
    {
        if (classID < 0 || classID >= cCount) {
            return "***";
        }
        
        return classNames[classID];
    }
    
    public static char getPairAction(int prevClass, int currClass)
    {
        if (prevClass < 0 || prevClass >= cCount |
            currClass < 0 || currClass >= cCount) {
            return 'A';
        }
            
        return pairTable[prevClass][currClass];
    }
    
    private static String classTableHeader =
"const le_uint8 ThaiShaping::classTable[] = {\n" +
"    //       0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F\n" +
"    //       -------------------------------------------------------------------------------";
    
    public static void writeClassTable(PrintStream output)
    {
        System.out.print("Writing class table...");
        
        output.print(classTableHeader);
        
        for (char ch = '\u0E00'; ch <= '\u0E5B'; ch += 1) {
            int charClass = getCharClass(ch);
            
            if ((ch & 0x000F) == 0) {
                output.print("\n    /*" + Utility.hex(ch, 4) + "*/ ");
            }
            
            output.print(getClassName(charClass));
            
            if (ch < '\u0E5B') {
                output.print(", ");
            } else {
                output.print("\n};\n\n");
            }
        }
        
        System.out.println(" done.");
    }
    
}
