/**
*******************************************************************************
* Copyright (C) 1996-2001, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/unicodetools/com/ibm/text/UCD/UnifiedBinaryProperty.java,v $
* $Date: 2004/02/18 03:09:01 $
* $Revision: 1.17 $
*
*******************************************************************************
*/

package com.ibm.text.UCD;
import java.io.*;
import java.util.*;

import com.ibm.text.utility.*;
import com.ibm.icu.text.UnicodeSet;

public final class UnifiedBinaryProperty extends UCDProperty {
    int majorProp;
    int propValue;
    // DerivedProperty dp;
    
    public static UCDProperty make(int propMask) {
        return make(propMask, Default.ucd());
    }
    
    public static UCDProperty make(int propMask, UCD ucd) {
        if ((propMask & 0xFF00) == DERIVED) {
            return DerivedProperty.make(propMask & 0xFF, ucd);
        }
        if (!isDefined(propMask, ucd)) return null;
        return getCached(propMask, ucd);
    }
    
    public static UCDProperty make(String propAndValue, UCD ucd) {
        return make(getPropmask(propAndValue, ucd), ucd);
    }
    
    public static UnicodeSet getSet(int propMask, UCD ucd) {
        UCDProperty up = make(propMask, ucd);
        return up.getSet();
    }
    
    public static UnicodeSet getSet(String propAndValue, UCD ucd) {
        return getSet(getPropmask(propAndValue, ucd), ucd);
    }
    
    private static Map propNameCache = null;
    
    public static int getPropmask(String propAndValue, UCD ucd) {
        
        // cache the names
        if (propNameCache == null) {
            System.out.println("Caching Property Names");
            propNameCache = new HashMap();
        
            for (int i = 0; i < LIMIT_ENUM; ++i) {
                UCDProperty up = UnifiedBinaryProperty.make(i, ucd);
                if (up == null) continue;
                if (!up.isStandard()) continue;
                if (up.getValueType() < BINARY_PROP) continue;
                String shortValue = Utility.getSkeleton(up.getValue(SHORT));
                String shortName = Utility.getSkeleton(up.getPropertyName(SHORT));
                String longValue = Utility.getSkeleton(up.getValue(LONG));
                String longName = Utility.getSkeleton(up.getPropertyName(LONG));
                Integer result = new Integer(i);
                propNameCache.put(longName + "=" + longValue, result);
                propNameCache.put(longName + "=" + shortValue, result);
                propNameCache.put(shortName + "=" + longValue, result);
                propNameCache.put(shortName + "=" + shortValue, result);
            }
            System.out.println("Done Caching");
        }
        
        propAndValue = Utility.getSkeleton(propAndValue);
        Integer indexObj = (Integer) propNameCache.get(propAndValue);
        if (indexObj == null) {
            throw new IllegalArgumentException("No property found for " + propAndValue);
        }
        return indexObj.intValue();
    }
    
    static Map cache = new HashMap();
    static UCD lastUCD = null;
    static int lastPropMask = -1;
    static UnifiedBinaryProperty lastValue = null;
    static Clump probeClump = new Clump();
    
    static class Clump {
        int prop;
        UCD ucd;
        public boolean equals(Object other) {
            Clump that = (Clump) other;
            return (that.prop != prop || !ucd.equals(that));
        }
    }
    
    private static UnifiedBinaryProperty getCached(int propMask, UCD ucd) {
        if (ucd.equals(lastUCD) && propMask == lastPropMask) return lastValue;
        probeClump.prop = propMask;
        probeClump.ucd = ucd;
        UnifiedBinaryProperty dp = (UnifiedBinaryProperty) cache.get(probeClump);
        if (dp == null) {
            dp = new UnifiedBinaryProperty(propMask, ucd);
            cache.put(probeClump, dp);
            probeClump = new Clump();
        }
        lastUCD = ucd;
        lastValue = dp;
        lastPropMask = propMask;
        return dp;
    }
    
    /////////////////////////////////
    
