/*
 *******************************************************************************
 * 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;


public class ScriptList
{
    static class LangSysRecord extends TaggedRecord
    {
        private Feature[] features;
        private int featureCount;
        
        public LangSysRecord(String theLanguageTag)
        {
            super(theLanguageTag);
            
            features = new Feature[10];
            featureCount = 0;
        }
        
        public void addFeature(Feature feature)
        {
            if (featureCount > features.length) {
                Feature[] newFeatures = new Feature[features.length + 5];
                
                System.arraycopy(features, 0, newFeatures, 0, features.length);
                features = newFeatures;
            }
            
            features[featureCount++] = feature;
        }
        
         public void writeLangSysRecord(OpenTypeTableWriter writer)
        {
            writer.writeData(0);      // lookupOrder (must be NULL)
            writer.writeData(0xFFFF); // reqFeatureIndex (0xFFFF means none)
            
            writer.writeData(featureCount);
            
            for (int i = 0; i < featureCount; i += 1) {
                writer.writeData(features[i].getFeatureIndex());
            }
        }
    }
    
    static class ScriptRecord extends TaggedRecord
    {
        private LangSysRecord[] langSysRecords;
        private int langSysCount;
        
        public ScriptRecord(String theScriptTag)
        {
            super(theScriptTag);
            langSysRecords = new LangSysRecord[10];
            langSysCount = 0;
        }
        
        public LangSysRecord findLangSysRecord(String languageTag)
        {
            for (int i = 0; i < langSysCount; i += 1) {
                LangSysRecord langSysRecord = langSysRecords[i];
                
                if (langSysRecord.getTag().equals(languageTag)) {
                    return langSysRecord;
                }
            }
            
            if (langSysCount >= langSysRecords.length) {
                LangSysRecord[] newLangSysRecords = new LangSysRecord[langSysCount + 5];
                
                System.arraycopy(langSysRecords, 0, newLangSysRecords, 0, langSysRecords.length);
                langSysRecords = newLangSysRecords;
            }
            
            LangSysRecord newLangSysRecord = new LangSysRecord(languageTag);
            langSysRecords[langSysCount] = newLangSysRecord;
            
            langSysCount += 1;
            return newLangSysRecord;
        }
        
        public void writeScriptRecord(OpenTypeTableWriter writer)
        {
            TaggedRecord.sort(langSysRecords, langSysCount);
            
            int scriptTableBase = writer.getOutputIndex();
            int firstLangSys = 0;
            
            writer.writeData(0); // default langSys offset (fixed later)
            
            if (langSysRecords[0].getTag().equals("(default)")) {
                firstLangSys = 1;
            }
            
            writer.writeData(langSysCount - firstLangSys);
            
            int langSysOffset = writer.getOutputIndex();
            
            for (int i = firstLangSys; i < langSysCount; i += 1) {
                writer.writeTag(langSysRecords[i].getTag());
                writer.writeData(0);
            }
            
            if (firstLangSys > 0) {
                System.out.print(" (default)");
                writer.fixOffset(scriptTableBase, scriptTableBase);
                langSysRecords[0].writeLangSysRecord(writer);
            }
            
            for (int i = firstLangSys; i < langSysCount; i += 1) {
                // fix the offset in the langSysRecordArray.
                // The "+2" skips over the tag and the "+3"
                // skips to the next langSysRecord entry
                writer.fixOffset(langSysOffset + 2, scriptTableBase);
                langSysOffset += 3;
                
                System.out.print(" '" + langSysRecords[i].getTag() + "'");
                langSysRecords[i].writeLangSysRecord(writer);
            }
        }
    }
    
    private ScriptRecord[] scriptRecords;
    private int scriptCount;
    
    public ScriptList()
    {
        scriptRecords = new ScriptRecord[10];
        scriptCount = 0;
    }
    
    private LangSysRecord findLangSysRecord(String scriptTag, String languageTag)
    {
        for (int i = 0; i < scriptCount; i += 1) {
            ScriptRecord scriptRecord = scriptRecords[i];
            
            if (scriptRecord.getTag().equals(scriptTag)) {
                 return scriptRecord.findLangSysRecord(languageTag);
            }
        }
        
        if (scriptCount >= scriptRecords.length) {
            ScriptRecord[] newScriptRecords = new ScriptRecord[scriptCount + 5];
            
            System.arraycopy(scriptRecords, 0, newScriptRecords, 0, scriptRecords.length);
            scriptRecords = newScriptRecords;
        }
        
        ScriptRecord newScriptRecord = new ScriptRecord(scriptTag);
        scriptRecords[scriptCount] = newScriptRecord;
        
        scriptCount += 1;
        return newScriptRecord.findLangSysRecord(languageTag);
    }
    
    public void addFeature(String scriptTag, String languageTag, Feature feature)
    {
        LangSysRecord langSysRecord = findLangSysRecord(scriptTag, languageTag);
        
        langSysRecord.addFeature(feature);
    }
    
    public void writeScriptList(OpenTypeTableWriter writer)
    {
        System.out.println("writing script list...");
        
        int scriptListBase = writer.getOutputIndex();
        
        TaggedRecord.sort(scriptRecords, scriptCount);
        writer.writeData(scriptCount);
        
        int scriptRecordOffset = writer.getOutputIndex();
        
        for (int i = 0; i < scriptCount; i += 1) {
            writer.writeTag(scriptRecords[i].getTag());
            writer.writeData(0);
        }
        
        for (int i = 0; i < scriptCount; i += 1) {
            // fix the offset in the scriptRecordArray.
            // The "+2" skips over the tag and the "+3"
            // skips to the next scriptRecord entry
            writer.fixOffset(scriptRecordOffset + 2, scriptListBase);
            scriptRecordOffset += 3;
            
            System.out.print("  script '" + scriptRecords[i].getTag() + "':");
            scriptRecords[i].writeScriptRecord(writer);
            System.out.println();
        }
    }
}
        