/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatSetWariKnriKeiInfSksi
*	ソースファイル名	：JBSbatSetWariKnriKeiInfSksi.java
*	作成者				：富士通　
*	作成日				：2018年06月08日
*＜機能概要＞
*　セット割管理契約情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v38.00.00	2018/06/08	FJ)周藤		【ANK-3436-00-00】eo×mineoセット割 新規作成
*********************************************************************/
package eo.business.service;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKSetWariKnriKeiInfSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 空文字 */
	private static final String S_BLANK = "\"\"";
	
	/** ダブルクォーテーション*/
	private static final String S_DUBLLEQ = "\"";
	
	/**コンマ*/
	private static final String S_COMMA = ",";
	
	/** エラーメッセージ(置換え文字列：%2%) */
	private static final String MASSEAGE = "ファイル出力";
	
	/** データ(1件) */
	private String dataLine = null;
	
	/** セット割管理契約情報中間ファイルパス */
	private String setWariKnriKeiInfFilePath = null;
	
	/** セット割管理契約情報中間ファイルオブジェクト */
	private JBSbatInputFileUtil setWariKnriKeiInfFileObj = null;
	
	/** セット割管理契約情報送信ファイル出力ディレクトリパス */
	private String setWariKnriKeiInfFileOutDirPath = null;
	
	/** セット割管理契約情報送信ファイル名 */
	private String setWariKnriKeiInfFileName = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		// FreeItem取得(FREE項目には「入力ファイル定義名1;入力ファイルパス1;入力ファイル定義名2;入力ファイルパス2」が設定されている)
		String[] freeItems = commonItem.getFreeItem().split(";");
		
		if (freeItems != null && freeItems.length == 2)
		{
			// セット割管理契約情報中間ファイルパス
			setWariKnriKeiInfFilePath = freeItems[0];
			// セット割管理契約情報中間ファイルオブジェクトを生成する
			setWariKnriKeiInfFileObj = new JBSbatInputFileUtil(setWariKnriKeiInfFilePath);
			setWariKnriKeiInfFileObj.setEncode(JKKBatConst.S_CHR_CODE);
			setWariKnriKeiInfFileObj.setLine(JKKBatConst.S_LINE_SEPARAOR_LF);
			// Readerオブジェクトを生成する。
			setWariKnriKeiInfFileObj.createReader();
			
			// セット割管理契約情報送信ファイル名 
			setWariKnriKeiInfFileName = "ekk_contractinfo_" + JCCBatCommon.getSysDateTime() + ".csv";
			// セット割管理契約情報送信ファイル出力ディレクトリパス 
			setWariKnriKeiInfFileOutDirPath = freeItems[1];
		}
		else 
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0130CE, new String[]{"FREE"});
		}
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// レコード件数
		int recCnt = 0;
		
		// ファイルパス
		String outFilePath = setWariKnriKeiInfFileOutDirPath + setWariKnriKeiInfFileName;
		
		// 一時ファイル読込み処理
		BufferedWriter wr = null;
		try
		{
			wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFilePath), JKKBatConst.S_CHR_CODE));
			
			// レコード数分処理を繰り返す
			while (setWariKnriKeiInfFileObj.ready())
			{
				// ファイルレコード取得
				dataLine = setWariKnriKeiInfFileObj.readLine();
				
				// 定義ファイルに設定された区切り文字で分割
				String[] cols = dataLine.split(",", -1);
				
				// レコード整形
				String setWariKnriKeiInf = modRecord(cols);
				
				// レコード整形配列が空の場合、次の処理レコードへと移る。
				if ("".equals(setWariKnriKeiInf))
				{
					continue;
				}
				// レコード件数カウントアップ
				recCnt++;
				
				// ファイル書き込み
				wr.write(setWariKnriKeiInf);
				wr.write("\n");
				wr.flush();
			}
			
			// 出力リストにトレーラー部追加
			wr.write(addTrailer(String.valueOf(recCnt)));
			wr.write("\n");
			wr.flush();
		}
		catch(IOException e)
		{
			throw new JBSbatBusinessException("EKKB0250CE", new String[]{setWariKnriKeiInfFileName, MASSEAGE});
		}
		finally
		{
			if (null != wr)
			{
				wr.close();
			}
		}
		
		return null;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * レコードを整形する。<br>
	 * @param cols 設定項目の値
	 * @param setWariKnriKeiInf 整形後の値
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String modRecord(String[] cols) throws Exception 
	{
		// 整形後レコード格納配列
		ArrayList<String> setWariKnriKeiInf = new ArrayList<String>();
		
		// 入力レコードの項目数が22以外の場合、整形を中断する。
		if (cols.length < 22 || cols.length > 22)
		{
			return "";
		}
		// サービスコード
		String svcCd = cols[4];
		
		// お客さまＩＤ
		setWariKnriKeiInf.add(cols[0]);
		
		// ＳＹＳＩＤ
		setWariKnriKeiInf.add(cols[1]);
		
		// 請求先番号
		setWariKnriKeiInf.add(cols[2]);
		
		// 契約者住所コード
		setWariKnriKeiInf.add(cols[3]);
		
		// サービス
		setWariKnriKeiInf.add(cols[4]);
		
		// 料金グループ
		setWariKnriKeiInf.add(cols[5]);
		
		// 料金コース
		setWariKnriKeiInf.add(cols[6]);
		
		// 料金プラン
		setWariKnriKeiInf.add(cols[7]);
		
		// 提供方式
		setWariKnriKeiInf.add(cols[8]);
		
		// 申込日
		setWariKnriKeiInf.add(cols[9]);
		
		// 照査日
		setWariKnriKeiInf.add(cols[10]);
		
		// 照査解約完了コード
		setWariKnriKeiInf.add(cols[11]);
		
		// 受付番号
		setWariKnriKeiInf.add(cols[12]);
		
		// 契約状態
		setWariKnriKeiInf.add(cols[13]);
		
		// 利用場所住所コード
		// サービスコードが'01'(ネット)、'02'(電話)、'03'(テレビ)の場合
		if ((S_DUBLLEQ + JBSbatKKConst.SVC_CD_IN_SVC + S_DUBLLEQ).equals(svcCd)
				|| (S_DUBLLEQ + JBSbatKKConst.SVC_CD_TEL_SVC + S_DUBLLEQ).equals(svcCd)
				|| (S_DUBLLEQ + JBSbatKKConst.SVC_CD_TV_SVC + S_DUBLLEQ).equals(svcCd))
		{
			// 利用場所住所コードを設定する。
			setWariKnriKeiInf.add(cols[14]);
		}
		// 上記以外の場合
		else
		{
			// 空文字を設定する。
			setWariKnriKeiInf.add(S_BLANK);
		}
		
		// 回線内訳番号
		// サービスコードが'01'(ネット)、'02'(電話)、'03'(テレビ)の場合
		if((S_DUBLLEQ + JBSbatKKConst.SVC_CD_IN_SVC + S_DUBLLEQ).equals(svcCd)
				|| (S_DUBLLEQ + JBSbatKKConst.SVC_CD_TEL_SVC + S_DUBLLEQ).equals(svcCd)
				|| (S_DUBLLEQ + JBSbatKKConst.SVC_CD_TV_SVC + S_DUBLLEQ).equals(svcCd))
		{
			// 回線内訳番号を設定する。
			setWariKnriKeiInf.add(cols[15]);
		}
		// サービスコードが'05'(電気)の場合
		else if ((S_DUBLLEQ + JBSbatKKConst.SVC_CD_ELEC_SVC + S_DUBLLEQ).equals(svcCd))
		{
			// 回線内訳番号（電気）を設定する。
			setWariKnriKeiInf.add(cols[16]);
		}
		// 上記以外の場合
		else
		{
			// 空文字を設定する。
			setWariKnriKeiInf.add(S_BLANK);
		}
		
		// サービス開始日
		setWariKnriKeiInf.add(cols[17]);
		
		// サービス終了日
		setWariKnriKeiInf.add(cols[18]);
		
		// 課金開始日
		setWariKnriKeiInf.add(cols[19]);
		
		// 課金終了日
		setWariKnriKeiInf.add(cols[20]);
		
		// 連携元システム抽出日時
		setWariKnriKeiInf.add(cols[21]);
		
		// 予備項目１〜予備項目９
		for (int i = 0; i < 9; i++)
		{
			setWariKnriKeiInf.add(S_BLANK);
		}
		
		// 予備項目１０
		setWariKnriKeiInf.add(S_BLANK);
		
		return makeStr(setWariKnriKeiInf);
	}
	
	/**
	 * 配列を連結します
	 * @param record レコード
	 * @return String
	 */
	private String makeStr(ArrayList<String> record)
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeStr]");
		
		StringBuffer strBuf = new StringBuffer();
		
		for (int i = 0; i < record.size() - 1; i++)
		{
			strBuf.append(record.get(i) + S_COMMA);
		}
		
		strBuf.append(record.get(record.size()-1));
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeStr]");
		
		return strBuf.toString();
	}
	
	/**
	 * トレーラー部追加
	 * <BR>
	 * @param recCnt レコード数
	 * return arrayList トレーラー部
	 * @throws Exception スローされる例外
	 */
	private String addTrailer(String recCnt) throws Exception
	{
		String trailer = "";
		
		// トレーラー部
		trailer = S_DUBLLEQ + "E" + S_DUBLLEQ + S_COMMA + S_DUBLLEQ + recCnt + S_DUBLLEQ;
		
		return trailer;
	}
}
