/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JFUCsCrsOpchUpdateCC
*	ソースファイル名：JFUCsCrsOpchUpdateCC.java
*	作成者			：−
*	日付			：2025年01月16日
*＜機能概要＞
*	eo光ＴＶＣＳコース用オプションチャンネル申込、解約部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
**********************************************************************/
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 com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0381D010CBSMsg;

/**
 * eo光ＴＶCSコース用オプションチャンネル申込、解約処理を行います。<p>
 * <BR>
 * @author 富士通
 */
public class JFUCsCrsOpchUpdateCC extends AbstractCommonComponent
{

	/** 実行区分 */
	private static final String EXEC_CD = "exec_cd";
	/** 実行区分：登録*/
	private static final String EXEC_CD_1 = "1";

	/** CSコース用オプションチャンネル情報操作マップ　JKKCsCrsOpchInfOperateCC */
	private static String FIXED_TEXT_CS_CRS_OPCH = "JKKCsCrsOpchInfSelect";
	/** [CSコース用オプションチャンネル情報操作CC] 機能コード"3":参照 */
	private static String CS_CRS_OPCH_INF_OPERATE_FUNC_CD_3 = "3";

	/** [CSコース用オプションチャンネル情報操作CC] 変更区分"2":削除 */
	private static String CS_CRS_OPCH_INF_OPERATE_CHG_DIV_2 = "2";
	/** [CSコース用オプションチャンネル情報操作CC] 変更区分"3":取消 */
	private static String CS_CRS_OPCH_INF_OPERATE_CHG_DIV_3 = "3";

	/** [CSコース用オプションチャンネル情報操作CC] スカパー適用基準年月日区分"1":即時 */
	private static String SPTV_APLY_STDARDYMD_DIV_1 = "1";

	/** [スカパー連携ステータス] 削除対象 */
	private static final List<String> SPTV_RNK_STAT_DELETE = Arrays.asList(JFUStrConst.CD01855_100);

	/** オプションサービス契約の情報マップ名（更新時に使用） */
	private static String OP_SVC_KEI_NO_MAP_NAME = "op_svc_kei_no_map_name";

	/** 相手システムID フロント */
	private static final String AITE_SYSID_FRONT = "4";

	/**
	 * CSコース用オプションチャンネル情報操作
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return IRequestParameterReadWrite
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		String dataMapKey = fixedText;

		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		String func_cd = (String)ccMsg.get("func_cd");
		String svc_kei_no = (String)ccMsg.get("svc_kei_no");
		String cascd_no = (String)ccMsg.get("cascd_no");
		printlnEjbLog("■■■ execute 処理開始  ■■■ func_cd=[" + func_cd + "] svc_kei_no=[" + svc_kei_no + "] cascd_no=[" + cascd_no + "]");

		// ＝JKKCsCrsOpchInfOperateCC_CSコース用オプションチャンネル情報操作CC＝
		ArrayList<HashMap<String, String>> op_status_list = new ArrayList<HashMap<String, String>>();
		String err_cd = JFUStrConst.EMPTY;
		// ■(1)「CAS番号対象オプションサービス契約」について、解約の場合は現時点のステータスから判定して変更区分を再セットする。
		if (!EXEC_CD_1.equals((String)ccMsg.get(EXEC_CD))){
			// 解約
			selectOpcCC(handle, param, fixedText, FIXED_TEXT_CS_CRS_OPCH);
			HashMap<String, Object> infoMap = (HashMap<String, Object>)param.getData(FIXED_TEXT_CS_CRS_OPCH);
			err_cd = JFUBPCommon.nvl((String)infoMap.get("err_cd"), JFUStrConst.EMPTY);
			op_status_list = (ArrayList<HashMap<String, String>>)infoMap.get("op_list");
			if (infoMap == null || infoMap.size() == 0)
			{
				// エラー有り
				printlnEjbLog("■■■ execute 照会処理エラー(1)  ■■■ func_cd=[" + func_cd + "] svc_kei_no=[" + svc_kei_no + "] cascd_no=[" + cascd_no
						+ "] err_cd=[" + err_cd + "]");
				return param;
			}
			if (!JFUBPCommon.isNull(err_cd))
			{
				// エラー有り
				printlnEjbLog("■■■ execute 照会処理エラー(2)  ■■■ func_cd=[" + func_cd + "] svc_kei_no=[" + svc_kei_no + "] cascd_no=[" + cascd_no
						+ "] err_cd=[" + err_cd + "]");
				return param;
			}
		}

		// ■(2)「CAS番号対象オプションサービス契約」の更新処理（チェックor更新）を行う。

		updOpcCC(handle, param, fixedText, op_status_list);
		HashMap<String, Object> resultMap = (HashMap<String, Object>)param.getData(fixedText);
		err_cd = JFUBPCommon.nvl((String)resultMap.get("err_cd"), JFUStrConst.EMPTY);

		printlnEjbLog("■■■ 処理終了  ■■■ func_cd=[" + func_cd + "] svc_kei_no=[" + svc_kei_no + "] cascd_no=[" + cascd_no + "] err_cd=[" + err_cd + "]");
		return param;
	}

	/**
	 * CSコース用オプションチャンネル情報操作CC（参照）
	 * 
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return
	 * @throws Throwable
	 */
	private void selectOpcCC(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String fixedTextSub) throws Throwable
	{
		ArrayList<HashMap<String, String>> resultList = new ArrayList<HashMap<String, String>>();
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);

