/**
 * @(#)RidualScript.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-3 : Script エンジン
  *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2002/08/01
 */
package jp.co.nri;

import java.util.Vector;

import java.io.File;

import jp.co.iti.fagot.ZApp;

import jp.co.iti.fagot.gob.GobManager;

import jp.co.iti.fagot.xml.GRootSVG;

import jp.co.iti.fagot.doc.DocDocument;

import jp.co.iti.fagot.util.ZInstance;
import jp.co.iti.fagot.util.ZResource;
import jp.co.iti.fagot.util.ZString;
import jp.co.iti.fagot.util.ZFile;
import jp.co.iti.fagot.util.ZDebug;

import jp.co.nri.Rid;

import jp.co.nri.rid.doc.RidDocumentSite;

import jp.co.nri.rid.action.RidToolAction;

import jp.co.nri.rid.table.RTable;

import jp.co.nri.rid.generator.GenerateCSV2;
/**
 * Ridual スクリプト
 * サーバ側でバッチ起動時に、javascriptとインターフェイスとなるクラス。
 * javascriptからridualへのアクセスは、すべてこのクラスを通して行う。
 */
public class RidualScript {

	/**
	 * コンストラクタ
	 */
	public RidualScript() {
	mApp = (Ridual)ZApp.getTheApp();
	mRes = mApp.getResource();
	}

	//## 開始・終了 ###################################################
	/**
	 * 開始
	 * @param szLog ログファイル名
	 * @return {正常|異常}
	 */
	public boolean start( String szLog ) {
	// アプリケーションログファイル名の設定
	String szDateTime = ZString.getDateTime();
	String[] szDts    = ZString.tokenize( ZString.replace(szDateTime," ","_"),"/:" );
	String szFile = ZFile.getParent(szLog) + File.separator + "log" + File.separator;
	String szTrcFile = "";
	for ( int nAt=0 ; nAt<szDts.length ; nAt++ ) {
		szTrcFile += szDts[nAt];
	}
	szTrcFile += ".log" ;
	ZDebug.trace( szFile + szTrcFile );
	ZDebug.setTraceFile( szFile + szTrcFile );

	ZDebug.trace("rid-x dir:"+mRes.getString("app.install.path"));
	ZDebug.trace("version  :"+mApp.getVersionInfo());

	mLog = new RidualLog( szLog, szTrcFile, szDateTime );
	return true;
	}

	/**
	 * 終了
	 * @param bRet {正常|異常}
	 */
	public void end( boolean bRet ) {
	if ( mLog != null ) {
		mLog.end( bRet );
	}
	}

	//## ファイル系機能 ###############################################
	/**
	 * 開く
	 * @param szFile 開く｛プロジェクトファイル名|プロジェクトディレクトリ名｝
	 * @return {正常|異常}
	 */
	public boolean open( String szFile ) {
	boolean bRet = true;
	if ( mLog != null ) {
		String szPfx = mRes.getString("app.install.path") + File.separator + 
					   mRes.getString("app.project.dir")  + File.separator ;
		String szPrj = szFile.substring( szPfx.length() );

		bRet = mLog.start( szPrj );
	}
	if ( bRet ) {
		bRet = mApp.open( szFile );
	}
	return bRet;
	}

	/**
	 * 保存
	 * @return {正常|異常}
	 */
	public boolean save() {
	boolean bRet = false;
	if ( mLog != null ) {
		if ( mLog.check() ) {
			bRet = mApp.save();
		}
	}
	return bRet;
	}

	//## ツール系機能 #################################################
	/**
	 * インポート
	 * @return {正常|異常}
	 */
	public boolean execImport() {
	RidToolAction act = new RidToolAction(mApp,RidToolAction.IMPORT);
	return execToolAction( act );
	}

	/**
	 * アナライズ
	 * @return {正常|異常}
	 */
	public boolean execAnalyze() {
	RidToolAction act = new RidToolAction(mApp,RidToolAction.ANALYZE_HTML);
	return execToolAction( act );
	}

	/**
	 * 生成
	 * @return {正常|異常}
	 */
	public boolean execGenerate() {
	RidToolAction act = new RidToolAction(mApp,RidToolAction.GENERATE);
	return execToolAction( act );
	}

	/**
	 * アクセスログ
	 * @return {正常|異常}
	 */
	public boolean execAccessLog() {
	RidToolAction act = new RidToolAction(mApp,RidToolAction.ACCESSLOG);
	return execToolAction( act );
	}

