/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKIdoRsvInfFileBnkt
*	ソースファイル名	：JBSbatKKIdoRsvInfFileBnkt.java
*	作成者				：富士通　
*	作成日				：2011年11月24日
*＜機能概要＞
*　異動予約情報ファイル分割部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/11/24   富士通		新規作成
*	v4.00.00	2013/02/27   FJ)江藤	【IT1-2013-0000339】
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKIdoRsvInfFileBnkt extends JBSbatBusinessService
{
	/**
	 * 囲み文字（"）
	 */
	private static final String MOJI_D = "\"";

	/**
	 * 置換文字列
	 */
	private static final String YMDHMS99 = "%1$s%2$02d";

	/**
	 * 異動予約情報ファイル名
	 */
	private static final String IDO_FILE_NM = "KKIFM157001_DAT_";

	/**
	 * 異動予約情報ファイル名（拡張子）
	 */
	private static final String CSV_NM = ".csv";

	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * 分割ファイル格納場所
	 */
	private String send_dir = "";

	/**
	 * 分割元ファイルパス
	 */
	private String in_file_path = "";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		//FREEITEMを取得する
		String[] free_item = commonItem.getFreeItem().split(";");
		
		// 分割ファイル格納場所を取得する
		send_dir = free_item[1] + "/";
		
		// 分割元入力ファイルパスを取得する
		in_file_path = free_item[2];
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		BufferedReader in_reader = null;

		BufferedWriter out_writer1 = null;
		BufferedWriter out_writer2 = null;
		BufferedWriter out_writer3 = null;
		BufferedWriter out_writer4 = null;
		BufferedWriter out_writer5 = null;
		
		String sys_date = JCCBatCommon.getSysDate();
		//String out_file = "";
		
		String out_file1 = "";
		String out_file2 = "";
		String out_file3 = "";
		String out_file4 = "";
		String out_file5 = "";
		
		// IT1-2013-0000339 エラー時の解析のため、業務ログを出力する ADD START
		long count =  0;
		// IT1-2013-0000339 エラー時の解析のため、業務ログを出力する ADD END
		
		try
		{
			// 入力ファイルクラスを生成します。
			// IT2-2014-0000106  ADD START
			//入力ファイルの文字列指定「S-JIS」を行う
			in_reader = new BufferedReader(new InputStreamReader(new FileInputStream(in_file_path), JKKBatConst.SJIS));
			// IT2-2014-0000106  ADD END
			// 異動予約情報ファイル名を編集する
			
			out_file1 = editFileNm(IDO_FILE_NM, sys_date, 1, CSV_NM);
			out_file2 = editFileNm(IDO_FILE_NM, sys_date, 2, CSV_NM);
			out_file3 = editFileNm(IDO_FILE_NM, sys_date, 3, CSV_NM);
			out_file4 = editFileNm(IDO_FILE_NM, sys_date, 4, CSV_NM);
			out_file5 = editFileNm(IDO_FILE_NM, sys_date, 5, CSV_NM);
			
			// 分割ファイルの生成
			out_writer1 = createIdoRsvInfoFile(out_file1);
			out_writer2 = createIdoRsvInfoFile(out_file2);
			out_writer3 = createIdoRsvInfoFile(out_file3);
			out_writer4 = createIdoRsvInfoFile(out_file4);
			out_writer5 = createIdoRsvInfoFile(out_file5);
			
			while (in_reader.ready())
			{
				// IT1-2013-0000339 エラー時の解析のため、業務ログを出力する ADD START
				count++;
				// IT1-2013-0000339 エラー時の解析のため、業務ログを出力する ADD END

				// 一行読み込む
				String rline = in_reader.readLine();
				
				// 20120514 ST2-2012-0000894 START
				// サービス契約NOを取得する
				String svcKeiNo = JBSbatStringUtil.trim(rline.split(",")[0]);
				// サービス契約回線内訳番号を取得する
				String svcKeiKaisenUcwkNo = JBSbatStringUtil.trim(rline.split(",")[16]);
				
				// 下一桁の値を取得する
				//int svcKeiNo_1 = 0;
				//if (!isNull(svcKeiNo))
				//{
				//	svcKeiNo_1 = Integer.parseInt(svcKeiNo.substring(svcKeiNo.length() - 1, svcKeiNo.length()));
				//}
				int svcKeiKaisenUcwkNo_1 = 0;
				if (!isNull(svcKeiKaisenUcwkNo))
				{
					svcKeiKaisenUcwkNo_1 = Integer.parseInt(svcKeiKaisenUcwkNo.substring(svcKeiKaisenUcwkNo.length() - 1, svcKeiKaisenUcwkNo.length()));
				}
				
				// 下一桁が１未満
				//if (svcKeiNo_1 == 0 || svcKeiNo_1 == 1)
				if (svcKeiKaisenUcwkNo_1 == 0 || svcKeiKaisenUcwkNo_1 == 1)
				{
					//super.logPrint.printDebugLog("分割ファイル名[" + out_file1 + "] サービス契約番号[" + svcKeiNo + "]");
					super.logPrint.printDebugLog("分割ファイル名[" + out_file1 + "] サービス契約番号[" + svcKeiNo + "] サービス契約回線内訳番号[" + svcKeiKaisenUcwkNo + "]");
					out_writer1.write(rline);
					out_writer1.newLine();
				// 下一桁が１以上２未満
				}
				//else if (svcKeiNo_1 == 2 || svcKeiNo_1 == 3)
				else if (svcKeiKaisenUcwkNo_1 == 2 || svcKeiKaisenUcwkNo_1 == 3)
				{
					//super.logPrint.printDebugLog("分割ファイル名[" + out_file2 + "] サービス契約番号[" + svcKeiNo + "]");
					super.logPrint.printDebugLog("分割ファイル名[" + out_file2 + "] サービス契約番号[" + svcKeiNo + "] サービス契約回線内訳番号[" + svcKeiKaisenUcwkNo + "]");
					out_writer2.write(rline);
					out_writer2.newLine();
				// 下一桁が２以上３未満
				}
				//else if (svcKeiNo_1 == 4 || svcKeiNo_1 == 5)
				else if (svcKeiKaisenUcwkNo_1 == 4 || svcKeiKaisenUcwkNo_1 == 5)
				{
					//super.logPrint.printDebugLog("分割ファイル名[" + out_file3 + "] サービス契約番号[" + svcKeiNo + "]");
					super.logPrint.printDebugLog("分割ファイル名[" + out_file3 + "] サービス契約番号[" + svcKeiNo + "] サービス契約回線内訳番号[" + svcKeiKaisenUcwkNo + "]");
					out_writer3.write(rline);
					out_writer3.newLine();
					
				// 下一桁が３以上４未満
				}
				//else if (svcKeiNo_1 == 6 || svcKeiNo_1 == 7)
				else if (svcKeiKaisenUcwkNo_1 == 6 || svcKeiKaisenUcwkNo_1 == 7)
				{
					//super.logPrint.printDebugLog("分割ファイル名[" + out_file4 + "] サービス契約番号[" + svcKeiNo + "]");
					super.logPrint.printDebugLog("分割ファイル名[" + out_file4 + "] サービス契約番号[" + svcKeiNo + "] サービス契約回線内訳番号[" + svcKeiKaisenUcwkNo + "]");
					out_writer4.write(rline);
					out_writer4.newLine();
				// 下一桁が４以上
				}
				else
				{
					//super.logPrint.printDebugLog("分割ファイル名[" + out_file5 + "] サービス契約番号[" + svcKeiNo + "]");
					super.logPrint.printDebugLog("分割ファイル名[" + out_file5 + "] サービス契約番号[" + svcKeiNo + "] サービス契約回線内訳番号[" + svcKeiKaisenUcwkNo + "]");
					out_writer5.write(rline);
					out_writer5.newLine();
				}
				// 20120514 ST2-2012-0000894 END
			}
		}
		catch(IOException ioe)
		{
			// IT1-2013-0000339 エラー時の解析のため、業務ログを出力する ADD START
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1000CE, new String[] {in_file_path + "(" + count + "行目)"});
			// IT1-2013-0000339 エラー時の解析のため、業務ログを出力する ADD END
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EDKB0050CE, new String[]{ioe.getMessage()});
		}
		finally
		{
			if (in_reader != null)
			{
				in_reader.close();
			}
			
			if (out_writer1 != null)
			{
				out_writer1.close();
			}
			if (out_writer2 != null)
			{
				out_writer2.close();
			}
			if (out_writer3 != null)
			{
				out_writer3.close();
			}
			if (out_writer4 != null)
			{
				out_writer4.close();
			}
			if (out_writer5 != null)
			{
				out_writer5.close();
			}
		}
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	
	
	/**
	 * ファイル名を編集します。<br>
	 * <p>
	 * @param file 対象ファイル名
	 * @param dtm 付加日時
	 * @param no 付加連番
	 * @param type 拡張子
	 * @return String 分割異動予約情報ファイル名
	 * @throws Exception 例外
	 */
	private String editFileNm(String file, String dtm, int no, String type) throws Exception
	{
		StringBuffer file_nm = new StringBuffer();
		file_nm.append(send_dir);
		file_nm.append(file);

		file_nm.append(String.format(YMDHMS99, dtm, no));
		file_nm.append(type);
		return file_nm.toString();
	}

	/**
	 * ファイルクラスの生成処理を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.分割異動予約情報ファイル名を設定します。<br>
	 * 2.ファイル生成をします。<br>
	 * </pre>
	 * <p>
	 * @param value 分割異動予約情報ファイル名
	 * @return BufferedWriter 出力ファイルクラス
	 * @throws Exception 例外
	 */
	private BufferedWriter createIdoRsvInfoFile(String value) throws Exception
	{
		
		// IT2-2014-0000106  ADD START
		// 出力ファイルの文字列指定「S-JIS」を行う
		BufferedWriter out_writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(value), JKKBatConst.SJIS));
		// IT2-2014-0000106  ADD END
		return out_writer;
	}
	
	/**
	 * オブジェクトに値が設定されているか判定する
	 * 
	 * @param arg0 判定するオブジェクト
	 * @return オブジェクトに値が設定されていない場合はtrue
	 */
	private boolean isNull(Object arg0) 
	{
		if (arg0 == null) 
		{
			return true;
		}

		return 0 == arg0.toString().length();
	}
}
