/*********************************************************************
 *  All Rights reserved,Copyright (c) Fujitsu ,2012					 *
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatKKSvKeiInfChtFileBnkt
 *	ソースファイル名	：JBSbatKKSvKeiInfChtFileBnkt.java
 *	作成者				：富士通　
 *	作成日				：2012年07月12日
 *＜機能概要＞
 *　サービス契約情報抽出ファイル分割部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v3.00.00	2012/07/12  FJ)北守		新規作成
 *	v5.00.01	2013/11/20  AS)新居		OM-2013-0004210
 *	v6.00.00	2013/12/20	AS)新居		【OM-2013-0004781】TV一時金対応
 *********************************************************************/
package eo.business.service;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.common.JKKBatConst;
import eo.common.constant.JCNStrConst;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatStringUtil;

/**
 * サービス契約情報抽出ファイルを分割します。
 * <p>
 *<BR>
 * 
 * @author 富士通
 */
public class JBSbatKKSvKeiInfChtFileBnkt extends JBSbatBusinessService {
	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */
	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	/**
	 * 分割元ファイルパス
	 */
	private String inFilePath = "";

	/**
	 * 分割先ファイル格納ディレクトリパス
	 */
	private String outDirPath = "";

	/**
	 * 分割先ファイル接頭辞
	 */
	private String outFilePrefix = "";

	/**
	 * 分割数
	 */
	private int bnktCnt = 1;

	// OM-2013-0004210
	private String svc_kei_no = "";

	// OM-2013-0004781
	private String Sflg = "";

	/**
	 * 初期処理
	 * 
	 * @param JBSbatCommonItem
	 *            commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception {
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */

		// フリー項目取得
		String[] free = commonItem.getFreeItem().split(
				JKKBatConst.S_PARAM_DELIM);

		inFilePath = free[0];
		outDirPath = free[1];
		outFilePrefix = free[2];
		bnktCnt = Integer.parseInt(free[3]);
		
		//開始済、内訳の場合  OM-2013-0004781
		if(free.length == 5)
		{
			// フリー項目[開始済、内訳の場合は制御フラグを設定
			Sflg = free[4];
		}
	
	}

	/**
	 * 主処理
	 * 
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */

		// 入力ファイルパス
		JBSbatInputFileUtil inFile = new JBSbatInputFileUtil(inFilePath);

		inFile.setEncode(JKKBatConst.SJIS); // 文字コード
		inFile.setLine(JCNStrConst.S_LINE_SEPARAOR_LF); // 改行コード

		// 出力ファイル
		ArrayList<JBSbatOutputFileUtil> outFileList = new ArrayList<JBSbatOutputFileUtil>();
		for (int i = 0; i < bnktCnt; i++) {
			String seqNo = JBSbatStringUtil.padNumFormString(String.valueOf(i), 2);
			
			String outFilePath = outDirPath + "/" + outFilePrefix + "_" + seqNo + ".csv";
			JBSbatOutputFileUtil outFile = new JBSbatOutputFileUtil(outFilePath);
			outFile.setEncode(JKKBatConst.SJIS);
			outFile.setLine(JCNStrConst.S_LINE_SEPARAOR_LF);
			outFileList.add(outFile);
		}

		try {
			// ファイルの行数をカウント
			int lineSize = getLineSize(inFile);

			// 入力ファイル
			inFile.createReader();

			// 出力ファイル
			for (int i = 0; i < bnktCnt; i++) {
				JBSbatOutputFileUtil outFile = outFileList.get(i);
				outFile.createWriter();
			}

			// OM-2013-0004210 (S) 抽出契約区分'10'（サービス契約）の場合のみ同一サービス契約は分割しない様にする
			// 開始済、内訳の場合を追加  OM-2013-0004781
			int lineCount = 0;
			int fileNo = 0;
			while (inFile.ready()) {
				// 一行読み込み
				String line = inFile.readLine();
				lineCount++;
				
				// ファイル出力
				//int i = ((lineCount - 1) * bnktCnt / lineSize);
				
				//JBSbatOutputFileUtil outFile = outFileList.get(i);
				//outFile.write(line);
				
				//開始済、内訳の場合を追加  OM-2013-0004781
				if((JBSbatKKConst.CHSHT_KEI_DIV_10.equals(line.substring(0, 2)))
					|| (JBSbatKKConst.CHSHT_KEI_DIV_11.equals(line.substring(0, 2))
					&& JBSbatKKConst.TRAN_TRGT_KAISHI.equals(Sflg)))
				{
					if (svc_kei_no.equals(line.substring(3, 13)))
					{
						// ファイル出力
						int i = fileNo;
						
						JBSbatOutputFileUtil outFile = outFileList.get(i);
						outFile.write(line);
						
					}
					else
					{
						// ファイル出力
						int i = ((lineCount - 1) * bnktCnt / lineSize);
						
						JBSbatOutputFileUtil outFile = outFileList.get(i);
						outFile.write(line);
						
						fileNo = i;
					}
					svc_kei_no = line.substring(3, 13);
				}
				else
				{
					// ファイル出力
					int i = ((lineCount - 1) * bnktCnt / lineSize);
					
					JBSbatOutputFileUtil outFile = outFileList.get(i);
					outFile.write(line);
				}
			}
			// OM-2013-0004210 (E)
			inFile.close();
		} catch (IOException ioe) {

		} finally {
			// 入力ファイルクローズ
			inFile.close();

			// 出力ファイルクローズ
			for (int i = 0; i < bnktCnt; i++) {
				JBSbatOutputFileUtil outFile = outFileList.get(i);
				outFile.close();
			}
		}

		return null;
		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 業務サービス終了処理
	 * 
	 * @throws Exception
	 */
	public void terminal() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/** ▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼ */
	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */

	/**
	 * ファイルの行数を返却する。
	 * 
	 * @param fileUtil
	 *            ファイルユーティリティクラス
	 * @return ファイル行数
	 */
	private int getLineSize(JBSbatInputFileUtil fileUtil) throws IOException {
		fileUtil.createReader();

		int lineSize = 0;
		try {
			while (fileUtil.ready()) {
				String line = fileUtil.readLine();
				// ファイル出力
				lineSize++;
			}
		} finally {
			fileUtil.close();
		}
		return lineSize;
	}
}