    private UnifiedBinaryProperty(int propMask, UCD ucdin) {
        ucd = ucdin;
        majorProp = propMask >> 8;
        propValue = propMask & 0xFF;
        
        //System.out.println("A: " + getValueType());
        if (majorProp <= (JOINING_GROUP>>8) 
                || majorProp == (SCRIPT>>8) 
                || majorProp==(HANGUL_SYLLABLE_TYPE>>8)) {
            setValueType(FLATTENED_BINARY_PROP);
        }
        //System.out.println("B: " + getValueType());
        
        header = UCD_Names.UNIFIED_PROPERTY_HEADERS[majorProp];
        name = UCD_Names.UNIFIED_PROPERTIES[majorProp];
        shortName = UCD_Names.SHORT_UNIFIED_PROPERTIES[majorProp];
        
        valueName = _getValue(LONG);
        shortValueName = _getValue(SHORT);
        numberValueName = _getValue(NUMBER);
        defaultValueStyle = _getDefaultStyle();
        
        if (majorProp == (BINARY_PROPERTIES>>8)) {
            name = ucd.getBinaryPropertiesID_fromIndex((byte)propValue, LONG);
            shortName = ucd.getBinaryPropertiesID_fromIndex((byte)propValue, SHORT);
            defaultPropertyStyle = defaultValueStyle;
            valueName = "True";
            shortValueName = "T";
        }
        
        // System.out.println("Value = " + getValue(defaultValueStyle));
        // System.out.println(majorProp + ", " + propValue + ", " + name);
        // dp = new DerivedProperty(ucd);
    }
    
    /*
    public boolean isTest(int propMask) {
        int enum = propMask >> 8;
        propMask &= 0xFF;
        if (enum != (DERIVED>>8)) return false;
        return DerivedProperty.make(propMask, ucd).isTest();
    }
    */
    
    /**
     * @return unified property number
     */
     /*
    public boolean isDefined(int propMask) {
        int enum = propMask >> 8;
        propMask &= 0xFF;
        switch (enum) {
          case CATEGORY>>8: return propMask != UNUSED_CATEGORY && propMask < LIMIT_CATEGORY;
          case COMBINING_CLASS>>8: return true;
          // ucd.isCombiningClassUsed((byte)propMask) 
          //  || !ucd.getCombiningID_fromIndex ((byte)propMask, SHORT).startsWith("Fixed");
          case BIDI_CLASS>>8: return propMask != BIDI_UNUSED && propMask < LIMIT_BIDI_CLASS;
          case DECOMPOSITION_TYPE>>8: return propMask < LIMIT_DECOMPOSITION_TYPE;
          case NUMERIC_TYPE>>8: return propMask < LIMIT_NUMERIC_TYPE;
          case EAST_ASIAN_WIDTH>>8: return propMask < LIMIT_EAST_ASIAN_WIDTH;
          case LINE_BREAK>>8: return propMask < LIMIT_LINE_BREAK;
          case JOINING_TYPE>>8: return propMask < LIMIT_JOINING_TYPE;
          case JOINING_GROUP>>8: return propMask < LIMIT_JOINING_GROUP;
          case BINARY_PROPERTIES>>8: return propMask < LIMIT_BINARY_PROPERTIES;
          case SCRIPT>>8: return propMask != UNUSED_SCRIPT && propMask < LIMIT_SCRIPT;
          case AGE>>8: return propMask < LIMIT_AGE;
          case DERIVED>>8: 
            UnicodeProperty up = DerivedProperty.make(propMask, ucd);
            return (up != null);
          default: return false;
        }
    }
    */
    
    static private boolean isDefined(int propMask, UCD ucd) {
        int majorProp = propMask >> 8;
        int propValue = propMask & 0xFF;
        switch (majorProp) {
          case CATEGORY>>8: if (propValue >= LIMIT_CATEGORY) break;
            if (propValue == UNUSED_CATEGORY) break;
            return true;
          case COMBINING_CLASS>>8: if (propValue >= LIMIT_COMBINING_CLASS) break;
            return ucd.isCombiningClassUsed((byte)propValue);
          case BIDI_CLASS>>8: if (propValue >= LIMIT_BIDI_CLASS) break;
            if (propValue == BIDI_UNUSED) break;
            return true;
          case DECOMPOSITION_TYPE>>8: if (propValue >= LIMIT_DECOMPOSITION_TYPE) break;
            return true;
          case NUMERIC_TYPE>>8: if (propValue >= LIMIT_NUMERIC_TYPE) break;
            return true;
          case EAST_ASIAN_WIDTH>>8: if (propValue >= LIMIT_EAST_ASIAN_WIDTH) break;
            return true;
          case LINE_BREAK>>8:  if (propValue >= LIMIT_LINE_BREAK) break;
            return true;
          case JOINING_TYPE>>8: if (propValue >= LIMIT_JOINING_TYPE) break;
            return true;
          case JOINING_GROUP>>8: if (propValue >= LIMIT_JOINING_GROUP) break;
            return true;
          case BINARY_PROPERTIES>>8: if (propValue >= LIMIT_BINARY_PROPERTIES) break;
            return true;
          case SCRIPT>>8: if (propValue >= LIMIT_SCRIPT) break;
            if (propValue == UNUSED_SCRIPT) break;
            return true;
          case AGE>>8: if (propValue >= LIMIT_AGE) break;
            return true;
          case HANGUL_SYLLABLE_TYPE>>8: if (propValue >= HANGUL_SYLLABLE_TYPE_LIMIT) break;
            return true;
            /*
          case DERIVED>>8:
            UnicodeProperty up = DerivedProperty.make(propValue, ucd);
            if (up == null) break;
            return up.hasValue(cp);
            */
        }
        return false;
    }
    
