/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom  					 *
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JACbatDataBnktUtil
 *	ソースファイル名	：JACbatDataBnktUtil.java
 *	作成者				：富士通　
 *	作成日				：2013年10月06日
 *＜機能概要＞
 *　データ分割部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
*	v5.00.00	2013/10/06  FJ）後藤	【ST4-2013-0000555】新規作成
 *********************************************************************/
package eo.business.common;

import java.math.BigDecimal;

import eo.common.constant.JACStrConst;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;

/**
 * データ分割部品です。
 * <p>
 *<BR>
 * 
 * @author 富士通
 */
public class JACbatDataBnktUtil
{
	/** 入力件数 */
	private BigDecimal lineCnt = BigDecimal.ZERO;
	
	/** 分割数 */
	private BigDecimal bnktCnt = BigDecimal.ZERO;
	
	/** 分割件数 */
	private BigDecimal bnktLineCnt = BigDecimal.ZERO;
	
	/** 出力件数 */
	private BigDecimal outLineCnt = BigDecimal.ZERO;
	
	/** 総出力件数 */
	private BigDecimal totalOutLineCnt = BigDecimal.ZERO;
	
	/** 出力ファイル連番 */
	private BigDecimal fileNo = BigDecimal.ZERO;
	
	/** 前レコード．分割キー */
	private String bkBnktKey = JACStrConst.KARA_MOJI;

	/** ファイルインスタンス */
	private JBSbatOutputFileUtil fileObj = null;
	
	/** 出力ファイル定義 */
	private JBSbatDefFileUtil defFileUtil = null;
	
	/** 分割項目取得用マップキー */
	private String[] mapKey = null;
	
	/** 出力ファイルDEF */
	private String outFileDef = null;
	
	/** 出力ファイル名 */
	private String outFileName = null;
	
	/** 出力ファイル拡張子 */
	private String outFileExt = null;
	
	/**
	 * コンストラクタ
	 * 
	 * @param commonItem バッチ共通パラメータ
	 */
	public JACbatDataBnktUtil(String tmpBnktCnt, String tmpLineCnt, String tmpOutFileDef, String tmpOutFileName, String tmpOutFileExt) throws Exception 
	{
		// 入力件数
		lineCnt = new BigDecimal(tmpLineCnt);
		
		// ファイル分割数
		bnktCnt = new BigDecimal(tmpBnktCnt);
		
		// 分割件数取得
		bnktLineCnt = lineCnt.divide(bnktCnt, BigDecimal.ROUND_UP);
		
		// 出力ファイルDEF
		outFileDef = tmpOutFileDef;
		
		// 出力ファイル名
		outFileName = tmpOutFileName;
		
		// 出力ファイル拡張子
		outFileExt = tmpOutFileExt;
		
		// 出力ファイル（1ファイル目）生成
		createFile();
	}

	/**
	 * コンストラクタ
	 * 
	 * @param commonItem バッチ共通パラメータ
	 */
	public JACbatDataBnktUtil(String tmpBnktCnt, String tmpLineCnt, String tmpOutFileDef, String tmpOutFileName, String tmpOutFileExt, String[] tmpMapKey) throws Exception 
	{
		// 入力件数
		lineCnt = new BigDecimal(tmpLineCnt);
		
		// ファイル分割数
		bnktCnt = new BigDecimal(tmpBnktCnt);
		
		// 分割件数取得
		bnktLineCnt = lineCnt.divide(bnktCnt, BigDecimal.ROUND_UP);
		
		// 出力ファイルDEF
		outFileDef = tmpOutFileDef;
		
		// 出力ファイル名
		outFileName = tmpOutFileName;
		
		// 出力ファイル拡張子
		outFileExt = tmpOutFileExt;
		
		// 分割キー項目リスト作成
		mapKey = tmpMapKey;
		
		// 出力ファイル（1ファイル目）生成
		createFile();
	}
	
	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public void execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 分割項目取得用マップキーが存在する場合
		if(mapKey != null)
		{
			StringBuffer tmpBnktKey = new StringBuffer();
			
			// キー項目を入力マップから取得
			for(String str:mapKey)
			{	
				System.out.println("str:"+str);
				// 文字列連結
				tmpBnktKey.append(inMap.getString(str));
			}
			String bnktKey = tmpBnktKey.toString();
			
			// 出力件数が分割件数を超過している　かつ　分割キーがブレイクした場合
			if(outLineCnt.compareTo(bnktLineCnt) >= 0 && !bnktKey.equals(bkBnktKey))
			{
				// ファイルクリア
				clearFile();
				
				// 出力件数初期化
				outLineCnt = BigDecimal.ZERO;
			}
			
			// 分割キー退避
			bkBnktKey = bnktKey;
		}
		else
		{
			// 出力件数が分割件数を超過している場合
			if(outLineCnt.compareTo(bnktLineCnt) >= 0)
			{
				// 出力件数が分割件数を超過している場合{
				// ファイルクリア
				clearFile();
				
				// 出力件数初期化
				outLineCnt = BigDecimal.ZERO;
			}
		}
		
		
		// ファイル出力
		this.fileObj.print(inMap, this.defFileUtil);
		
		// 出力件数カウントアップ
		outLineCnt = outLineCnt.add(BigDecimal.ONE);
		totalOutLineCnt = totalOutLineCnt.add(BigDecimal.ONE);
		
	}

	/**
	 * ファイル生成
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void createFile() throws Exception 
	{
		// 出力ファイルオブジェクトを生成する
		this.fileObj = new JBSbatOutputFileUtil(outFileName.concat(JACStrConst.UNDER_BAR).concat(JCCBatCommon.fillZero(String.valueOf(fileNo), 2, false)).concat(outFileExt));
		fileNo = fileNo.add(BigDecimal.ONE);
		
		// 出力定義ファイル名を取得する
		String outFileDefName = JBSbatAplConst.getAplConstValue("OTD") + outFileDef;
		
		// 出力定義ファイルオブジェクトを生成する
		this.defFileUtil = new JBSbatDefFileUtil(outFileDefName, this.fileObj);
		
		// Writerオブジェクトを生成する。
		this.fileObj.createWriter();
	}
	
	/**
	 * ファイルクリア
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void clearFile() throws Exception 
	{
		// ファイル数が分割数に満たない場合
		if(fileNo.compareTo(bnktCnt) < 0)
		{
			// ファイルクローズ
			fileClose();
			
			// 分割数更新
			bnktLineCnt = (lineCnt.subtract(totalOutLineCnt).divide(bnktCnt.subtract(fileNo), BigDecimal.ROUND_UP));
			
			// 次ファイル生成
			createFile();
		}
	}
	
	/**
	 * 終了処理
	 * @throws Exception
	 */
	public void close() throws Exception
	{
		// ファイル数が分割数に満たない場合、空ファイルを作成
		for(BigDecimal i = fileNo ; i.compareTo(bnktCnt) < 0 ; i = i.add(BigDecimal.ONE))
		{
			// ファイルクリア
			clearFile();
		}
		
		// ファイルクローズ
		fileClose();
	}

	/**
	 * ファイルクローズ
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void fileClose() throws Exception 
	{
		// ファイルインスタンスがNULLでない場合
		// 出力ファイルクローズ
		if(null != this.fileObj)
		{
			// ファイルクローズ
			this.fileObj.close();
		}
	}
}