/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUAddChgOptinmRcvstWkCC
*   ソースファイル名：JFUAddChgOptinmRcvstWkCC.java
*   作成者          ：富士通
*   日付            ：2016年09月21日
*＜機能概要＞
*  オプトインメール受信設定ワーク登録更新コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v27.00      2016/09/21   FJ)岡井     【ANK-2987-00-00】メールリーチ率向上
**********************************************************************/
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.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECK0251B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0251B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0251C010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0251D010CBSMsg;

/**
 * オプトインメール受信設定ワーク登録更新部品です。
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUAddChgOptinmRcvstWkCC extends JFUBaseCC
{
	/* ■□ ECK0251B010_オプトインメール受信設定ワーク一覧照会SC ■□ */
	/** テンプレートID(オプトインメール受信設定ワーク一覧照会) */
	private static final String TEMP_ID_ECK0251B010 = "ECK0251B010";
	/** テンプレートID(オプトインメール受信設定ワーク一覧照会明細) */
	private static final String TEMP_ID_DTL_ECK0251B010 = ECK0251B010CBSMsg.ECK0251B010CBSMSG1LIST;
	/** IN項目リスト(オプトインメール受信設定ワーク一覧照会) */
	private static final List<String> IN_LIST_ECK0251B010 = Arrays.asList(ECK0251B010CBSMsg.KEY_SYSID,
			ECK0251B010CBSMsg.KEY_WEB_ACCSS_NSKEY_NO);
	/** 関連チェックエラー項目(オプトインメール受信設定ワーク一覧照会) */
	private static final String ERR_ECK0251B010 = ECK0251B010CBSMsg.KEY_SYSID_ERR;
	/** SC実行結果取得キー(オプトインメール受信設定ワーク一覧照会) */
	private static final String TEMP_TEMP_KEY_ECK0251B010 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_ECK0251B010 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ ECK0251D010_オプトインメール受信設定ワーク登録SC ■□ */
	/** テンプレートID(オプトインメール受信設定ワーク登録) */
	private static final String TEMP_ID_ECK0251D010 = "ECK0251D010";
	/** テンプレートID(オプトインメール受信設定ワーク登録明細) */
	private static final String TEMP_ID_DTL_ECK0251D010 = null;
	/** IN項目リスト(オプトインメール受信設定ワーク登録) */
	private static final List<String> IN_LIST_ECK0251D010 = Arrays.asList(ECK0251D010CBSMsg.OPTINM_NO, ECK0251D010CBSMsg.SYSID,
			ECK0251D010CBSMsg.RCV_DIV);
	/** 関連チェックエラー項目(オプトインメール受信設定ワーク登録) */
	private static final String ERR_ECK0251D010 = ECK0251D010CBSMsg.OPTINM_NO_ERR;

	/* ■□ ECK0251C010_オプトインメール受信設定ワーク更新SC ■□ */
	/** テンプレートID(オプトインメール受信設定ワーク更新) */
	private static final String TEMP_ID_ECK0251C010 = "ECK0251C010";
	/** テンプレートID(オプトインメール受信設定ワーク更新明細) */
	private static final String TEMP_ID_DTL_ECK0251C010 = null;
	/** IN項目リスト(オプトインメール受信設定ワーク更新) */
	private static final List<String> IN_LIST_ECK0251C010 = Arrays.asList(ECK0251C010CBSMsg.OPTINM_RCVST_WK_NO,
			ECK0251C010CBSMsg.SHOSAJI_RRKS_MLAD, ECK0251C010CBSMsg.WEB_ACCSS_NSKEY_NO, ECK0251C010CBSMsg.MAIL_TTU_CFM_CD,
			ECK0251C010CBSMsg.RCV_DIV, ECK0251C010CBSMsg.UPD_DTM_BF);
	/** 関連チェックエラー項目(オプトインメール受信設定ワーク更新) */
	private static final String ERR_ECK0251C010 = ECK0251C010CBSMsg.OPTINM_RCVST_WK_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_OPTINM_WORK_ADD_LIST = "optinm_work_add_list";
	/** IN：オプトインメール番号 */
	private static final String IN_OPTINM_NO = "optinm_no";
	/** IN：受信区分 */
	private static final String IN_RCV_DIV = "rcv_div";

	/* ■□ その他 ■□ */
	/** SYSID */
	private static final String SYSID = "sysid";
	/** メール到達確認コード 001：登録済 */
	private static final String MAIL_TTU_CFM_CD_001 = "001";

	/** メール受信設定表示フラグ 1：表示 */
	private static final String MAIL_JUSIN_SETTEI_DSP_FLG_1 = "1";

	/**
	 * オプトインメール受信設定ワーク登録処理
	 * <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 addList = (ArrayList)inMap.get(IN_OPTINM_WORK_ADD_LIST);
		if (addList == null || addList.size() == 0)
		{
			// 登録リストが未設定の場合
			return param;
		}

		// SYSIDの設定
		if (JFUBPCommon.isNull((String)inMap.get(IN_SYSID)))
		{
			// SYSIDが設定されていない場合
			HashMap keiMap = (HashMap)param.getData((String)inMap.get(IN_GET_SYSID_COMP_NM));
			if (keiMap == null || keiMap.size() == 0 || JFUBPCommon.isNull((String)keiMap.get(SYSID)))
			{
				// SYSIDが取得できない場合
				return param;
			}
			else
			{
				// SYSIDが取得できた場合
				inMap.put(IN_SYSID, (String)keiMap.get(SYSID));
			}
		}

		// ●オプトインメール受信設定ワーク一覧照会
		// ユーザデータ初期化
		initData(param, fixedText, IN_LIST_ECK0251B010);
		// 上りマッピング
		setECK0251B010(param, fixedText);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_ID_ECK0251B010, TEMP_ID_DTL_ECK0251B010, IN_LIST_ECK0251B010, ERR_ECK0251B010);
		// 結果取得
		List<HashMap> eCK0251B010List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_ECK0251B010), TEMP_ID_DTL_ECK0251B010);

		if (eCK0251B010List == null || eCK0251B010List.size() == 0)
		{
			// オプトインメール受信設定ワークに存在しない場合、登録リスト件数分、登録する
			for (int i = 0; i < addList.size(); i++)
			{
				HashMap childMap = (HashMap)addList.get(i);

				if (childMap == null || childMap.size() == 0)
				{
					// 登録情報が未設定の場合
					continue;
				}

				// ●ECK0251D010_オプトインメール受信設定ワーク登録
				// ユーザデータ初期化
				initData(param, fixedText, IN_LIST_ECK0251D010);
				// 上りマッピング
				setECK0251D010(param, fixedText, childMap);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMP_ID_ECK0251D010, TEMP_ID_DTL_ECK0251D010, IN_LIST_ECK0251D010, ERR_ECK0251D010);
			}
		}
		else
		{
			// オプトインメール受信設定ワークに存在する場合
			HashMap optinmWkAddMap = new HashMap<String, Object>();
			ArrayList wkChgList = new ArrayList();
			ArrayList afWkAddList = new ArrayList();

			// オプトインメール受信設定ワークの情報を集約
			for (int j = 0; j < eCK0251B010List.size(); j++)
			{
				HashMap wkChildMap = eCK0251B010List.get(j);
				if (wkChildMap == null || wkChildMap.size() == 0)
				{
					// 情報が存在しない場合
					continue;
				}

				String wkOptinmNo = (String)wkChildMap.get(ECK0251B010CBSMsg1List.OPTINM_NO);
				optinmWkAddMap.put(wkOptinmNo, wkChildMap);
			}

			// 更新リストと登録リストを作成
			for (int i = 0; i < addList.size(); i++)
			{
				HashMap addMap = (HashMap)addList.get(i);
				if (addMap == null || addMap.size() == 0)
				{
					// 登録情報が未設定の場合
					continue;
				}

				String addOptinmNo = (String)addMap.get(IN_OPTINM_NO);
				if (optinmWkAddMap.containsKey(addOptinmNo) && optinmWkAddMap.get(addOptinmNo) != null)
				{
					// ワークに存在するオプトインメール番号の場合、受信区分を書き換え更新リストに追加
					HashMap wkMap = (HashMap)optinmWkAddMap.get(addOptinmNo);
					wkMap.put(ECK0251C010CBSMsg.RCV_DIV, (String)addMap.get(IN_RCV_DIV));

					wkChgList.add(wkMap);
				}
				else
				{
					// ワークに存在しないオプトインメール番号の場合、登録リストに追加
					afWkAddList.add(addMap);
				}
			}

			if (wkChgList != null && wkChgList.size() > 0)
			{
				// オプトインメール受信設定ワークに更新がある場合
				for (int j = 0; j < wkChgList.size(); j++)
				{
					HashMap wkChgMap = (HashMap)wkChgList.get(j);
					if (wkChgMap == null || wkChgMap.size() == 0)
					{
						// 情報が存在しない場合
						continue;
					}

					// ●オプトインメール受信設定ワーク更新
					// ユーザデータ初期化
					initData(param, fixedText, IN_LIST_ECK0251C010);
					// 上りマッピング
					setECK0251C010(param, fixedText, wkChgMap);
					// サービスIF実行
					executeSC(handle, param, fixedText, TEMP_ID_ECK0251C010, TEMP_ID_DTL_ECK0251C010, IN_LIST_ECK0251C010, ERR_ECK0251C010);
				}
			}

			if (afWkAddList != null && afWkAddList.size() > 0)
			{
				// オプトインメール受信設定ワークに新規登録がある場合
				for (int i = 0; i < afWkAddList.size(); i++)
				{
					HashMap afAddMap = (HashMap)afWkAddList.get(i);

					if (afAddMap == null || afAddMap.size() == 0)
					{
						// 登録情報が未設定の場合
						continue;
					}

					// ●ECK0251D010_オプトインメール受信設定ワーク登録
					// ユーザデータ初期化
					initData(param, fixedText, IN_LIST_ECK0251D010);
					// 上りマッピング
					setECK0251D010(param, fixedText, afAddMap);
					// サービスIF実行
					executeSC(handle, param, fixedText, TEMP_ID_ECK0251D010, TEMP_ID_DTL_ECK0251D010, IN_LIST_ECK0251D010, ERR_ECK0251D010);
				}
			}
		}

		return param;
	}

	/**
	 * チェック処理（共通処理）です。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * オプトインメール受信設定ワーク一覧照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @throws RequestParameterException
	 */
	private void setECK0251B010(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ＫＥＹ＿ＳＹＳＩＤ
		inMap.put(ECK0251B010CBSMsg.KEY_SYSID, (String)inMap.get(IN_SYSID));
	}

	/**
	 * オプトインメール受信設定ワーク登録の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param childMap 登録情報マップ
	 * @throws RequestParameterException
	 */
	private void setECK0251D010(IRequestParameterReadWrite param, String fixedText, HashMap childMap) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// オプトインメール番号
		inMap.put(ECK0251D010CBSMsg.OPTINM_NO, (String)childMap.get(IN_OPTINM_NO));
		// SYSID
		inMap.put(ECK0251D010CBSMsg.SYSID, (String)inMap.get(IN_SYSID));
		// 受信区分
		inMap.put(ECK0251D010CBSMsg.RCV_DIV, (String)childMap.get(IN_RCV_DIV));
	}

	/**
	 * オプトインメール受信設定ワーク更新の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param optinmWkMap オプトインメール受信設定ワーク情報
	 * @throws RequestParameterException
	 */
	private void setECK0251C010(IRequestParameterReadWrite param, String fixedText, HashMap optinmWkMap)
		throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// オプトインメール受信設定ワーク番号
		inMap.put(ECK0251C010CBSMsg.OPTINM_RCVST_WK_NO, (String)optinmWkMap.get(ECK0251B010CBSMsg1List.OPTINM_RCVST_WK_NO));
		// 照査時連絡先メールアドレス
		inMap.put(ECK0251C010CBSMsg.SHOSAJI_RRKS_MLAD, (String)optinmWkMap.get(ECK0251B010CBSMsg1List.SHOSAJI_RRKS_MLAD));
		// Webアクセス認証キー番号
		inMap.put(ECK0251C010CBSMsg.WEB_ACCSS_NSKEY_NO, (String)optinmWkMap.get(ECK0251B010CBSMsg1List.WEB_ACCSS_NSKEY_NO));
		// メール到達確認コード
		inMap.put(ECK0251C010CBSMsg.MAIL_TTU_CFM_CD, MAIL_TTU_CFM_CD_001);
		// 受信区分
		inMap.put(ECK0251C010CBSMsg.RCV_DIV, (String)optinmWkMap.get(IN_RCV_DIV));
		// 更新年月日時分秒(更新前)
		inMap.put(ECK0251C010CBSMsg.UPD_DTM_BF, (String)optinmWkMap.get(ECK0251B010CBSMsg1List.UPD_DTM));
	}
}
