/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUAddChgOptinmRcvsetCC
*   ソースファイル名：JFUAddChgOptinmRcvsetCC.java
*   作成者          ：富士通
*   日付            ：2021年05月28日
*＜機能概要＞
*  オプトインメール情報チェック登録コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v53.00      2021/05/28   FJ)西川    【IT1-2021-0000039】ANK-4009-00-00_CX戦略WG方針対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0141B002CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0141B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0141D010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0251B010CBSMsg1List;

/**
 * オプトインメール情報チェック登録部品です。
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUAddChgOptinmRcvsetCC extends JFUBaseCC
{

	/* ■□ ECK0011A010_お客様一意照会SC ■□ */
	/** テンプレートID(お客様一意照会) */
	private static final String TEMP_ID_ECK0011A010 = "ECK0011A010";
	/** テンプレートID(お客様一意照会明細) */
	private static final String TEMP_ID_DTL_ECK0011A010 = ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST;
	/** IN項目リスト(お客様一意照会) */
	private static final List<String> IN_LIST_ECK0011A010 = Arrays.asList(ECK0011A010CBSMsg.KEY_SYSID, ECK0011A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(お客様一意照会) */
	private static final String ERR_ECK0011A010 = ECK0011A010CBSMsg.KEY_SYSID_ERR;
	/** SC実行結果取得キー(お客様一意照会) */
	private static final String TEMP_TEMP_KEY_ECK0011A010 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_ECK0011A010 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ ECK0141B002_オプトインメール一覧照会SC ■□ */
	/** テンプレートID(オプトインメール一覧照会) */
	private static final String TEMP_ID_ECK0141B002 = "ECK0141B002";
	/** テンプレートID(オプトインメール一覧照会明細) */
	private static final String TEMP_ID_DTL_ECK0141B002 = ECK0141B002CBSMsg.ECK0141B002CBSMSG1LIST;
	/** IN項目リスト(オプトインメール一覧照会) */
	private static final List<String> IN_LIST_ECK0141B002 = Arrays.asList(ECK0141B002CBSMsg.KEY_OPE_YMD);
	/** 関連チェックエラー項目(オプトインメール一覧照会) */
	private static final String ERR_ECK0141B002 = ECK0141B002CBSMsg.KEY_OPE_YMD_ERR;
	/** SC実行結果取得キー(オプトインメール一覧照会) */
	private static final String TEMP_TEMP_KEY_ECK0141B002 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_ECK0141B002 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ ECK0141D010_オプトインメール受信設定登録SC ■□ */
	/** テンプレートID(オプトインメール受信設定登録) */
	private static final String TEMP_ID_ECK0141D010 = "ECK0141D010";
	/** テンプレートID(オプトインメール受信設定登録明細) */
	private static final String TEMP_ID_DTL_ECK0141D010 = null;
	/** IN項目リスト(オプトインメール受信設定登録) */
	private static final List<String> IN_LIST_ECK0141D010 =
			Arrays.asList(ECK0141D010CBSMsg.OPTINM_NO, ECK0141D010CBSMsg.SYSID, ECK0141D010CBSMsg.MLAD, ECK0141D010CBSMsg.RCV_DIV, ECK0141D010CBSMsg.RCV_SETTE_YMD, ECK0141D010CBSMsg.UPD_DTM_BF);
	/** 関連チェックエラー項目(オプトインメール受信設定登録) */
	private static final String ERR_ECK0141D010 = ECK0141D010CBSMsg.OPTINM_NO_ERR;

	/* ■□ IN項目 ■□ */
	/** IN：機能コード */
	private static final String IN_FUNC_CODE = "func_code";
	/** IN：SYSID取得先コンポーネント名 */
	private static final String IN_GET_SYSID_COMP_NM = "get_sysid_comp_nm";
	/** IN：メール受信設定表示フラグ */
	private static final String IN_MAIL_JUSIN_SETTEI_DSP_FLG = "mail_jusin_settei_dsp_flg";
	/** IN：SYSID */
	private static final String IN_SYSID = "in_sysid";
	/** IN：メールアドレス */
	private static final String IN_MLAD = "in_mlad";
	/** IN：オプトインメールワーク登録リスト */
	private static final String IN_OPTINM_ADD_LIST = "optinm_add_list";
	/** IN：オプトインメール番号 */
	private static final String IN_OPTINM_NO = "optinm_no";
	/** IN：受信区分 */
	private static final String IN_RCV_DIV = "rcv_div";
	/** 最終更新年月日時分秒(お客様) */
	private static final String HKTG_CUST_LAST_UPD_DTM = "hktg_cust_last_upd_dtm";

	/* ■□ その他 ■□ */
	/** オプトインメール番号 101:ＨＴＭＬメールの受信 */
	private static final String OPTINM_NO_HTMLMAIL = "101";

	/** メール受信設定表示フラグ 1：表示 */
	private static final String MAIL_JUSIN_SETTEI_DSP_FLG_1 = "1";
	/** SYSID */
	private static final String SYSID = "sysid";

	/**
	 * オプトインメール情報チェック登録処理
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// リクエストパラメータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		if (inMap == null || inMap.size() == 0)
		{
			// 情報が存在しない場合
			return param;
		}

		// 機能コード
		String funcCd = (String)inMap.get(IN_FUNC_CODE);

		if (JPCModelConstant.FUNC_CD_2.equals(funcCd))
		{
			// 機能コードが「2：チェックのみ」の場合
			return param;
		}

		// メール受信設定表示フラグ
		String dspFlg = (String)inMap.get(IN_MAIL_JUSIN_SETTEI_DSP_FLG);

		if (!JFUBPCommon.isNull(dspFlg) && !MAIL_JUSIN_SETTEI_DSP_FLG_1.equals(dspFlg))
		{
			// メール受信設定表示フラグが設定されていて、表示する以外の場合
			return param;
		}

		ArrayList inParamOptinList = (ArrayList)inMap.get(IN_OPTINM_ADD_LIST);
		if (inParamOptinList == null || inParamOptinList.size() == 0)
		{
			// 登録リストが未設定の場合
			return param;
		}

		// SYSIDの設定
		if (JFUBPCommon.isNull(inMap.get(IN_SYSID)))
		{
			// SYSIDが設定されていない場合
			HashMap keiMap = (HashMap)param.getData(inMap.get(IN_GET_SYSID_COMP_NM));
			if (keiMap == null || keiMap.size() == 0 || JFUBPCommon.isNull(keiMap.get(SYSID)))
			{
				// SYSIDが取得できない場合
				return param;
			}
			else
			{
				// SYSIDが取得できた場合
				inMap.put(IN_SYSID, keiMap.get(SYSID));
			}
		}

		// ●お客様一意照会
		// ユーザデータ初期化
		initData(param, fixedText, IN_LIST_ECK0011A010);
		// 上りマッピング
		setECK0011A010(param, fixedText);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_ID_ECK0011A010, TEMP_ID_DTL_ECK0011A010, IN_LIST_ECK0011A010, ERR_ECK0011A010);
		// 結果取得
		List<HashMap> eCK0011A010List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_ECK0011A010), TEMP_ID_DTL_ECK0011A010);

		if (eCK0011A010List == null || eCK0011A010List.size() == 0)
		{
			// お客様が存在しない場合
			return param;
		}

		// 最終更新年月日時分秒(お客様)
		String custLastUpdDtm = getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_ECK0011A010), TEMP_ID_DTL_ECK0011A010, ECK0011A010CBSMsg1List.LAST_UPD_DTM, 0);
		inMap.put(HKTG_CUST_LAST_UPD_DTM, custLastUpdDtm);

		// オプトインメール一覧照会
		List<HashMap> eCK0141B002List = getOptinmList(handle, param, fixedText);

		// 登録リスト
		List<HashMap> addList = new ArrayList();

		// 登録リスト設定処理
		if (eCK0141B002List != null && eCK0141B002List.size() > 0)
		{
			// 結果が存在する場合
			for (int i = 0; i < eCK0141B002List.size(); i++)
			{
				HashMap eCK0141B002Map = eCK0141B002List.get(i);
				if (eCK0141B002Map == null || eCK0141B002Map.size() == 0)
				{
					// 情報が存在しない場合
					continue;
				}

				HashMap optinmWkMap = new HashMap();
				String optinmNo = (String)eCK0141B002Map.get(ECK0141B002CBSMsg1List.OPTINM_NO);

				// ワークに情報が存在しない場合、マスタを主として受信しないで設定する(ワークの更新はなし)
				optinmWkMap.put(ECK0251B010CBSMsg1List.OPTINM_NO, optinmNo);

				// オプトインメール番号「101:ＨＴＭＬメールの受信」の場合は「受信する」で設定
				if (OPTINM_NO_HTMLMAIL.equals(optinmNo))
				{
					optinmWkMap.put(ECK0251B010CBSMsg1List.RCV_DIV, JFUStrConst.CD00263_1);
				}
				else
				{

					String rcvDiv = getOptinmSetteiJushinRcvDiv(optinmNo, inParamOptinList, (String)eCK0141B002Map.get(ECK0141B002CBSMsg1List.SHK_VALUE_FLG));
					optinmWkMap.put(ECK0251B010CBSMsg1List.RCV_DIV, rcvDiv);
				}
				addList.add(optinmWkMap);
			}
		}

		// 登録処理
		for (int i = 0; i < addList.size(); i++)
		{
			HashMap optinmSummrMap = addList.get(i);

			if (optinmSummrMap == null || optinmSummrMap.size() == 0)
			{
				// 情報が取得できない場合
				continue;
			}

			// ●オプトインメール受信設定登録
			// ユーザデータ初期化
			initData(param, fixedText, IN_LIST_ECK0141D010);

			// 上りマッピング
			setECK0141D010(param, fixedText, optinmSummrMap);

			// サービスIF実行
			executeSC(handle, param, fixedText, TEMP_ID_ECK0141D010, TEMP_ID_DTL_ECK0141D010, IN_LIST_ECK0141D010, ERR_ECK0141D010);
		}
		return param;

	}

	/**
	 * オプトインメール一覧照会処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return オプトインメールリスト
	 * @throws Exception 例外
	 */
	private List<HashMap> getOptinmList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ●ECK0141B002_オプトインメール一覧照会
		// ユーザデータ初期化
		initData(param, fixedText, IN_LIST_ECK0141B002);
		// 上りマッピング
		setECK0141B002(param, fixedText);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_ID_ECK0141B002, TEMP_ID_DTL_ECK0141B002, IN_LIST_ECK0141B002, ERR_ECK0141B002);
		// 結果取得
		List<HashMap> eCK0141B002List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_ECK0141B002), TEMP_ID_DTL_ECK0141B002);

		return eCK0141B002List;
	}

	/**
	 * オプトインメール受信設定に登録する受信区分の取得処理
	 * 
	 * <br>
	 * @param optinmNo オプトインメール番号
	 * @param eCK0141B005List オプトインメール受信設定リスト
	 * @param shkValueFlg マスタ設定値
	 * @throws Exception 例外
	 */
	private String getOptinmSetteiJushinRcvDiv(String optinmNo, List<HashMap> inParamOptinList, String shkValueFlg) throws Exception
	{
		// オプトインメール設定の存在チェック
		if (inParamOptinList != null && inParamOptinList.size() > 0)
		{
			for (int i = 0; i < inParamOptinList.size(); i++)
			{
				HashMap inParamOptinListMap = inParamOptinList.get(i);
				if (optinmNo.equals(inParamOptinListMap.get(IN_OPTINM_NO)))
				{
					// オプトインメール設定が存在する場合
					// 現在設定されている値を設定
					return (String)inParamOptinListMap.get(IN_RCV_DIV);
				}
			}
		}
		// オプトインメール設定が存在しない場合
		// マスタ設定値を設定
		return shkValueFlg;
	}

	/**
	 * オプトインメール一覧照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @throws RequestParameterException
	 */
	private void setECK0141B002(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ＫＥＹ＿運用年月日
		inMap.put(ECK0141B002CBSMsg.KEY_OPE_YMD, JCCBPCommon.getOpeDate(null));
	}

	/**
	 * お客様一意照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @throws RequestParameterException
	 */
	private void setECK0011A010(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ＫＥＹ＿SYSID
		inMap.put(ECK0011A010CBSMsg.KEY_SYSID, inMap.get(IN_SYSID));
		// ＫＥＹ＿予約適用年月日
		inMap.put(ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null));
	}

	/**
	 * オプトインメール受信設定登録の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param optinmWkMap オプトインメール受信設定ワーク情報
	 * @throws RequestParameterException
	 */
	private void setECK0141D010(IRequestParameterReadWrite param, String fixedText, HashMap optinmSummrMap) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// オプトインメール番号
		inMap.put(ECK0141D010CBSMsg.OPTINM_NO, optinmSummrMap.get(ECK0251B010CBSMsg1List.OPTINM_NO));
		// SYSID
		inMap.put(ECK0141D010CBSMsg.SYSID, inMap.get(IN_SYSID));
		// メールアドレス
		inMap.put(ECK0141D010CBSMsg.MLAD, inMap.get(IN_MLAD));
		// 受信区分
		inMap.put(ECK0141D010CBSMsg.RCV_DIV, optinmSummrMap.get(ECK0251B010CBSMsg1List.RCV_DIV));
		// 受信設定年月日
		inMap.put(ECK0141D010CBSMsg.RCV_SETTE_YMD, JCCBPCommon.getOpeDate(null));
		// 更新年月日時分秒(更新前)
		inMap.put(ECK0141D010CBSMsg.UPD_DTM_BF, inMap.get(HKTG_CUST_LAST_UPD_DTM));
	}

	/**
	 * チェック処理（共通処理）です。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@Override
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}
}
