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