// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
/*
 *******************************************************************************
 * Copyright (C) 1998-2004, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * Created on Dec 3, 2003
 *
 *******************************************************************************
 */
package com.ibm.icu.dev.tool.layout;

import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.lang.UProperty;
import com.ibm.icu.text.Normalizer;
import com.ibm.icu.text.UnicodeSet;

public class ArabicCharacterData
{
    public class Record
    {
        public int getCodePoint()
        {
            return codePoint;
        }
        
        public int getGeneralCategory()
        {
            return generalCategory;
        }
        
        public int getDecompositionType()
        {
            return decompositionType;
        }
        
        public String getDecomposition()
        {
            return decomposition;
        }
        
        private Record(int character)
        {
            codePoint         = character;
            generalCategory   = UCharacter.getType(character);
            decompositionType = UCharacter.getIntPropertyValue(character, UProperty.DECOMPOSITION_TYPE);
            
            switch (decompositionType) {
            case UCharacter.DecompositionType.FINAL:
            case UCharacter.DecompositionType.INITIAL:
            case UCharacter.DecompositionType.ISOLATED:
            case UCharacter.DecompositionType.MEDIAL:
                decomposition = Normalizer.compose(UCharacter.toString(character), true);
                break;
                
            case UCharacter.DecompositionType.CANONICAL:
                decomposition = Normalizer.decompose(UCharacter.toString(character), true);
                break;
                
            default:
                decomposition = null;
            }
        }
        
        private int codePoint;
        private int generalCategory;
        private int decompositionType;
        private String decomposition;
    }
    
    private ArabicCharacterData(int charCount)
    {
        records = new Record[charCount];
    }
    
    private void add(int character)
    {
        records[recordIndex++] = new Record(character);
    }
    
    public Record getRecord(int index)
    {
        if (index < 0 || index >= records.length) {
            return null;
        }
        
        return records[index];
    }
    
    public int countRecords()
    {
        return records.length;
    }
 
    // TODO: do we need to change this to use UnicodeSetIterator?
    // That will mean not knowing the number of characters until
    // after the iteration is done, so we'd have to use a vector
    // to hold the Records at first and copy it to an array
    // when we're done...   
    public static ArabicCharacterData factory(UnicodeSet characterSet)
    {
        int charCount = characterSet.size();
        ArabicCharacterData data = new ArabicCharacterData(charCount);
        
        for (int i = 0; i < charCount; i += 1) {
            data.add(characterSet.charAt(i));
        }
        
        return data;
    }
    
    private Record[] records;
    private int recordIndex = 0;
}
