/*
 *******************************************************************************
 * Copyright (C) 1998-2005, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.dev.tool.layout;

public class ScriptTagModuleWriter extends ScriptModuleWriter
{
    
    private int scriptTag(String tag)
    {
        int result = 0;
        
        for (int i = 0; i < 4; i += 1) {
            result <<= 8;
            result += (int) (tag.charAt(i) & 0xFF);
        }
        
        return result;
    }
    
    public ScriptTagModuleWriter(ScriptData theScriptData, LanguageData theLanguageData)
    {
        super(theScriptData, theLanguageData);
    }
    
    private void writeTagValueHeader(TagValueData data, String kind)
    {
        int min = data.getMinValue();
        int max = data.getMaxValue();

        for (int value = min; value <= max; value += 1) {
            output.print("const LETag ");
            output.print(data.getTagLabel(value));
            output.print(kind);
            output.print("Tag = ");
            output.print(data.makeTag(value));
            output.print("; /* '");
            output.print(data.getTag(value));
            output.print("' (");
            output.print(data.getName(value));
            output.println(") */");
        }
    }
    
    public void writeHeaderFile(String fileName)
    {
        openFile(fileName);
        writeHeader("__SCRIPTANDLANGUAGES_H", hIncludes, hPreamble);
        
        writeTagValueHeader(scriptData, "Script");
        
        output.println(hScriptPostamble);
        
        writeTagValueHeader(languageData, "Language");
        
        output.println(hPostamble);
        closeFile();
    }
    
    private void writeTagValueCPP(TagValueData data, String kind)
    {
        int min = data.getMinValue();
        int max = data.getMaxValue();
        
        for (int value = min; value <= max; value += 1) {
            output.print("    ");
            output.print(data.getTagLabel(value));
            output.print(kind);
            output.print("Tag");
            output.print((value == max? " " : ","));
            output.print(" /* '");
            output.print(data.getTag(value));
            output.print("' (");
            output.print(data.getName(value));
            output.println(") */");
        }
    }
    
    public void writeCPPFile(String fileName)
    {
        openFile(fileName);
        writeHeader(null, cppIncludes);
        output.println(cppPreamble);
        
        writeTagValueCPP(scriptData, "Script");
        
        output.println(cppScriptPostamble);
        
        writeTagValueCPP(languageData, "Language");
        
        output.println(cppPostamble);
        
        writeTrailer();
        closeFile();
    }
    
    public void writeScriptTags(String fileName)
    {
        writeHeaderFile(fileName + ".h");
        writeCPPFile(fileName + ".cpp");
    }

    private static final String[] hIncludes = {"LETypes.h"};

    private static final String hPreamble = 
    "/**\n" +
    " * \\file\n" +
    " * \\internal\n" +
    " */\n" +
    "\n";
    
    private static final String hScriptPostamble =
    "\n" +
    "const LETag nullScriptTag = 0x00000000; /* ''     (NULL) */\n" +
    "\n";
    
    private static final String hPostamble =
    "\n" +
    "\n" +
    "U_NAMESPACE_END\n" +
    "#endif";
    
    private static final String[] cppIncludes =
        {"LETypes.h", "ScriptAndLanguageTags.h", "OpenTypeLayoutEngine.h"};
    
    private static final String cppPreamble = 
    "const LETag OpenTypeLayoutEngine::scriptTags[] = {";
    
    private static final String cppScriptPostamble =
    "};\n" +
    "\n" +
    "const LETag OpenTypeLayoutEngine::languageTags[] = {";
    
    private static final String cppPostamble =
    "};\n";
}