/*
 * blanco Framework
 * Copyright (C) 2004-2007 IGA Tosiki
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.text.converter;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import blanco.commons.util.BlancoJavaSourceUtil;
import blanco.text.converter.valueobject.BlancoTextConverterSrcTxtStructure;

/**
 * 「ソーステキスト」から「HTMLファイル」に変換します。
 * 
 * この前に、SrcTxtへのインポート展開は終了している必要がありそうです。
 */
public class BlancoTextConverterSrcTxt2Html {
    public void convert(final BufferedReader argReader,
            final BufferedWriter argWriter) throws IOException {
        final BlancoTextConverterSrcTxtStructure structure = parse(argReader);

        // 次に書き込み！
        structure2File(structure, argWriter);

        System.out.println(structure.toString());
    }

    private BlancoTextConverterSrcTxtStructure parse(
            final BufferedReader argReader) throws IOException {
        final BlancoTextConverterSrcTxtStructure structure = new BlancoTextConverterSrcTxtStructure();

        boolean isBodyStarted = false;

        for (;;) {
            final String line = argReader.readLine();
            if (line == null) {
                break;
            }

            if (isBodyStarted == false) {
                // 行頭からの開始の場合にのみ判断します。
                // あと : 直後の先頭空白は無視するように変更したい。
                if (line.startsWith("Subject:")) {
                    structure.setSubject(line.substring("Subject:".length()));
                } else if (line.startsWith("Description:")) {
                    structure.setDescription(line.substring("Description:"
                            .length()));
                } else if (line.startsWith("Keywords:")) {
                    structure.setKeywords(line.substring("Keywords:".length()));
                } else if (line.startsWith("Date:")) {
                    try {
                        final SimpleDateFormat sdFormat = new SimpleDateFormat(
                                "yyyy-MM-dd");
                        structure.setDate(sdFormat.parse(line.substring("Date:"
                                .length())));
                    } catch (ParseException e) {
                        // たとえ吹き飛んだとしても無視します。
                        e.printStackTrace();
                    }
                } else if (line.trim().length() == 0) {
                    // ボディ領域の開始。
                    isBodyStarted = true;
                } else {
                    // これは あってはなりません。
                    System.out.println("パースに失敗[" + line + "]。無視します。");
                }
            } else {
                // ボディ領域です。

                // TODO 本来、ここで文書構造の解析をおこないます。
                // TODO まずさきに [[]]の解析をおこないます。これ重要。
                // TODO 1文字目から文字があればタイトル、など。

                // TODO 空行があってから、はじめてブロック <P></P>の単位と判断したい。
                structure.getLineList().add(line);
            }
        }

        return structure;
    }

    private void structure2File(
            final BlancoTextConverterSrcTxtStructure argStructure,
            final BufferedWriter argWriter) throws IOException {
        argWriter
                .write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        argWriter.newLine();

        argWriter.write("<HTML lang=\"ja\">");
        argWriter.newLine();

        argWriter.write("<HEAD>");
        argWriter.newLine();

        argWriter.write("<TITLE>");
        // TODO HTMLのエスケープ処理。
        argWriter.write(argStructure.getSubject());
        argWriter.write("</TITLE>");
        argWriter.newLine();

        // TODO HTMLのエスケープ処理。
        argWriter.write("<META name=\"DESCRIPTION\" content=\""
                + argStructure.getDescription() + "\">");
        argWriter.newLine();

        // TODO HTMLのエスケープ処理。
        argWriter.write("<META name=\"KEYWORDS\" content=\""
                + argStructure.getKeywords() + "\">");
        argWriter.newLine();

        argWriter.write("</HEAD>");
        argWriter.newLine();

        argWriter.write("<BODY bgcolor=\"#eeddcc\">");
        argWriter.newLine();

        for (int index = 0; index < argStructure.getLineList().size(); index++) {
            final String line = (String) argStructure.getLineList().get(index);
            if (line.length() > 2) {
                if (line.charAt(0) != ' ') {
                    argWriter.write("<TABLE summary=\"mini title\">");
                    argWriter.newLine();
                    argWriter.write("<TBODY>");
                    argWriter.newLine();
                    argWriter.write("  <TR>");
                    argWriter.newLine();
                    argWriter
                            .write("    <TD bgcolor=\"#ff9900\" valign=\"top\"><FONT color=\"#ffffff\" size=\"+1\"><STRONG>"
                                    + BlancoJavaSourceUtil
                                            .escapeStringAsJavaDoc(line)
                                    + "</STRONG></FONT></TD>");
                    argWriter.newLine();
                    argWriter.write("  </TR>");
                    argWriter.newLine();
                    argWriter.write("</TBODY>");
                    argWriter.newLine();
                    argWriter.write("</TABLE>");
                    argWriter.newLine();
                } else {
                    // 普通の行。
                    argWriter.write("<P>"
                            + BlancoJavaSourceUtil.escapeStringAsJavaDoc(line)
                            + "</P>");
                    argWriter.newLine();
                    argWriter.newLine();
                    argWriter.newLine();
                }
            } else {
                // 普通の行。
                // TODO HTMLのエスケープ処理。
                argWriter.write("<P>"
                        + BlancoJavaSourceUtil.escapeStringAsJavaDoc(line)
                        + "</P>");
                argWriter.newLine();
                argWriter.newLine();
                argWriter.newLine();
            }
        }

        argWriter.write("<HR>");
        argWriter.newLine();
        argWriter.write("<ADDRESS>");
        argWriter.newLine();

        final SimpleDateFormat sdFormat = new SimpleDateFormat(
                "yyyy/MM/dd HH:mm:ss");
        argWriter
                .write("<A href=\"memo/memoigapyon.html\">いがぴょんについて</A><BR>  Last modified: $Date: "
                        + sdFormat.format(argStructure.getDate()) + " $");
        argWriter.write("</ADDRESS>");
        argWriter.newLine();

        argWriter.write("</BODY>");
        argWriter.newLine();

        argWriter.write("</HTML>");
        argWriter.newLine();
    }
}
