/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCNContDoiTgDataSyk
*	ソースファイル名	：JBSbatCNContDoiTgDataSyk.java
*	作成者				：富士通　
*	作成日				：2024年11月20日
*＜機能概要＞
*　コンテンツ同意対象データ集約部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v73.00.00	2024/11/20	FJ)丸田	【ANK-4570-00-00】コンテンツ新規同時申込み時契約仕様見直し対応
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.StringTokenizer;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCNIFM022;
import eo.business.util.table.JBSbatZM_M_WORK_PARAM_KNRI;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* 集約したデータの行毎に処理分割文字列をつけて出力する。 <p>
* @author 富士通
*/
public class JBSbatCNContDoiTgDataSyk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(業務パラメータ管理)*/
	private static final String D_TBL_NAME_ZM_M_WORK_PARAM_KNRI = "ZM_M_WORK_PARAM_KNRI";

	/** SQL定義キー(CN_SELECT_001)*/
	private static final String ZM_M_WORK_PARAM_KNRI_CN_SELECT_001 = "CN_SELECT_001";
	
	/** テーブルアクセスクラス(業務パラメータ管理)*/
	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 業務パラメータ管理ＩＤ：　コンテンツ自動同意分割数 */
	private static final String CONT_AT_DOI_BNKT_CNT = "CONT_AT_DOI_BNKT_CNT";
	
	/**処理分割文字列*/
	private String maxTrnBnktChr = null;
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_ZM_M_WORK_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_WORK_PARAM_KNRI);
		
		/**最大処理分割文字列*/
		maxTrnBnktChr = executeZM_M_WORK_PARAM_KNRI_CN_SELECT_001(CONT_AT_DOI_BNKT_CNT, super.opeDate);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param 
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// 最大処理分割数
		int intMaxTrnBnkt = Integer.valueOf(maxTrnBnktChr);
		// 行の最後につける処理分割数の初期化
		int intTrnNo = 1;
		
		/** コンテンツ利用規約自動同意登録候補抽出ファイルの読込み、編集します。 */
		
		// ジョブシェルに入力したFreeから、ファイルパス文字列を取得する。
		String file = commonItem.getFreeItem();
		
		// ファイルの行を分割してリストに格納する
		HashSet<ArrayList<String>> textList = convCsvFileToList(file);
		
		if (textList.size() == 0)
		{
			// ファイルの内容がない場合、処理を終了する。
			return outputBean;
		}
		
		// 項目文字列の初期化
		String svcKeiNo = "";
		String sysid = "";
		String svcCd = "";
		String pcrsCd = "";
		String mskmDtlNo = "";
		String mskmYmd = "";
		String mkmUkSbtCd = "";
		String memberSbtCd = "";
		String contMskmNo = "";
		
		// 行毎の項目をマップに格納する。
		for(ArrayList<String> line : textList)
		{
			svcKeiNo = line.get(0);
			sysid = line.get(1);
			svcCd = line.get(2);
			pcrsCd = line.get(3);
			mskmDtlNo = line.get(4);
			mskmYmd = line.get(5);
			mkmUkSbtCd = line.get(6);
			memberSbtCd = line.get(7);
			contMskmNo = line.get(8);
			
			//出力インターフェースオブジェクトを生成
			JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
			
			outmap.set(JBSbatCNIFM022.SVC_KEI_NO, svcKeiNo);
			outmap.set(JBSbatCNIFM022.SYSID, sysid);
			outmap.set(JBSbatCNIFM022.SVC_CD, svcCd);
			outmap.set(JBSbatCNIFM022.PCRS_CD, pcrsCd);
			outmap.set(JBSbatCNIFM022.MSKM_DTL_NO, mskmDtlNo);
			outmap.set(JBSbatCNIFM022.MSKM_YMD, mskmYmd);
			outmap.set(JBSbatCNIFM022.MKM_UK_SBT_CD, mkmUkSbtCd);
			outmap.set(JBSbatCNIFM022.MEMBER_SBT_CD, memberSbtCd);
			outmap.set(JBSbatCNIFM022.CONT_MSKM_NO, contMskmNo);
			outmap.set(JBSbatCNIFM022.TRN_BNKT_CHR, String.valueOf(intTrnNo));
			
			if(intTrnNo == intMaxTrnBnkt)
			{
				// 最大処理分割数に到達した場合、処理分割数を初期化する。
				intTrnNo = 1;
			}
			else
			{
				// 最大処理分割数に到達した場合、処理分割数に1を足す。
				intTrnNo++;
			}
			
			//出力フラグを設定
			outmap.setOutFlg(true);
			outputBean.addOutMapList(outmap);
		}
		
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		db_ZM_M_WORK_PARAM_KNRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * 業務パラメータ管理SQLKEY(CN_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	業務パラメータ管理ＩＤ
	 *		 	業務パラメータ適用開始年月日
	 *		 	業務パラメータ適用終了年月日
	 * </pre>
	 * <p>
	 * @param param 業務パラメータ管理ＩＤ, 運用日付
	 * @return 処理分割文字列
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String executeZM_M_WORK_PARAM_KNRI_CN_SELECT_001(String workParam, String opeDate) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(workParam);
		paramList.setValue(opeDate);
		paramList.setValue(opeDate);
		
		// DBアクセスを実行します
		db_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_WORK_PARAM_KNRI_CN_SELECT_001);
		
		return db_ZM_M_WORK_PARAM_KNRI.selectNext().getString(JBSbatZM_M_WORK_PARAM_KNRI.WORK_PARAM_SETTE_VALUE);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * ファイルの内容を行毎に読込み・分割し、データをリストに格納する。
	 * @param  filePath ファイルパス
	 * @return ArrayList ファイルデータリスト
	 * @throws Exception 例外
	 */
	private HashSet<ArrayList<String>> convCsvFileToList(String filePath) throws JBSbatBusinessException, IOException {
		
		HashSet<ArrayList<String>> csvFileList = new HashSet<ArrayList<String>>();
		FileReader fr = null;
		BufferedReader br = null;
		
		try
		{
			// CSV指定ファイル読込み
			File file = new File(filePath);
			fr = new FileReader(file);
			br = new BufferedReader(fr);
			ArrayList<String> workList = null;
			String lineData = "";

			while (null != lineData)
			{
				// ワークリストを初期化
				workList = new ArrayList<String>();

				// CSVファイル一行読込み
				lineData = br.readLine();
				if(null != lineData && !("").equals(lineData))
				{
					// リストに格納された一行分のファイルデータを格納
					workList = convStringToList(lineData);
					csvFileList.add(workList);
				}
			}
		}
		catch (IOException e)
		{
			// 例外処理
			throw new JBSbatBusinessException("ECNB0540CE", new String[]{filePath});
		}
		finally
		{
	        // ストリームを閉じる
	        if(null != br )
	        {
	            br.close();
	        }
	        if(null != fr)
	        {
	        	fr.close();
	        }
		}
		return csvFileList;
	}

	/**
	 * 引数で指定されたCSVファイルの一行データを項目ごとに分割し、
	 * 引数の囲い文字を除外した状態でList格納する。
	 * @param  lineData 一行分のCSVデータ
	 * @return ArrayList 項目ごとにCSVデータを格納したList
	 * @throws Exception 例外
	 */
	private ArrayList<String> convStringToList(String lineData) {
		// 戻り値格納用List
		ArrayList<String> resultList = new ArrayList<String>();
		// 囲い文字「"」
		char kakoiMoji = '"';
		
		StringTokenizer st = new StringTokenizer(lineData, ",");
		StringBuffer bf = new StringBuffer();
		int len = 0;

		while (st.hasMoreElements())
		{
			String s = st.nextToken();
			bf = new StringBuffer();
			bf.append(s);
			len = bf.length();

			// 先頭文字が囲み文字の場合除去
			if(bf.charAt(0) == (kakoiMoji))
			{
				bf.delete(0, 1);
				len = len - 1;
			}

			// 終端文字が囲み文字の場合除去
			if(len > 0 && bf.charAt(len - 1) == (kakoiMoji))
			{
				bf.delete(len - 1, len);
			}

			// 戻り値となるリストに1項目分のデータ格納
			resultList.add(bf.toString());
		}

		// 1行分のデータを格納したListを返却
		return resultList;
	}

}
