/*
 * @(#)RHTMLGenerator.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : Generator
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2001/11/07
 */
package jp.co.nri.rid.generator;

import java.util.*;
import java.io.File;
import java.text.*;

import jp.co.iti.fagot.ZApp;
import jp.co.iti.fagot.doc.DocDocument;
import jp.co.iti.fagot.doc.DocManager;
import jp.co.iti.fagot.util.ZDebug;
import jp.co.iti.fagot.util.ZResource;
import jp.co.iti.fagot.util.ZProperties;
import jp.co.iti.fagot.util.ZString;

import jp.co.nri.rid.error.RidMessage;
import jp.co.nri.rid.snapshot.xcopy;


/**
  * Rid 生成
  */
public class RHTMLGenerator extends GenerateParser {

    /** [generate.page]プロパティ  **/
    final static public String GENERATE_PAGE            = "generate.page";
    /** [generate.product]プロパティ  **/
//    final static public String GENERATE_PRODUCT         = "generate.product";
    /** [generate.present]プロパティ  **/
//    final static public String GENERATE_PRESENT         = "generate.present";
    /** [generate.sitemap]プロパティ  **/
    final static public String GENERATE_SITEMAP         = "generate.sitemap";
    /** [generate.browser]プロパティ  **/
    final static public String GENERATE_BROWSER         = "generate.browser";
    /** [generate.browser.exec]プロパティ  **/
//    final static public String GENERATE_BROWSER_EXE     = "generate.browser.exec";
    /** [generate.browser_command]プロパティ  **/
    final static public String GENERATE_BROWSER_COMMAND = "generate.browser_command";