		ArrayList<HashMap<String, String>> param_upd_list = (ArrayList<HashMap<String, String>>)ccMsg.get("op_upd_list");
		ArrayList<HashMap<String, String>> op_list = new ArrayList<HashMap<String, String>>();

		for (HashMap<String, String> childMap : param_upd_list)
		{
			HashMap<String, String> resultMap = new HashMap<String, String>();
			String op_svc_kei_no = childMap.get("op_svc_kei_no");
			String op_stat = childMap.get("op_stat");
			String op_stat_nm = childMap.get("op_stat_nm");
			String op_svc_cd = childMap.get("op_svc_cd");
			String op_svc_cd_nm = childMap.get("op_svc_cd_nm");
			String pcrs = childMap.get("pcrs");
			String pcrs_nm = childMap.get("pcrs_nm");
			String pplan = childMap.get("pplan");
			String pplan_nm = childMap.get("pplan_nm");
			String svc_staymd = childMap.get("svc_staymd");
			String sptv_rnk_stat = childMap.get("sptv_rnk_stat");
			String sptv_rnk_stat_nm = childMap.get("sptv_rnk_stat_nm");
			String keyopn_ymd = childMap.get("keyopn_ymd");
			String keycls_ymd = childMap.get("keycls_ymd");
			String op_svc_biko = childMap.get("op_svc_biko");

			// オプションサービス契約番号
			resultMap.put("op_svc_kei_no", op_svc_kei_no);
			// オプションステータス
			resultMap.put("op_stat", op_stat);
			// オプションステータス名称
			resultMap.put("op_stat_nm", op_stat_nm);
			// オプションサービスコード
			resultMap.put("op_svc_cd", op_svc_cd);
			// オプションサービスコード名称
			resultMap.put("op_svc_cd_nm", op_svc_cd_nm);
			// 料金コース
			resultMap.put("pcrs", pcrs);
			// 料金コース名称
			resultMap.put("pcrs_nm", pcrs_nm);
			// 料金プラン
			resultMap.put("pplan", pplan);
			// 料金プラン名称
			resultMap.put("pplan_nm", pplan_nm);
			// サービス開始年月日
			resultMap.put("svc_staymd", svc_staymd);
			// スカパー連携ステータス
			resultMap.put("sptv_rnk_stat", sptv_rnk_stat);
			// スカパー連携ステータス名称
			resultMap.put("sptv_rnk_stat_nm", sptv_rnk_stat_nm);
			// 鍵開け日付
			resultMap.put("keyopn_ymd", keyopn_ymd);
			// 鍵閉め日付
			resultMap.put("keycls_ymd", keycls_ymd);
			// オプションサービス備考
			resultMap.put("op_svc_biko", op_svc_biko);

			op_list.add(resultMap);
		}

		HashMap<String, Object> ccMap = new HashMap<String, Object>();

		String func_cd = CS_CRS_OPCH_INF_OPERATE_FUNC_CD_3;
		String svc_kei_no = (String)ccMsg.get("svc_kei_no");
		String cascd_no = (String)ccMsg.get("cascd_no");
		ccMap.put("func_cd", func_cd);
		ccMap.put("svc_kei_no", svc_kei_no);
		ccMap.put("aite_sysid", AITE_SYSID_FRONT);
		ccMap.put("cascd_no", cascd_no);
		ccMap.put("op_list", op_list);

