/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKEMoneyMailUtil
*	ソースファイル名	：JBSbatKKEMoneyMailUtil.java
*	作成者				：富士通　
*	作成日				：2022年02月1日
*＜機能概要＞
*　電子マネー向けメール共通部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v57.00.00	2022/01/25   FJ）舘山	【ANK-4208-00-00】  電子マネー特定導入
*********************************************************************/
package eo.business.common;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.util.table.JBSbatCK_T_RRKS;
import eo.business.util.table.JBSbatKK_T_OPSVKEI_ISP;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;

/**
 * (クラスの機能概要) <p>
 *<BR>
 * @author 富士通
 */
public class JBSbatKKEMoneyMailUtil 
{
	/** テーブル(連絡先)*/
	private static final String D_TBL_NAME_CK_T_RRKS = "CK_T_RRKS";
	/** テーブル(オプションサービス契約<ISP>)*/
	private static final String D_TBL_NAME_KK_T_OPSVKEI_ISP = "KK_T_OPSVKEI_ISP";

	/** SQL定義キー(KK_SELECT_010)*/
	private static final String CK_T_RRKS_KK_SELECT_010 = "KK_SELECT_010";
	/** SQL定義キー(KK_SELECT_035)*/
	private static final String KK_T_OPSVKEI_ISP_KK_SELECT_035 = "KK_SELECT_035";

	/** テーブルアクセスクラス(連絡先)*/
	private JBSbatSQLAccess db_CK_T_RRKS = null;
	/** テーブルアクセスクラス(オプションサービス契約<ISP>)*/
	private JBSbatSQLAccess db_KK_T_OPSVKEI_ISP = null;


	/** 予約適用コード（予約）*/
	private static final String RSV_APLY_CD_RSV = "1";
	/** 予約適用コード（確定）*/
	private static final String RSV_APLY_CD_FIX = "2";

	/**
	 * 初期化処理
	 * バッチのinitialメソッド内で呼出しする。
	 * <br>
	 * @param commonItem
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		db_CK_T_RRKS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_RRKS);
		db_KK_T_OPSVKEI_ISP = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_OPSVKEI_ISP);
		
	}
	
	/**
	 * 
	 * @param sysid
	 * @param svcKeiNo
	 * @return
	 * @throws Exception 
	 */
	public ArrayList<String> getMailAddrList(String sysid, String svcKeiNo, String opeDate) throws Exception
	{
		// 契約者メールアドレス取得
		ArrayList<String> mladList = new ArrayList<String>();
		Object[] params = new Object[] {
				svcKeiNo
				,opeDate
		};
		executeKK_T_OPSVKEI_ISP_KK_SELECT_035(params);
		JBSbatCommonDBInterface ispMap = db_KK_T_OPSVKEI_ISP.selectNext();
		while (ispMap != null)
		{
			mladList.add(ispMap.getString(JBSbatKK_T_OPSVKEI_ISP.MLAD));
			ispMap = db_KK_T_OPSVKEI_ISP.selectNext();
		}
		// 連絡先メールアドレス取得
		String rrksMlad = getRrksMailAddress(sysid);
		if (rrksMlad != null && !mladList.contains(rrksMlad))
		{
			mladList.add(rrksMlad);
		}
		
		return mladList;
	}
	
	/**
	 * 連絡先メールアドレスを取得する
	 * @param sysid
	 * @return
	 * @throws Exception
	 */
	private String getRrksMailAddress(String sysid) throws Exception
	{
		ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
		executeCK_T_RRKS_KK_SELECT_010(new Object[] {sysid});
		
		String rrksNo = "";
		JBSbatCommonDBInterface rrksMap = db_CK_T_RRKS.selectNext();
		while (rrksMap != null)
		{
			HashMap<String, String> one = new HashMap<String,String>();

			// 連絡先コードが新しければクリア
			if (!rrksNo.equals(rrksMap.getString(JBSbatCK_T_RRKS.RRKS_NO)))
			{
				list.clear();
				rrksNo = rrksMap.getString(JBSbatCK_T_RRKS.RRKS_NO);
			}
			one.put(JBSbatCK_T_RRKS.GENE_ADD_DTM, rrksMap.getString(JBSbatCK_T_RRKS.GENE_ADD_DTM));
			one.put(JBSbatCK_T_RRKS.MLAD, rrksMap.getString(JBSbatCK_T_RRKS.MLAD));
			one.put(JBSbatCK_T_RRKS.RSV_APLY_CD, rrksMap.getString(JBSbatCK_T_RRKS.RSV_APLY_CD));
			list.add(one);
			
			rrksMap = db_CK_T_RRKS.selectNext();
		}
		// 先頭の次のレコードが予約レコードかつ先頭が確定レコードの場合、最後のレコードを削除する
		if (list.size() >= 2 && 
			RSV_APLY_CD_RSV.equals(list.get(1).get(JBSbatCK_T_RRKS.RSV_APLY_CD)) && 
			RSV_APLY_CD_FIX.equals(list.get(0).get(JBSbatCK_T_RRKS.RSV_APLY_CD)))
		{
			list.remove(0); // 先頭を削除
		}
		// 最後のレコードから確定レコードを探す
		for (int i=list.size()-1; i >= 0; i--)
		{
			if (RSV_APLY_CD_FIX.equals(list.get(i).get(JBSbatCK_T_RRKS.RSV_APLY_CD)))
			{
				return list.get(i).get(JBSbatCK_T_RRKS.MLAD);
			}
		}
		return null;
	}
	
	/**
	 * 終了処理
	 * 利用するバッチのterminalメソッド内で呼び出す。
	 * <br>
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		db_CK_T_RRKS.close();
		db_KK_T_OPSVKEI_ISP.close();
		
	}
	/**
	 * SQLKEY(KK_SELECT_035)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	サービス契約番号
	 *		 	運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_OPSVKEI_ISP_KK_SELECT_035(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString()); // サービス契約番号
		paramList.setValue(param[1].toString()); // 運用日

		// DBアクセスを実行します
		db_KK_T_OPSVKEI_ISP.selectBySqlDefine(paramList, KK_T_OPSVKEI_ISP_KK_SELECT_035);
	}
	/**
	 * SQLKEY(KK_SELECT_010)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	SYSID
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCK_T_RRKS_KK_SELECT_010(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString()); // SYSID

		// DBアクセスを実行します
		db_CK_T_RRKS.selectBySqlDefine(paramList, CK_T_RRKS_KK_SELECT_010);
	}
}
