/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKSptvKeyInfOperateCC
*	ソースファイル名：JKKSptvKeyInfOperateCC.java
*	作成者			：FJ
*	日付			：2024/11/21
*＜機能概要＞
*	スカパー鍵情報操作の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v74.00.00   2024/11/21  FJ）中川    【ANK-4592-00-00】テレビ新コース（スカパー用）導入対応
*   v74.00.00   2025/02/28  FJ) 森下    【ANK-4592-00-00】テレビ新コース（スカパー用）導入対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.util.JKKCommonUtil;
import eo.common.util.JKKStringUtil;

/**
 * スカパー鍵情報操作の共通コンポーネントクラスです。
 * <br>
 * @author 富士通
 *
 */
public class JKKSptvKeyInfOperateCC extends AbstractCommonComponent
{
	/** 処理コード CASカード登録・削除 */
	private static final String SHORI_CD_CASCD_ADD_DEL = "1";
	/** 処理コード コース変更 */
	private static final String SHORI_CD_CRS_CHG = "2";
	/** 処理コード コース変更取消 */
	private static final String SHORI_CD_CRS_CHG_CL = "3";
	/** 処理コード 解約・停止・休止 */
	private static final String SHORI_CD_DSL_STP_PAUSE = "4";
	/** 処理コード 回復・休止解除・停止解除 */
	private static final String SHORI_CD_KAIHK_PAUSE_STP_RLS = "5";
	/** 処理コード オプション登録・解約 */
	private static final String SHORI_CD_OP_ADD_DSL = "6";
	
	/** 機能コード 更新 */
	private static final String FUNC_CD_CHG = "1";
	
	/** 相手システムID CMP */
	private static final String AITE_SYSID_CMP = "1";
	/** 相手システムID DEN */
	private static final String AITE_SYSID_DEN = "2";
	
	/** エラーコード 異常 */
	private static final String ERR_CD_SYSTEM_ERR = "99";
	