    /** [generate.browser]プロパティの値 製作指示書＝[Product]    **/
//    final static public String BROWSER_PRODUCT = "Product";
    /** [generate.browser]プロパティの値 紙芝居＝[Present]        **/
//    final static public String BROWSER_PRESENT = "Present";
    /** [generate.browser]プロパティの値 サイトマップ＝[Sitemap]  **/
//    final static public String BROWSER_SITEMAP = "Sitemap";

/**
  * デフォルトコンストラクタ
  */
    public RHTMLGenerator() {}

/**
  * 製作指示書／紙芝居／サイトマップ生成 （メイン）
  * @param  doc         ドキュメント
  * @param  szPjDir     プロジェクトディレクトリ
  * @return boolean     true（成功）/ false（失敗）
  */
    public boolean generate(DocDocument doc,String szPjDir) throws Exception {

        boolean ret = true;

        // リソース
        ZResource res = ZApp.getTheApp().getResource();

        //ページ生成 （True:生成/false:生成しない）
        boolean page = res.getBoolean(GENERATE_PAGE);
        if (page)  ret = generatePageFrame(doc, szPjDir);

        //製作指示書生成 （True:生成/false:生成しない）
/*
        boolean product = res.getBoolean(GENERATE_PRODUCT);
        if (product)  ret = generateProductFrame(doc, szPjDir);
*/

        //紙芝居 （True:生成/false:生成しない）
/*
        boolean present = res.getBoolean(GENERATE_PRESENT);
        if (present)  ret =generatePresentFrame(doc, szPjDir);
*/
		
        // サイトマップ（True:生成/false:生成しない）
        boolean sitemap = res.getBoolean(GENERATE_SITEMAP);
        if (sitemap)  ret &= generateSiteMap(doc, szPjDir);
		
		if(ret) browserExec(szPjDir+File.separator+res.getString("rid.admin.dir")+File.separator+"index.html");
		
        return ret;
    }


/**
  * ページ生成
  * @param  doc         ドキュメント
  * @param  szPjDir     プロジェクトディレクトリ
  * @return boolean     true（成功）/ false（失敗）
  */
    public boolean generatePageFrame(DocDocument doc,String szPjDir) throws Exception {

        boolean ret = false;

        ZDebug.trace(" >> Page start... ");

        // Page生成
        GeneratePage page = new GeneratePage();
        ret = page.generate(doc, szPjDir);
        ZDebug.trace(" >> Page end... \"" + ret + "\"");
        return ret;
  }


/**
  * 製作指示書生成
  * @param  doc         ドキュメント
  * @param  szPjDir     プロジェクトディレクトリ
  * @return boolean     true（成功）/ false（失敗）
  */
/*
    public boolean generateProductFrame(DocDocument doc,String szPjDir) throws Exception {

        boolean ret = false;

        ZDebug.trace(" >> Product start... ");

        // 製作指示書生成
        GenerateProduct product = new GenerateProduct();
        ret = product.generate(doc, szPjDir);
        if (ret) {
            ret = browserExec(BROWSER_PRODUCT, product.getUrl());
        }

        ZDebug.trace(" >> Product end... \"" + ret + "\"");
        return ret;
  }
*/


/**
  * 紙芝居生成
  * @param  doc         ドキュメント
  * @param  szPjDir     プロジェクトディレクトリ
  * @return boolean     true（成功）/ false（失敗）
  */
/*
    public boolean generatePresentFrame(DocDocument doc,String szPjDir) throws Exception {

        boolean ret = false;

        ZDebug.trace(" >> Present start... ");

        // 紙芝居生成
        GeneratePresent present = new GeneratePresent();
        ret =  present.generate(doc, szPjDir);
        if (ret) {
            ret = browserExec(BROWSER_PRESENT, present.getUrl());
        }

        ZDebug.trace(" >> Present end... \"" + ret + "\"");
        return ret;
    }
*/
	

/**
  * SiteMap生成
  * @param  doc         ドキュメント
  * @param  szPjDir     プロジェクトディレクトリ
  * @return boolean     true（成功）/ false（失敗）
  */
    public boolean generateSiteMap(DocDocument doc,String szPjDir) throws Exception {

        boolean ret = false;

        ZDebug.trace(" >> SiteMap start... ");

        // 現状では、テンプレートディレクトリの各ファイルとする
        String szHeader = "_header.html"; // ヘッダ
        String szFooter = "_footer.html"; // フッター

        // サイトマップ生成
        GenerateSiteMap siteMap = new GenerateSiteMap();
        ret =  siteMap.generate(doc, szPjDir, szHeader, szFooter);
//		if (ret) {
//            ret = browserExec(BROWSER_SITEMAP,siteMap.getUrl());
//		}
        ZDebug.trace(" >> SiteMap end... \"" + ret + "\"");

        return ret;

  }


/**
  * ブラウザの起動
  * @param  gType       製作指示書/紙芝居/sitemap
  * @param  url         URL
  * @return boolean     true（成功）/ false（失敗）
  */
  public boolean browserExec(String url) throws Exception{

      boolean ret = true;

      // リソース
      ZResource res = ZApp.getTheApp().getResource();

      // ブラウザ表示の有無 true:起動/false:起動しない
      boolean browser = res.getBoolean(GENERATE_BROWSER);

      if (browser) {
          // ブラウザ表示を行う種類 Product:製作指示書/Present:紙芝居/Sitemap:サイトマップ
//          String browser_exec = res.getString(GENERATE_BROWSER_EXE);
//          if (browser_exec.compareTo(gType) == 0) {
              // ブラウザのコマンド
              String browser_command = res.getString(GENERATE_BROWSER_COMMAND);
              //Nullの場合は処理しない
              if (!isNullString(browser_command)) {
                  // 存在チェック
				if(!new File(browser_command).exists()){
					ZDebug.trace(new RidMessage().Warning("W4005",browser_command));
					return false;
				}
				
				File fl = new File(url);
				if(!fl.exists()){
					ZDebug.trace(new RidMessage().Warning("W4006",browser_command));
					return false;
				}
				Runtime.getRuntime().exec(browser_command + " " + fl.toURL());
/*
                  xcopy xc = new xcopy();
                  if (xc.fileExists(browser_command) && xc.fileExists(url) ) {
                  //if (xc.fileExists(url) ) {
                      // 指定されたブラウザでHTMLファイルを表示する
                      Runtime.getRuntime().exec(browser_command + " file://" + url);
                  } else {
                      // ブラウザまたはHTMLファイルが存在しない場合
                      RidMessage ridMsg = new RidMessage();
                      if ( !xc.fileExists(browser_command) )
                          ZDebug.trace(ridMsg.Warning("W4005",browser_command));
                      if ( !xc.fileExists(url) )
                          ZDebug.trace(ridMsg.Warning("W4006",browser_command));
                      ret = false;
                  }
*/
              }
//          }
      }
      return ret;
  }

/**
  * 現在の時刻
  *
  * @return String (yyyy/MM/dd (EE) HH:mm:ss.SSS zz)
  */
    public String getDateString() throws Exception {
        Date date = new Date();
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd (EE) HH:mm:ss.SSS zz");
        return df.format(date);
    }

}