		param.setData(fixedTextSub, ccMap);
		//■■■■■ CSコース用オプションチャンネル情報操作CC （参照）■■■■■
		JKKCsCrsOpchInfOperateCC opcCC = new JKKCsCrsOpchInfOperateCC();
		opcCC.operateOpchInf(handle, param, fixedTextSub);

	}

	/**
	 * CSコース用オプションチャンネル情報操作CC呼出。
	 * 
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param op_status_list
	 * @return
	 * @throws Throwable
	 */
	private void updOpcCC(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, ArrayList<HashMap<String, String>> op_status_list)
			throws Throwable
	{

		ArrayList<HashMap<String, String>> resultList = new ArrayList<HashMap<String, String>>();
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		ArrayList<HashMap<String, String>> param_upd_list = (ArrayList<HashMap<String, String>>)ccMsg.get("op_upd_list");
		ArrayList<HashMap<String, String>> op_upd_list = new ArrayList<HashMap<String, String>>();

		HashMap<String, Object> ccMap = new HashMap<String, Object>();
		String func_cd = (String)ccMsg.get("func_cd");
		String svc_kei_no = (String)ccMsg.get("svc_kei_no");
		String cascd_no = (String)ccMsg.get("cascd_no");
		ccMap.put("func_cd", func_cd);
		ccMap.put("svc_kei_no", svc_kei_no);
		ccMap.put("aite_sysid", AITE_SYSID_FRONT);
		ccMap.put("cascd_no", cascd_no);

		// 実行区分によって、パラメータの再設定を行う。
		if (EXEC_CD_1.equals((String)ccMsg.get(EXEC_CD)))
		{
			// 登録画面 ※呼出元は1レコードのみ
			String op_svc_kei_no = JFUStrConst.EMPTY;
			String mapName = (String)ccMsg.get(OP_SVC_KEI_NO_MAP_NAME);
			HashMap<String, Object> add_op_svc_keiMap = (HashMap<String, Object>)param.getData(mapName);
			if (add_op_svc_keiMap != null && add_op_svc_keiMap.size() > 0)
			{
				// 採番されたオプションサービス契約番号
				op_svc_kei_no = (String)add_op_svc_keiMap.get(EKK0381D010CBSMsg.OP_SVC_KEI_NO);
			}
			HashMap<String, String> childMap = (HashMap<String, String>)param_upd_list.get(0);
			childMap.put("op_svc_kei_no", op_svc_kei_no);
			op_upd_list.add(childMap);
		}
		else
		{
			// 解約画面
			for (HashMap<String, String> paramUpdMap : param_upd_list)
			{
				HashMap<String, String> childMap = new HashMap<String, String>();
				String op_svc_kei_no = paramUpdMap.get("op_svc_kei_no"); // オプションサービス契約番号

				String chg_div = paramUpdMap.get("chg_div"); // 変更区分
				String sptv_aply_stdardymd_div = JFUStrConst.EMPTY; // スカパー適用基準年月日区分
				String use_endymd = JFUStrConst.EMPTY; // 利用終了日

				// 最新の状態を取得
				for (HashMap<String, String> statusMap : op_status_list)
				{
					String check_op_svc_kei_no = (String)statusMap.get("op_svc_kei_no");
					if (!op_svc_kei_no.equals(check_op_svc_kei_no))
					{
						// 同一オプションサービス契約番号でない
						continue;
					}
					String sptv_rnk_stat = (String)statusMap.get("sptv_rnk_stat");
					if (SPTV_RNK_STAT_DELETE.contains(sptv_rnk_stat))
					{
						// 削除
						chg_div = CS_CRS_OPCH_INF_OPERATE_CHG_DIV_2;
						use_endymd = paramUpdMap.get("use_endymd"); // 利用終了日
					}
					else
					{
						// 取消
						chg_div = CS_CRS_OPCH_INF_OPERATE_CHG_DIV_3;
						sptv_aply_stdardymd_div = SPTV_APLY_STDARDYMD_DIV_1;
					}
					break;
				}

				childMap.put("op_svc_kei_no", op_svc_kei_no);
				childMap.put("chg_div", chg_div);
				childMap.put("sptv_aply_stdardymd_div", sptv_aply_stdardymd_div);
				childMap.put("use_endymd", use_endymd);
				op_upd_list.add(childMap);
			}
		}

		ccMap.put("op_upd_list", op_upd_list);

		//■■■■■ CSコース用オプションチャンネル情報操作CC （更新）■■■■■
		param.setData(fixedText, ccMap);
		JKKCsCrsOpchInfOperateCC opcCC = new JKKCsCrsOpchInfOperateCC();
		opcCC.operateOpchInf(handle, param, fixedText);

	}

	/**
	 * 
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return サービスコンポーネント実行用CAANMsg
	 * @exception RequestParameterExceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws RequestParameterException
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);

		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		return paramMap;
	}

	/**
	 * 
	 * <br>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @param fixedText (I) ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @exception RequestParameterExceptionがスローされます。
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
			throws RequestParameterException
	{
		return param;
	}

	/**
	 * デバッグログを出力します。<BR>
	 *
	 * @param dumpObj 出力するオブジェクト
	 */
	private void printlnEjbLog(Object dumpObj)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}

}
