/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatVcmsKnriKeiInfSksi
*	ソースファイル名	：JBSbatVcmsKnriKeiInfSksi.java
*	作成者				：富士通　
*	作成日				：2020年05月26日
*＜機能概要＞
*　ＶＣＭＳ契約情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v49.00.00	2020/05/26	GDC)ニール		【ANK-3840-00-00】 テレビリースサービス新規申込
*********************************************************************/
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 JBSbatKKVcmsKeiInfSksi 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 vcmsKnriKeiInfFilePath = null;
	
	/** ＶＣＭＳ契約情報中間ファイルオブジェクト */
	private JBSbatInputFileUtil vcmsKnriKeiInfFileObj = null;
	
	/** ＶＣＭＳ契約情報送信ファイル出力ディレクトリパス */
	private String vcmsKnriKeiInfFileOutDirPath = null;
	
	/** ＶＣＭＳ契約情報送信ファイル名 */
	private String vcmsKnriKeiInfFileName = 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)
		{
			// ＶＣＭＳ契約情報中間ファイルパス
			vcmsKnriKeiInfFilePath = freeItems[0];
			// ＶＣＭＳ契約情報中間ファイルオブジェクトを生成する
			vcmsKnriKeiInfFileObj = new JBSbatInputFileUtil(vcmsKnriKeiInfFilePath);
			vcmsKnriKeiInfFileObj.setEncode(JKKBatConst.SJIS);
			vcmsKnriKeiInfFileObj.setLine(JKKBatConst.S_LINE_SEPARAOR_LF);
			// Readerオブジェクトを生成する。
			vcmsKnriKeiInfFileObj.createReader();
			
			// ＶＣＭＳ契約情報送信ファイル名 
			vcmsKnriKeiInfFileName = "ekk_vcms_contractinfo_" + JCCBatCommon.getSysDateTime() + ".csv";
			// ＶＣＭＳ契約情報送信ファイル出力ディレクトリパス 
			vcmsKnriKeiInfFileOutDirPath = 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 = vcmsKnriKeiInfFileOutDirPath + vcmsKnriKeiInfFileName;
		
		// 一時ファイル読込み処理
		BufferedWriter wr = null;
		try
		{
			wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFilePath), JKKBatConst.S_CHR_CODE));
			
			// レコード数分処理を繰り返す
			while (vcmsKnriKeiInfFileObj.ready())
			{
				// ファイルレコード取得
				dataLine = vcmsKnriKeiInfFileObj.readLine();
				
				// 定義ファイルに設定された区切り文字で分割
				String[] cols = dataLine.split(",", -1);
				
				// レコード整形
				String vcmsKnriKeiInf = modRecord(cols);
				
				// レコード整形配列が空の場合、次の処理レコードへと移る。
				if ("".equals(vcmsKnriKeiInf))
				{
					continue;
				}
				// レコード件数カウントアップ
				recCnt++;
				
				// ファイル書き込み
				wr.write(vcmsKnriKeiInf);
				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[]{vcmsKnriKeiInfFileName, MASSEAGE});
		}
		finally
		{
			if (null != wr)
			{
				wr.close();
			}
		}
		
		return null;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * レコードを整形する。<br>
	 * @param cols 設定項目の値
	 * @param vcmsKnriKeiInf 整形後の値
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String modRecord(String[] cols) throws Exception 
	{
		// 整形後レコード格納配列
		ArrayList<String> vcmsKnriKeiInf = new ArrayList<String>();
		
		// 入力レコードの項目数が22以外の場合、整形を中断する。
		// サービスコード
		String svcCd = cols[4];
		
		// お客さまＩＤ
		vcmsKnriKeiInf.add(cols[0]);
		
		// ＳＹＳＩＤ
		vcmsKnriKeiInf.add(cols[1]);
		
		// 請求先番号
		vcmsKnriKeiInf.add(cols[2]);
		
		// 契約者住所コード
		vcmsKnriKeiInf.add(cols[3]);
		
		// サービス
		vcmsKnriKeiInf.add(cols[4]);
		
		// 料金グループ
		vcmsKnriKeiInf.add(cols[5]);
		
		// 料金コース
		vcmsKnriKeiInf.add(cols[6]);
		
		// 料金プラン
		vcmsKnriKeiInf.add(cols[7]);
		
		// 提供方式
		vcmsKnriKeiInf.add(cols[8]);
		
		// 申込日
		vcmsKnriKeiInf.add(cols[9]);
		
		// 照査日
		vcmsKnriKeiInf.add(cols[10]);
		
		// 照査解約完了コード
		vcmsKnriKeiInf.add(cols[11]);
		
		// 受付番号
		vcmsKnriKeiInf.add(cols[12]);
		
		// 契約状態
		vcmsKnriKeiInf.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))
		{
			// 利用場所住所コードを設定する。
			vcmsKnriKeiInf.add(cols[14]);
		}
		// 上記以外の場合
		else
		{
			// 空文字を設定する。
			vcmsKnriKeiInf.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))
		{
			// 回線内訳番号を設定する。
			vcmsKnriKeiInf.add(cols[15]);
		}
		// サービスコードが'05'(電気)の場合
		else if ((S_DUBLLEQ + JBSbatKKConst.SVC_CD_ELEC_SVC + S_DUBLLEQ).equals(svcCd))
		{
			// 回線内訳番号（電気）を設定する。
			vcmsKnriKeiInf.add(cols[16]);
		}
		// 上記以外の場合
		else
		{
			// 空文字を設定する。
			vcmsKnriKeiInf.add(S_BLANK);
		}
		
		// サービス開始日
		vcmsKnriKeiInf.add(cols[17]);
		
		// サービス終了日
		vcmsKnriKeiInf.add(cols[18]);
		
		// 課金開始日
		vcmsKnriKeiInf.add(cols[19]);
		
		// 課金終了日
		vcmsKnriKeiInf.add(cols[20]);
		
		// No.21: サービス解約予約フラグ
		// DSL_IDO_RSV_STAT_CD
		String dslIdoRsvStatCD = cols[24];
		
		if ((S_DUBLLEQ + "00" + S_DUBLLEQ).equals(dslIdoRsvStatCD) || (S_DUBLLEQ + "03" + S_DUBLLEQ).equals(dslIdoRsvStatCD)) {
			vcmsKnriKeiInf.add(S_DUBLLEQ + "1" + S_DUBLLEQ);
		} else if ((S_DUBLLEQ + "01" + S_DUBLLEQ).equals(dslIdoRsvStatCD)) {
			vcmsKnriKeiInf.add(S_DUBLLEQ + "0" + S_DUBLLEQ);
		} else if ((S_DUBLLEQ + "02" + S_DUBLLEQ).equals(dslIdoRsvStatCD)) {
			vcmsKnriKeiInf.add(S_DUBLLEQ + "9" + S_DUBLLEQ);
		} else {
			vcmsKnriKeiInf.add(S_BLANK);
		}
		
		// No.22： サービス解約起算年月日
		if ((S_DUBLLEQ + "00" + S_DUBLLEQ).equals(dslIdoRsvStatCD) || (S_DUBLLEQ + "03" + S_DUBLLEQ).equals(dslIdoRsvStatCD)) {
			vcmsKnriKeiInf.add(S_BLANK);
		} else {
			vcmsKnriKeiInf.add(cols[21]);
		}
		
		// No.23：サービス解約年月日
		if ((S_DUBLLEQ + "00" + S_DUBLLEQ).equals(dslIdoRsvStatCD) || (S_DUBLLEQ + "03" + S_DUBLLEQ).equals(dslIdoRsvStatCD)) {
			vcmsKnriKeiInf.add(cols[25]);
		} else if ((S_DUBLLEQ + "02" + S_DUBLLEQ).equals(dslIdoRsvStatCD)) {
			vcmsKnriKeiInf.add(S_BLANK);
		} else {
			vcmsKnriKeiInf.add(cols[22]);
		}
		
		// No.24：サービス解約理由コード
		if ((S_DUBLLEQ + "00" + S_DUBLLEQ).equals(dslIdoRsvStatCD) || (S_DUBLLEQ + "03" + S_DUBLLEQ).equals(dslIdoRsvStatCD)) {
			vcmsKnriKeiInf.add(S_DUBLLEQ + "01" + S_DUBLLEQ);
		} else if ((S_DUBLLEQ + "02" + S_DUBLLEQ).equals(dslIdoRsvStatCD)) {
			vcmsKnriKeiInf.add(S_BLANK);
		} else {
			vcmsKnriKeiInf.add(cols[23]);
		}
		
		// サービスコードが'02'(電話)以外の場合
		if(! (S_DUBLLEQ + JBSbatKKConst.SVC_CD_TEL_SVC + S_DUBLLEQ).equals(svcCd) )
		{
			// No.25:コース変更予約フラグ
			String crschgIdoRsvStatCD = cols[26];
			
			if ((S_DUBLLEQ + "00" + S_DUBLLEQ).equals(crschgIdoRsvStatCD) || (S_DUBLLEQ + "03" + S_DUBLLEQ).equals(crschgIdoRsvStatCD)) {
				vcmsKnriKeiInf.add(S_DUBLLEQ + "1" + S_DUBLLEQ);
			} else if ((S_DUBLLEQ + "01" + S_DUBLLEQ).equals(crschgIdoRsvStatCD)) {
				vcmsKnriKeiInf.add(S_DUBLLEQ + "0" + S_DUBLLEQ);
			} else if ((S_DUBLLEQ + "02" + S_DUBLLEQ).equals(crschgIdoRsvStatCD)) {
				vcmsKnriKeiInf.add(S_DUBLLEQ + "9" + S_DUBLLEQ);
			} else {
				vcmsKnriKeiInf.add(S_BLANK);
			}
			
			// No.26：コース変更後料金コースコード
			if ((S_DUBLLEQ + "00" + S_DUBLLEQ).equals(crschgIdoRsvStatCD) || (S_DUBLLEQ + "03" + S_DUBLLEQ).equals(crschgIdoRsvStatCD)) {
				vcmsKnriKeiInf.add(cols[27]);
			} else {
				vcmsKnriKeiInf.add(S_BLANK);
			}
			
			// No.27：コース変更後料金コース名
			if ((S_DUBLLEQ + "00" + S_DUBLLEQ).equals(crschgIdoRsvStatCD) || (S_DUBLLEQ + "03" + S_DUBLLEQ).equals(crschgIdoRsvStatCD)) {
				vcmsKnriKeiInf.add(cols[28]);
			} else {
				vcmsKnriKeiInf.add(S_BLANK);
			}

		} else {
			vcmsKnriKeiInf.add(S_BLANK);
			vcmsKnriKeiInf.add(S_BLANK);
			vcmsKnriKeiInf.add(S_BLANK);
		}
		
		
		// No.28：住所変更中フラグ
		String adchgStat = cols[29];
		String adchgMkFLG = cols[30];
		
		if ((S_DUBLLEQ + "001" + S_DUBLLEQ).equals(adchgStat) && (S_DUBLLEQ + "0" + S_DUBLLEQ).equals(adchgMkFLG)) {
			vcmsKnriKeiInf.add(S_DUBLLEQ + "1" + S_DUBLLEQ);
		} else if ((S_DUBLLEQ + "1" + S_DUBLLEQ).equals(adchgMkFLG)) {
			vcmsKnriKeiInf.add(S_DUBLLEQ + "9" + S_DUBLLEQ);
		} else if ((S_DUBLLEQ + "003" + S_DUBLLEQ).equals(adchgStat)) {
			vcmsKnriKeiInf.add(S_DUBLLEQ + "0" + S_DUBLLEQ);
		} else {
			vcmsKnriKeiInf.add(S_BLANK);
		}
		
		// No.29：新サービス契約番号（移転先）	
		String svcKeiNO = cols[0];
		String chbfSkbtNO = cols[31];
		String chafSkbtNO = cols[32];
		
		if (svcKeiNO.equals(chbfSkbtNO) && (S_DUBLLEQ + "0" + S_DUBLLEQ).equals(adchgMkFLG) && !chafSkbtNO.equals(chbfSkbtNO)) {
			vcmsKnriKeiInf.add(chafSkbtNO);
		} else {
			vcmsKnriKeiInf.add(S_BLANK);
		}
		
		// No.30：RNKI_MOTO_SYS_CST_YMD
		vcmsKnriKeiInf.add(cols[33]);
		
		return makeStr(vcmsKnriKeiInf);
	}
	
	/**
	 * 配列を連結します
	 * @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;
	}
}
