/*
 * ******************************************************************************
 * Copyright (C) 2007, International Business Machines Corporation and others.
 * All Rights Reserved.
 * ******************************************************************************
 */
package com.ibm.icu.dev.tool.tzu;

import java.io.File;
import java.io.IOException;
import java.util.Locale;

/**
 * Entry point for the ICUTZU tool.
 */
public class ICUTZUMain {
    /**
     * Argument number for the backup directory.
     */
    public static final int BACKUP_DIR = 4;

    /**
     * Argument number for the current directory.
     */
    public static final int CUR_DIR = 0;

    /**
     * Argument number for the icon file.
     */
    public static final int ICON_FILE = 5;

    /**
     * Number of arguments.
     */
    public static final int NUM_ARGS = 6;

    /**
     * Argument number for the path list file.
     */
    public static final int PATH_FILE = 1;

    /**
     * Argument number for the result list file.
     */
    public static final int RESULT_FILE = 2;

    /**
     * Argument number for the timezone resource file.
     */
    public static final int TZ_FILE = 3;

    /**
     * Entry point for the ICUTZU tool.
     * 
     * @param args
     *            The list of arguments. Should be in the following order:
     *            <ul>
     *            <li>Current directory</li>
     *            <li>Path list file</li>
     *            <li>Result list file</li>
     *            <li>Timezone resource file</li>
     *            <li>Backup directory</li>
     *            </ul>
     *            All directories and paths should be relative to the given
     *            current directory.
     */
    public static void main(String[] args) {
        try {
            // TODO: fix this to properly set the user agent
            String agent = "ICUTZU/1.0 (" + System.getProperty("os.name") + " "
                    + System.getProperty("os.version") + "; "
                    + Locale.getDefault().toString() + ")";
            System.setProperty("http.agent", agent);

            if (args.length == 0) {
                // in the case of running without commandline options
                File curDir = new File(".");
                try {
                    curDir = curDir.getCanonicalFile();
                } catch (IOException ex) {
                    curDir = curDir.getAbsoluteFile();
                }

                new GUILoader(curDir, new File("Temp").getAbsoluteFile(),
                        new File("DirectorySearch.txt").getAbsoluteFile(),
                        new File("ICUList.txt").getAbsoluteFile(), new File(
                                "zoneinfo.res").getAbsoluteFile(), new File(
                                "icu.gif").getAbsoluteFile());
                return;
            } else if (args.length != NUM_ARGS) {
                System.err.println("Incorrect number of arguments.");
                System.err
                        .println("Syntax: ICUTZUMain <cur dir> <path file> <result file> <tz file> <backup dir>");
                System.exit(-1);
            } else {

                File curDir = new File(args[CUR_DIR]);
                try {
                    curDir = curDir.getCanonicalFile();
                } catch (IOException ex) {
                    curDir = curDir.getAbsoluteFile();
                }

                File backupDir = new File(curDir, args[BACKUP_DIR])
                        .getAbsoluteFile();
                File pathFile = new File(curDir, args[PATH_FILE])
                        .getAbsoluteFile();
                File resultFile = new File(curDir, args[RESULT_FILE])
                        .getAbsoluteFile();
                File tzFile = new File(curDir, args[TZ_FILE]).getAbsoluteFile();
                File iconFile = new File(curDir, args[ICON_FILE])
                        .getAbsoluteFile();

                if ("true".equalsIgnoreCase(System.getProperty("nogui")))
                    new CLILoader(curDir, backupDir, pathFile, resultFile,
                            tzFile);
                else
                    new GUILoader(curDir, backupDir, pathFile, resultFile,
                            tzFile, iconFile);
            }
        } catch (Throwable ex) {
            // should any unexplained exception occur, we should exit
            // abnormally. ideally, this should never happen.
            System.err.println("Internal program error.");
            ex.printStackTrace();
            System.exit(-1);
        }
    }
}