    public boolean skipInDerivedListing() {
        switch ((majorProp<<8) | propValue) {
            //case CATEGORY | Cn:
            //case COMBINING_CLASS | 0:
            //case BIDI_CLASS | BIDI_L:
            case DECOMPOSITION_TYPE | NONE:
            case NUMERIC_TYPE | NUMERIC_NONE:
            // case EAST_ASIAN_WIDTH | EAN:
            // case LINE_BREAK | LB_XX:
            case JOINING_TYPE | JT_U:
            case JOINING_GROUP | NO_SHAPING:
            case SCRIPT | COMMON_SCRIPT:
            case HANGUL_SYLLABLE_TYPE | NA:
            case BINARY_PROPERTIES | Non_break:
            case BINARY_PROPERTIES | CaseFoldTurkishI:
                return true;
        }
        return false;
    }
      
    public boolean isDefaultValue() {
        switch (majorProp) {
            case CATEGORY>>8:           return propValue == Cn;
            case COMBINING_CLASS>>8:    return propValue == 0;
            case BIDI_CLASS>>8:         return propValue == BIDI_L;
            case DECOMPOSITION_TYPE>>8: return propValue == NONE;
            case NUMERIC_TYPE>>8:       return propValue == NUMERIC_NONE;
            case EAST_ASIAN_WIDTH>>8:   return propValue == EAN;
            case LINE_BREAK>>8:         return propValue == LB_XX;
            case JOINING_TYPE>>8:       return propValue == JT_U;
            case JOINING_GROUP>>8:      return propValue == NO_SHAPING;
            case SCRIPT>>8:             return propValue == COMMON_SCRIPT;
            case HANGUL_SYLLABLE_TYPE>>8: return propValue == NA;
        }
        return false;
    }
      
    public boolean hasValue(int cp) {
        try {
            switch (majorProp) {
            case CATEGORY>>8: return ucd.getCategory(cp) == propValue;
            case COMBINING_CLASS>>8: return ucd.getCombiningClass(cp) == propValue;
            case BIDI_CLASS>>8: return ucd.getBidiClass(cp) == propValue;
            case DECOMPOSITION_TYPE>>8: return ucd.getDecompositionType(cp) == propValue;
            case NUMERIC_TYPE>>8: return ucd.getNumericType(cp) == propValue;
            case EAST_ASIAN_WIDTH>>8: return ucd.getEastAsianWidth(cp) == propValue;
            case LINE_BREAK>>8: return ucd.getLineBreak(cp) == propValue;
            case JOINING_TYPE>>8: return ucd.getJoiningType(cp) == propValue;
            case JOINING_GROUP>>8: return ucd.getJoiningGroup(cp) == propValue;
            case BINARY_PROPERTIES>>8: return ucd.getBinaryProperty(cp, propValue);
            case SCRIPT>>8: return ucd.getScript(cp) == propValue;
            case AGE>>8: return ucd.getAge(cp) == propValue;
            case HANGUL_SYLLABLE_TYPE>>8: return ucd.getHangulSyllableType(cp) == propValue;
            // return true;
                /*
            case DERIVED>>8:
                UnicodeProperty up = DerivedProperty.make(propValue, ucd);
                if (up == null) break;
                return up.hasValue(cp);
                */
            }
            throw new ChainException("Illegal property Number {0}, {1}", new Object[]{
                    new Integer(majorProp), new Integer(propValue)});
        } catch (RuntimeException e) {
            throw new ChainException("Illegal property Number {0}, {1}", new Object[]{
                 new Integer(majorProp), new Integer(propValue)}, e);
        }
    }

/*
    public static String getID(UCD ucd, int unifiedPropMask) {
        String longOne = getID(ucd, unifiedPropMask, LONG);
        String shortOne = getID(ucd, unifiedPropMask, SHORT);
        if (longOne.equals(shortOne)) return longOne;
        return shortOne + "(" + longOne + ")";
    }
*/
    public String getFullName(byte style) {
        String pre = "";
        /*if ((majorProp) != BINARY_PROPERTIES>>8)*/ {
            String preShort = getPropertyName(SHORT) + "=";
            String preLong = getPropertyName(LONG) + "=";
            if (style < LONG) pre = preShort;
            else if (style == LONG || preShort.equals(preLong)) pre = preLong;
            else pre = preShort + "(" + preLong + ")";
        }
        String shortOne = getValue(SHORT);
        if (shortOne.length() == 0) shortOne = "xx";
        String longOne = getValue(LONG);
        if (majorProp == (SCRIPT>>8)) {
        	longOne = Default.ucd().getCase(longOne, FULL, TITLE);
       	} 
        if (longOne.length() == 0) longOne = "none";

        String post;
        if (style < LONG) post = shortOne;
        else if (style == LONG || shortOne.equals(longOne)) post = longOne;
        else post = shortOne + "(" + longOne + ")";

        if (pre.length() == 0) {
            pre = post + "=";
            post = "T";
        }

        return pre + post;
    }

