/*
 * 作成日: 2003/11/10
 *
 * Modelの情報からソースを生成する
 * 
 */
package jp.ne.dti.venus.okazaki.xls2src;

import java.io.*;

import java.util.HashMap;
import java.util.ArrayList;

import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;

/**
 * @author kenichi_okazaki
 *
 * Modelの情報からソースを生成する
 * 
 */
public class Xls2src extends Task {
	
	private GeneratorInfo _ginfo ;	//generatorの設定情報
	
	private String _templateDir = "template";
	private String _destDir = "destDir";
	private String _xlsFile = "data/workbook.xls";


	/**
	 * 
	 */
	public Xls2src() {

	}

	public void execute()  {

		XmlLoader xmlloader = new XmlLoader();
		_ginfo = (GeneratorInfo)xmlloader.execute( _templateDir + "/digester.xml", _templateDir + "/generateInfo.xml") ;	//XMLファイルの読み込み

		ArrayList modelCollection;
		try {
			modelCollection = getModelCollection();
			excute2( modelCollection);
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (Exception e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}


	}

	private ArrayList getModelCollection() throws IOException{
		ArrayList modelCollection = new ArrayList();
		String sheetName;

		POIFSFileSystem fs      =
				new POIFSFileSystem(new FileInputStream( _xlsFile  ));
		HSSFWorkbook wb = new HSSFWorkbook(fs);	//ワークブックの取得

		//目次情報の取得
		HSSFSheet indexSheet = wb.getSheet("index");
		Table indexTable = new Table( indexSheet);
		
		//CMR情報の取得
		HSSFSheet cmrInfoSheet = wb.getSheet("CMR");	
		Table cmrInfoTable = new Table( cmrInfoSheet);
						
		for( int i = 0 ; i < indexTable.getRows().size()   ; i++ ){
			HashMap info  = (HashMap)indexTable.getRows().get(i);
			info.get("sheet");
			
			//シート情報の取得
			HSSFSheet sheet = wb.getSheet( (String)info.get("sheet") );
			Table table = new Table( sheet);
			
			//モデルの生成
			Model model = new Model();
			model.setInfo(info);
			model.setRows(table.getRows() );
			model.setCmrInfo(cmrInfoTable.getRows() );
				
			
			System.out.println("class" + info.get("クラス名") + i );
			modelCollection.add( model );
		}
		
		return modelCollection;
		
	}
	
	/**
	 * Javaソース生成の実行
	 * 
	 * @throws Exception
	 */
	public void excute2( ArrayList modelCollection ) throws Exception ,IOException {

		ArrayList templates = _ginfo.getTemplates() ;
		
		Util util = new Util();

		Velocity.init( _templateDir + "/velocity.properties");
		VelocityContext context = new VelocityContext();

		for (int i = 0; i < modelCollection.size() ; i++) {
			Model model = (Model)modelCollection.get(i);
			
			context.put("info"		, model.getInfo() );
			context.put("rows"		, model.getRows() );
			context.put("cmrInfo"	, model.getCmrInfo() );
			context.put("util", util );
			context.put("u", util );	

			//テンプレートのパターンの数だけループする
			for (int j = 0; j < modelCollection.size() ; j++) {
				write( (HashMap)templates.get(j)  , context, model);
			}
			
		}
	}

	/**
	 * ファイルに書き出し
	 * 
	 * @param beanData - データクラスの情報
	 * @param writer - Velocityにてテンプレートとマージされたライター
	 * @throws IOException
	 */
	private void write( HashMap templateInfo , VelocityContext context ,Model model) throws ResourceNotFoundException, ParseErrorException, Exception {
		
		FileWriter fileWriter = null;
		StringWriter writer = new StringWriter();
		
		
		Template template = Velocity.getTemplate( _templateDir  +"/"+ ((String)templateInfo.get("templateFileName")) , "Shift_JIS");
	
		template.merge(context, writer);
		
		//ファイルを保存するフォルダのフォルダ名を生成
		String packageDirName =  _destDir + "/" + ((String)templateInfo.get("distDir")) ;
		if( ((String)templateInfo.get("packageDir")).equals("true")  ){ 
			//所属パッケージのディレクトリ名を追加			
			packageDirName = packageDirName + "/" +((String)model.getInfo().get( "パッケージ名")).replace( '.' , '/' );
		}
		// 所属パッケージのディレクトリの生成
		File file = new File(packageDirName);
		file.mkdirs();
				
		try {
			System.out.println("fileName[" + ((String)templateInfo.get("fileName")).replaceAll( "\\$1" , (String)model.getInfo().get( "name") )  +"]");
			fileWriter = new FileWriter( packageDirName + "/" + ((String)templateInfo.get("fileName")).replaceAll( "\\$1" , (String)model.getInfo().get( "name") ) );
			fileWriter.write(writer.toString());
		} finally {
			if (fileWriter != null) {
				fileWriter.close();
			}
		}
	}
	
	
	/**
	 * @return
	 */
	public String getTemplateDir() {
		return _templateDir;
	}

	/**
	 * @param string
	 */
	public void setDestDir(String string) {
		_destDir = string;
	}

	/**
	 * @param string
	 */
	public void setTemplateDir(String string) {
		_templateDir = string;
	}

	/**
	 * @param string
	 */
	public void setXlsFile(String string) {
		_xlsFile = string;
	}

}