	/**
	 * ツール系共通
	 * @param act 実行するアクション
	 * @return {正常|異常}
	 */
	protected boolean execToolAction( RidToolAction act ) {
	ZDebug.trace("--- "+act.getActionName()+" start");
	mThrowable = act.execTool();
	if ( mThrowable!=null ) {
		ZDebug.trace("Error:"+mThrowable);
	}
	ZDebug.trace("--- "+act.getActionName()+" end");
	return ( mThrowable==null );
	}

	//## SVG出力系機能 ################################################
	/**
	 * SVG出力(Zone)
	 * @param szFile    出力ファイル
	 * @return {正常|異常}
	 */
	public boolean outputZoneSvg( String szFile ) {
	return outputSvg(Rid.PANEL_ZONE, szFile);
	}

	/**
	 * SVG出力(Map)
	 * @param szMap     Map識別子
	 * @param bRecalc   再計算有無
	 * @param szFile    出力ファイル
	 * @return {正常|異常}
	 */
	public boolean outputMapSvg( String szMapId, boolean bRecalc, String szFile ) {
	String szPanelId = Rid.PANEL_MAP + "." + szMapId ;
	if ( bRecalc ) {
		RidDocumentSite doc   = (RidDocumentSite)ZInstance.map().get(Rid.DOCUMENT_SITE);
		boolean isZoneBase = true;
		if ( szMapId.endsWith("Circle") ) {
			isZoneBase = false;
		}
		doc.recalcMap(szPanelId,isZoneBase);
	}
	return outputSvg(szPanelId, szFile);
	}

	/**
	 * SVG出力
	 * @param szPanelId パネル識別子
	 * @param szFile    出力ファイル
	 * @return {正常|異常}
	 */
	protected boolean outputSvg( String szPanelId, String szFile ) {
	boolean bRet = true;

	RidDocumentSite doc   = (RidDocumentSite)ZInstance.map().get(Rid.DOCUMENT_SITE);
	Vector gobs = doc.createGobs(szPanelId);
	try {
		ZDebug.trace("--- OutputSvg:"+szPanelId+" -> "+szFile);
		GRootSVG svg = new GRootSVG(gobs);
		svg.writeto(szFile ,null);
	} catch ( Exception evt ) {
		bRet = false;
	}
	return bRet;
	}

	//## CSV出力系機能 ################################################
	/**
	 * CSV出力
	 * @param szPanelId パネル識別子
	 * @param szFile    出力ファイル
	 * @return {正常|異常}
	 */
	public boolean outputCsv( String szPanelId, String szFile ) {
	boolean bRet = true;

	String szPanel  = null ;
	DocDocument doc = null ;
	if ( szPanelId.equals("List") ) {
		szPanel = "table.pages";
		doc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_SITE);
	} else if (szPanelId.equals("Resource") ) {
		szPanel = "table.resources";
		doc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_RESOURCE);
	} else if (szPanelId.equals("Document") ) {
		szPanel = "table.documents";
		doc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_DOCUMENT);
	} else if (szPanelId.equals("PageResource") ) {
		szPanel = "table.linkedpages";
		doc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_RESOURCE);
	} else {
		ZDebug.trace("unknown panelId:"+szPanelId);
		return false;
	}

	RTable table = new RTable(szPanel);
	table.reload( doc );
	try {
		// csv出力呼び出し
		ZDebug.trace("--- OutputCsv:"+szPanelId+" -> "+szFile);
		GenerateCSV2 csv = new GenerateCSV2();
		csv.generateCSV(table, szFile);
	} catch ( Exception evt ) {
		bRet = false;
	}
	return bRet;
	}


	//## プロパティ ###################################################
	/**
	 * プロパティの設定
	 * @param szKey リソース値
	 * @param bVal  真理値
	 */
	public void setProperty( String szKey, boolean bVal ) {
	mRes.putBoolean( szKey, bVal );
	}

	/**
	 * プロパティの設定
	 * @param szKey リソース値
	 * @param szVal 値
	 */
	public void setProperty( String szKey, String szVal ) {
	mRes.putString( szKey, szVal );
	}

	//## アトリビュート ###############################################
	/**
	 * アプリケーション
	 */
	protected Ridual mApp = null;

	/**
	 * アプリケーション
	 */
	protected ZResource mRes = null;

	/**
	 * エラー時の例外
	 */
	protected Throwable mThrowable = null;

	/**
	 * ログ
	 */
	protected RidualLog mLog = null;
}