    public String _getValue(byte style) {
        try {
            switch (majorProp) {
            case CATEGORY>>8: return ucd.getCategoryID_fromIndex((byte)propValue, style);
            case COMBINING_CLASS>>8: return ucd.getCombiningClassID_fromIndex((byte)propValue, style);
            case BIDI_CLASS>>8: return ucd.getBidiClassID_fromIndex((byte)propValue, style);
            case DECOMPOSITION_TYPE>>8: return ucd.getDecompositionTypeID_fromIndex((byte)propValue, style);
            case NUMERIC_TYPE>>8: return ucd.getNumericTypeID_fromIndex((byte)propValue, style);
            case EAST_ASIAN_WIDTH>>8: return ucd.getEastAsianWidthID_fromIndex((byte)propValue, style);
            case LINE_BREAK>>8: return ucd.getLineBreakID_fromIndex((byte)propValue, style);
            case JOINING_TYPE>>8: return ucd.getJoiningTypeID_fromIndex((byte)propValue, style);
            case JOINING_GROUP>>8: return ucd.getJoiningGroupID_fromIndex((byte)propValue, style);
            case BINARY_PROPERTIES>>8: return ucd.getBinaryPropertiesID_fromIndex((byte)propValue, style);
            case SCRIPT>>8: return ucd.getScriptID_fromIndex((byte)propValue, style);
            case AGE>>8: return ucd.getAgeID_fromIndex((byte)propValue);
            case HANGUL_SYLLABLE_TYPE>>8: return ucd.getHangulSyllableTypeID_fromIndex((byte)propValue, style);
                /*
            case DERIVED>>8:
                UnicodeProperty up = DerivedProperty.make(propValue, ucd);
                if (up == null) break;
                return up.getName(style);
                */
            }
        } catch (RuntimeException e) {
            throw new ChainException("Illegal property Number* {0}, {1}", new Object[]{
                 new Integer(majorProp), new Integer(propValue)}, e);
        }
        throw new ChainException("Illegal property Number {0}, {1}", new Object[]{
                new Integer(majorProp), new Integer(propValue)});
    }
    
    public byte _getDefaultStyle() {
        try {
            switch (majorProp) {
            case CATEGORY>>8: return SHORT;
            case COMBINING_CLASS>>8: return NUMBER;
            case BIDI_CLASS>>8: return SHORT;
            case DECOMPOSITION_TYPE>>8: return LONG;
            case NUMERIC_TYPE>>8: return LONG;
            case EAST_ASIAN_WIDTH>>8: return SHORT;
            case LINE_BREAK>>8:  return SHORT;
            case JOINING_TYPE>>8: return SHORT;
            case JOINING_GROUP>>8: return LONG;
            case BINARY_PROPERTIES>>8: return LONG;
            case SCRIPT>>8: return LONG;
            case AGE>>8: return LONG;
            case HANGUL_SYLLABLE_TYPE>>8: return SHORT;
            }
        } catch (RuntimeException e) {
            throw new ChainException("Illegal property Number {0}, {1}", new Object[]{
                 new Integer(majorProp), new Integer(propValue)}, e);
        }
        throw new ChainException("Illegal property Number {0}, {1}", new Object[]{
                new Integer(majorProp), new Integer(propValue)});
    }
    
}