	/**
	 * スカパー鍵情報操作を行う。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		String dataMapKey = fixedText;
		
		// スカパー鍵情報操作CCマップ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		if (ccMsg == null)
		{
			return param;
		}
		
		// 機能コード
		String funcCd = (String)ccMsg.get("func_cd");
		
		// 処理コード
		String shoriCd = (String)ccMsg.get("shori_cd");
		
		// サービス契約番号
		String svcKeiNo = (String)ccMsg.get("svc_kei_no");
		
		// 相手システムID
		String aiteSysid = (String)ccMsg.get("aite_sysid");
		
		// 機能コード、処理コード、サービス契約番号が未設定の場合、
		// または処理コードが"1"(CASカード登録・削除)、"2"(コース変更)、"3"(コース変更取消)、"4"(解約・停止・休止)、
		// "5"(解約取消・停止取消・休止取消・回復・休止解除・停止解除)、"6"(オプション登録・解約)以外の場合、処理を終了する。
		if (JKKStringUtil.isNullBlank(funcCd) || JKKStringUtil.isNullBlank(shoriCd) || JKKStringUtil.isNullBlank(svcKeiNo)
				|| !(SHORI_CD_CASCD_ADD_DEL.equals(shoriCd) || SHORI_CD_CRS_CHG.equals(shoriCd)
						|| SHORI_CD_CRS_CHG_CL.equals(shoriCd) || SHORI_CD_DSL_STP_PAUSE.equals(shoriCd)
						|| SHORI_CD_KAIHK_PAUSE_STP_RLS.equals(shoriCd) || SHORI_CD_OP_ADD_DSL.equals(shoriCd)))
		{
			ccMsg.put("err_cd", ERR_CD_SYSTEM_ERR);
			return param;
		}
		
		// 戻り値初期化
		// エラーコード
		ccMsg.put("err_cd", "");
		
		// CATV顧客番号
		ccMsg.put("catv_cust_no", "");
		
		// 料金コース
		ccMsg.put("pcrs", "");
		
		// 料金コース名称
		ccMsg.put("pcrs_nm", "");
		
		// 料金プラン
		ccMsg.put("pplan", "");
		
		// 料金プラン名称
		ccMsg.put("pplan_nm", "");
		
		// サービス契約ステータス
		ccMsg.put("svc_kei_stat", "");
		
		// 重複サービス契約番号
		ccMsg.put("dble_svc_kei_no", "");
		
		// エラーCASカード番号
		ccMsg.put("err_cascd_no", "");
		
		// エラー枠番号
		ccMsg.put("err_frame_no", "");
		
		// エラーオプションサービスコード
		ccMsg.put("err_op_svc_cd", "");
		
		// エラーオプションサービスコード名称
		ccMsg.put("err_op_svc_cd_nm", "");
		
		// CASカードリスト
		ccMsg.put("cascd_list", new ArrayList<HashMap<String, Object>>());
		
		// オプションリスト
		ccMsg.put("op_list", new ArrayList<HashMap<String, Object>>());
		
		try
		{
			// 処理コードが"1"(CASカード登録・削除)の場合
			if (SHORI_CD_CASCD_ADD_DEL.equals(shoriCd))
			{
				cascdInfOperate(handle, param, dataMapKey, ccMsg);
			}
			// 処理コードが"2"(コース変更)、"3"(コース変更取消)、"4"(解約・停止・休止)、"5"(回復・休止解除・停止解除)の場合
			else if (SHORI_CD_CRS_CHG.equals(shoriCd) || SHORI_CD_CRS_CHG_CL.equals(shoriCd)
					|| SHORI_CD_DSL_STP_PAUSE.equals(shoriCd) || SHORI_CD_KAIHK_PAUSE_STP_RLS.equals(shoriCd))
			{
				csCrsInfOperate(handle, param, dataMapKey, ccMsg);
			}
			// 処理コードが"6"(オプション登録・解約)の場合
			else if (SHORI_CD_OP_ADD_DSL.equals(shoriCd))
			{
				csCrsOpchInfOperate(handle, param, dataMapKey, ccMsg);
			}
		}
		catch(Exception e)
		{
			// エラーコード
			ccMsg.put("err_cd", ERR_CD_SYSTEM_ERR);
		}
		
		// 機能コードが"1"（更新）
		// かつ相手システムIDが"1"（CMP）・"2"（DEN）以外
		// かつエラーコードがnull（正常）以外の場合、例外をスローする。
		if(FUNC_CD_CHG.equals(funcCd)
				&& !(AITE_SYSID_CMP.equals(aiteSysid) || AITE_SYSID_DEN.equals(aiteSysid))
				&& !JKKCommonUtil.isNull(ccMsg.get("err_cd")))
		{
			// ANK-4592-00-00 ADD START
			// ログ出力
			JSYejbLog.println(JSYejbLog.ERROR, this.getClass(), "スカパー鍵開け閉め処理にて、排他エラーが発生しました。");
			// ANK-4592-00-00 ADD END
			throw new CCException("スカパー鍵開け閉め処理にて、排他エラーが発生しました。", new Exception());
		}
		
		return param;
	}

	/**
	 * CASカード情報操作CCを呼び出す。
	 * @param handle セッションハンドル
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param ccMsg データ情報
	 * @throws Throwable
	 */
	private void cascdInfOperate(SessionHandle handle,
									IRequestParameterReadWrite param,
									String dataMapKey,
									HashMap<String, Object> ccMsg) throws Throwable
	{
		// CASカード情報操作CCマップ
		Map<String, Object> cascdInfOperateMap = new HashMap<String, Object>();
		
		param.setData("JKKCascdInfOperateCC", setInputData(cascdInfOperateMap, ccMsg));
		
		new JKKCascdInfOperateCC().execute(handle, param, "JKKCascdInfOperateCC");
		
		setOuputData(cascdInfOperateMap, ccMsg);
		
		param.removeData("JKKCascdInfOperateCC");
	}

	/**
	 * CSコース情報操作CCを呼び出す。
	 * @param handle セッションハンドル
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param ccMsg データ情報
	 * @throws Throwable
	 */
	private void csCrsInfOperate(SessionHandle handle,
									IRequestParameterReadWrite param,
									String dataMapKey,
									HashMap<String, Object> ccMsg) throws Throwable
	{
		// CSコース情報操作CCマップ
		Map<String, Object> csCrsInfOperateMap = new HashMap<String, Object>();
		
		param.setData("JKKCsCrsInfOperateCC", setInputData(csCrsInfOperateMap, ccMsg));
		
		new JKKCsCrsInfOperateCC().execute(handle, param, "JKKCsCrsInfOperateCC");
		
		setOuputData(csCrsInfOperateMap, ccMsg);
		
		param.removeData("JKKCsCrsInfOperateCC");
	}

