/*
 * 作成日: 2003/10/23
 *
 * この生成されたコメントの挿入されるテンプレートを変更するため
 * ウィンドウ > 設定 > Java > コード生成 > コードとコメント
 */
package jp.ne.dti.venus.okazaki.xls2src;

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 java.io.FileInputStream;
import java.io.IOException;
//import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.StringWriter;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import org.apache.commons.cli.*;

/**
 * @author kenichi_home
 *
 * この生成されたコメントの挿入されるテンプレートを変更するため
 * ウィンドウ > 設定 > Java > コード生成 > コードとコメント
 */
public class Xls2src {
	

	public static void main(String[] args) throws IOException,Exception
	{
		String xlsFileName="data/workbook.xls";
		String templateFolderName="template";

		Options options = new Options();
		options.addOption(OptionBuilder
					  .withArgName("xlsFileName")
					  .hasArg()
					  .withDescription(  "設計Xlsファイル名(デフォルト:data/workbook.xls)" )
					  .create( "f") );

		options.addOption(OptionBuilder
					  .withArgName("templateFolderName")
					  .hasArg()
					  .withDescription(  "テンプレートフォルダ名(デフォルト:template)" )
					  .create( "t") );
					  
		options.addOption("h", false, "ヘルプ表示");


		CommandLineParser parser = new BasicParser();
		CommandLine cmd;
		try {
			cmd = parser.parse(options, args); 
		} catch (ParseException pe) {
			displayHelp(options );


			return;
		}
		
		if (cmd.hasOption("h")) {		
			displayHelp(options );
			return;
		}
		
		if (cmd.hasOption("f")) {
			xlsFileName = cmd.getOptionValue('f');
		}
		
		if (cmd.hasOption("t")) {
			templateFolderName = cmd.getOptionValue('t');
		}

		
		ArrayList modelCollection = getModelCollection(xlsFileName);
		excute( templateFolderName ,modelCollection);
		

	}
	private static void displayHelp(Options options ){
		HelpFormatter formatter = new HelpFormatter();
		formatter.printHelp( "xls2src", options, true);
	
	} 
	private static ArrayList getModelCollection(String xlsFileName) throws IOException{
		ArrayList modelCollection = new ArrayList();
		String sheetName;

		POIFSFileSystem fs      =
				new POIFSFileSystem(new FileInputStream(xlsFileName));
		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 static void excute(String templateFolderName , ArrayList modelCollection) throws Exception {
//		BeanDataSet data = new BeanDataSet(xls_);
		Util util = new Util();
		Util u = new Util();
		Velocity.init("velocity.properties");
		VelocityContext context = new VelocityContext();
		Template template = Velocity.getTemplate(templateFolderName +"/CMP.vm", "Shift_JIS");

		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", u );	
			
			StringWriter writer = new StringWriter();
			template.merge(context, writer);
			FileWriter fileWriter;
			write(model, writer);
		}
	}

	/**
	 * ファイルに書き出し
	 * 
	 * @param beanData - データクラスの情報
	 * @param writer - Velocityにてテンプレートとマージされたライター
	 * @throws IOException
	 */
	private static void write(Model model , StringWriter writer) throws IOException {
		FileWriter fileWriter = null;
		try {
			fileWriter = new FileWriter( model.getInfo().get( "name") + "Bean.java");
			fileWriter.write(writer.toString());
		} finally {
			if (fileWriter != null) {
				fileWriter.close();
			}
		}
	}
	
	
}
