using System;
using System.IO;

namespace CreateCorpusSLA
{
    class Program
    {
        static void Main(string[] args)
        {
            CreateCorpus cc = new CreateCorpus();

            Console.WriteLine("args={0}\n", string.Join(",", args));

            if (!cc.ParseArguments(args))
            {
                PrintUsage();
                goto Exit;
            }
            if (cc.CreateSeparateDB)
            {
                // ターゲットが複数DBである場合は、入力フォルダの各ファイルについてループ
                // SQLiteの場合:
                //   出力としてフォルダパスを指定した場合にここに来る.
                //   出力は、指定されたフォルダの下、入力ファイルのファイル名部分+".db"という名前のファイル
                // MySQL等の場合:
                //   "Separate Database"チェックボックスをONにした場合にここに来る.
                //   出力は、入力ファイルのファイル名部分と同じ名前のデータベース
                string ipath = cc.InputPath;
                if (!CreateCorpus.PathIsFolder(ipath))
                {
                    Console.WriteLine("Input Path must be a folder name when -p is set.");
                    goto Exit;
                }
                string opath = cc.CorpusName;
                string folder = string.Empty;
                if (CreateCorpus.PathIsFolder(opath))
                {
                    folder = opath;
                }
                else
                {
                    folder = Path.GetDirectoryName(opath);
                }
                string[] files = Directory.GetFileSystemEntries(ipath);
                foreach (string s in files)
                {
                    if (CreateCorpus.PathIsFolder(s)) continue;

                    cc.InputPath = s;
                    cc.CorpusName = Path.GetFileNameWithoutExtension(s);
                    cc.ForceCheckInputExtension = true;
                    if (cc.DbType == "SQLite")
                    {
                        // フォルダと拡張子を追加
                        cc.CorpusName = string.Format("{0}\\{1}.db", folder, cc.CorpusName);
                    }
                    DoJobs(cc);
                }
            }
            else
            {
                DoJobs(cc);
            }
            if (cc.DoNotPauseOnExit)
            {
                return;
            }
        Exit:
            Console.WriteLine("\nPress Enter to exit.");
            Console.ReadLine();
        }

        static private void DoJobs(CreateCorpus cc)
        {
            DateTime t0 = DateTime.Now;
            Console.WriteLine("[{0}]: Started at {1}", cc.InputPath, t0.ToLocalTime());

            cc.InitializeDocumentSet();

            if (!cc.CheckInput()) return;

            if (cc.IsCreatingDictionary)
            {
                if (!cc.ParseDictionaryInput()) return;
                if (!cc.SaveLexicon()) return;
            }
            else
            {
                if (!cc.ParseBibFile()) return;
                if (!cc.ParseInput()) return;
                if (!cc.SaveProject()) return;
                if (!cc.SaveLexicon()) return;
                if (!cc.SaveSentences()) return;
                if (!cc.SaveSentenceTags()) return;
                if (!cc.UpdateIndex()) return;
            }
            DateTime t1 = DateTime.Now;
            TimeSpan elapsed = t1 - t0;
            Console.WriteLine("Done.");
            Console.WriteLine("Finished at {0}; Elapsed {1} minutes", t1.ToLocalTime(), elapsed.TotalMinutes);
        }

        static void PrintUsage()
        {
            Console.WriteLine("Usage: CreateCorpus [Options] <InputFile> <Output>");
            Console.WriteLine("Options:");
            Console.WriteLine("  [-e=<encoding>] Input Encoding (SHIFT_JIS)");
            Console.WriteLine("  [-t=<type>]     Reader Type; See ReaderDefs.xml (Auto)");
            Console.WriteLine("  [-b=<bibfile>]  Use external .bib file");
            Console.WriteLine("  [-l=<dicfile>]  Use external dictionary");
            Console.WriteLine("  [-d]            Create Dictionary instead of Corpus");
            Console.WriteLine("  [-s]            Set SQLite Synchronous Write mode (false)");
            Console.WriteLine("  [-p]            Make different database for each input when read from folder (false)");
            Console.WriteLine("  [-C]            Do not pause on exit (false)");
            Console.WriteLine("InputFile         cabocha/chasen/mecab/text file");
            Console.WriteLine("Output            .db file for SQLite / .def file for Others / .ddb file for SQLite Dictionary");
        }
    }
}
