/*********************************************************************
 *  All Rights reserved,Copyright (c) Fujitsu ,2012					 *
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatKKSvKeiInfChtFileBnkt
 *	ソースファイル名	：JBSbatKKSvKeiInfChtFileBnkt.java
 *	作成者				：富士通　
 *	作成日				：2012年07月12日
 *＜機能概要＞
 *　サービス契約情報抽出ファイル分割部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v3.00.00	2012/07/12  FJ)北守		新規作成
 *********************************************************************/
package eo.business.service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.ArrayList;

import com.fujitsu.futurity.model.base.jcc.common.JCCFileInfo;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatConst;
import eo.common.constant.JCNStrConst;
import eo.common.util.JCCFileUtil;
import eo.common.util.JCCcomFileSearchUtil;
import eo.framework.application.JCCbatFrameworkException;
import eo.framework.file.JBSbatFileUtil;
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 JBSbatKKSvKeiJzkKeiTrgrChtFileBnkt extends JBSbatBusinessService {
	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */
	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	/**
	 * 分割元ファイルパス
	 */
	private String inFilePath = "";

	/**
	 * 分割先ファイル格納ディレクトリパス
	 */
	private String outDirPath = "";

	/**
	 * 分割先ファイル接頭辞
	 */
	private String outFilePrefix = "";

	/**
	 * 分割数
	 */
	private int bnktCnt = 1;

	/**
	 * 前レコードのキー
	 */
	private String prevKey = "";
	
	/**
	 * 前レコードの連番
	 */
	private int previ = 0;
	
	
	/**
	 * 初期処理
	 * 
	 * @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]);
		
		// 入力ファイル存在チェック
		if (!fileExists(inFilePath)) {
			throw new FileNotFoundException(inFilePath);
		}
		
	}

	/**
	 * 主処理
	 * 
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */

		
		// 入力ファイルパス
		JBSbatInputFileUtil inFile = new JBSbatInputFileUtil(inFilePath);
		
		inFile.setEncode(JKKBatConst.SJIS); // 文字コード
		inFile.setLine(JCNStrConst.S_LINE_SEPARAOR_CR_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_CR_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();
			}

			int lineCount = 0;
			while (inFile.ready()) {
				// 一行読み込み
				String line = inFile.readLine();
				lineCount++;

				// キー取得
				String items[] = line.split(JKKBatConst.CONMA);
				String key = items[0];
				
				// ファイル出力
				
				int i = ((lineCount - 1) * bnktCnt / lineSize);
				if (key != null && key.equals(prevKey))
				{
					// 前レコードと同じキーの場合は同じファイルに書き出す
					i = previ;
				} else {
					// 前レコードと異なるキーの場合はキーと連番を退避領域に設定
					prevKey = key;
					previ = i;
				}

				JBSbatOutputFileUtil outFile = outFileList.get(i);
				outFile.write(line);

			}
			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;
	}
	
	/**
	 * ファイル存在チェック。
	 * 
	 * @param path ファイルパス
	 * @return true : ファイルが存在する。false : ファイルが存在しない。
	 */
	private boolean fileExists(String path)
	{
		File f = new File(path);
		return f.exists();
	}
}