	/**
	 * CSコース用オプションチャンネル情報操作CCを呼び出す。
	 * @param handle セッションハンドル
	 * @param param パラメーター
	 * @param dataMapKey データマップキー
	 * @param ccMsg データ情報
	 * @throws Throwable
	 */
	private void csCrsOpchInfOperate(SessionHandle handle,
									IRequestParameterReadWrite param,
									String dataMapKey,
									HashMap<String, Object> ccMsg) throws Throwable
	{
		// CSコース用オプションチャンネル情報操作CCマップ
		Map<String, Object> csCrsOpchInfOperateMap = new HashMap<String, Object>();
		
		param.setData("JKKCsCrsOpchInfOperateCC", setInputData(csCrsOpchInfOperateMap, ccMsg));
		
		new JKKCsCrsOpchInfOperateCC().operateOpchInf(handle, param, "JKKCsCrsOpchInfOperateCC");
		
		setOuputData(csCrsOpchInfOperateMap, ccMsg);
		
		param.removeData("JKKCsCrsOpchInfOperateCC");
	}
	
	/**
	 * 入力項目を設定する。
	 * @param inputMap 入力データMAP
	 * @param ccMsg データ情報
	 * @throws Throwable
	 * @return inputMap
	 */
	@SuppressWarnings("unchecked")
	private Map<String, Object> setInputData(Map<String, Object> inputMap, HashMap<String, Object> ccMsg) throws Throwable
	{
		// 機能コード
		inputMap.put("func_cd", (String)ccMsg.get("func_cd"));
		
		// 処理コード
		inputMap.put("shori_cd", (String)ccMsg.get("shori_cd"));
		
		// サービス契約番号
		inputMap.put("svc_kei_no", (String)ccMsg.get("svc_kei_no"));
		
		// 相手システムID
		inputMap.put("aite_sysid", (String)ccMsg.get("aite_sysid"));
		
		// 旧料金コース
		inputMap.put("old_pcrs", (String)ccMsg.get("old_pcrs"));
		
		// 新料金コース
		inputMap.put("new_pcrs", (String)ccMsg.get("new_pcrs"));
		
		// スカパー適用基準年月日区分
		inputMap.put("sptv_aply_stdardymd_div", (String)ccMsg.get("sptv_aply_stdardymd_div"));
		
		// 算出元日付
		inputMap.put("snst_mt_ymd", (String)ccMsg.get("snst_mt_ymd"));
		
		// 操作区分
		inputMap.put("ope_div", (String)ccMsg.get("ope_div"));
		
		// CASカード番号
		inputMap.put("cascd_no", (String)ccMsg.get("cascd_no"));
		
		// CAS更新リスト
		inputMap.put("cas_upd_list", (List<Map<String, String>>)ccMsg.get("cas_upd_list"));
		
		// オプション更新リスト
		inputMap.put("op_upd_list", (List<Map<String, String>>)ccMsg.get("op_upd_list"));
		
		return inputMap;
	}
	
	/**
	 * 出力項目を設定する。
	 * @param outputMap CC返却値
	 * @param ccMsg データ情報
	 * @throws Throwable
	 */
	private void setOuputData(Map<String, Object> outputMap, HashMap<String, Object> ccMsg) throws Throwable
	{
		// エラーコード
		ccMsg.put("err_cd", outputMap.get("err_cd"));
		
		// サービス契約番号
		ccMsg.put("svc_kei_no", outputMap.get("svc_kei_no"));
		
		// CATV顧客番号
		ccMsg.put("catv_cust_no", outputMap.get("catv_cust_no"));
		
		// 料金コース
		ccMsg.put("pcrs", outputMap.get("pcrs"));
		
		// 料金コース名称
		ccMsg.put("pcrs_nm", outputMap.get("pcrs_nm"));
		
		// 料金プラン
		ccMsg.put("pplan", outputMap.get("pplan"));
		
		// 料金プラン名称
		ccMsg.put("pplan_nm", outputMap.get("pplan_nm"));
		
		// 新料金コース
		ccMsg.put("new_pcrs", outputMap.get("new_pcrs"));
		
		// サービス契約ステータス
		ccMsg.put("svc_kei_stat", outputMap.get("svc_kei_stat"));
		
		// 重複サービス契約番号
		ccMsg.put("dble_svc_kei_no", outputMap.get("dble_svc_kei_no"));
		
		// エラーCASカード番号
		ccMsg.put("err_cascd_no", outputMap.get("err_cascd_no"));
		
		// エラー枠番号
		ccMsg.put("err_frame_no", outputMap.get("err_frame_no"));
		
		// エラーオプションサービスコード
		ccMsg.put("err_op_svc_cd", outputMap.get("err_op_svc_cd"));
		
		// エラーオプションサービスコード名称
		ccMsg.put("err_op_svc_cd_nm", outputMap.get("err_op_svc_cd_nm"));
		
		// CASカードリスト
		ccMsg.put("cascd_list", outputMap.get("cascd_list"));
		
		// オプションリスト
		ccMsg.put("op_list", outputMap.get("op_list"));
	}
}