/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUMstTelNoUpdCC
*   ソースファイル名：JFUMstTelNoUpdCC.java
*   作成者          ：富士通
*   日付            ：2024年05月08日
*＜機能概要＞
*   電話番号マスタ変更コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v72.00.00   2024/05/08   FJ）美濃原  新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

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.exception.CCException;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EZM0121A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0121A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0121C010CBSMsg;

/**
 * 電話番号マスタ変更コモンコンポーネント部品
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUMstTelNoUpdCC extends JFUBaseCC
{

	// ■IN項目
	/** 電話番号リスト */
	private static final String TEL_NO_LIST = "tel_no_list";
	/** 電話番号 */
	private static final String TELNO = "telno";

	/** 機能コード */
	private static final String FUNC_CODE = "func_code";
	/** 関連チェックエラー項目 */
	private static final String ERR_COLUMN = "key_telno_err";

	/* ■□ 電話番号一意照会SC ■□ */
	/** テンプレートID(電話番号一意照会) */
	private static final String TMP_FIND_1 = "EZM0121A010";
	/** テンプレートID(電話番号一意照会明細) */
	private static final String TMP_FIND_1_DETAIL = EZM0121A010CBSMsg.EZM0121A010CBSMSG1LIST;
	/** IN項目リスト(電話番号一意照会) */
	private static final List<String> IN_COL_LIST_FIND_1 = Arrays.asList(EZM0121A010CBSMsg.FUNC_CODE, EZM0121A010CBSMsg.KEY_TELNO);
	/** SC実行結果取得キー(電話番号一意照会) ※連番なし */
	private static final String TMP_FIND_TMPKEY_1 = TEMP_TEMPLATE_PRIFIX + TMP_FIND_1 + TEMP_TEMPLATE_PRIFIX_SEP;
	/** OUT項目リスト(申込明細一意照会) ※申込明細情報変更のIN項目（IN_COL_LIST_UPD_1）とあわせる */
	private static final List<String> OUT_COLUMN_LIST_1 =
			Arrays.asList(EZM0121A010CBSMsg1List.TELNO, EZM0121A010CBSMsg1List.KYOKU_NO, EZM0121A010CBSMsg1List.NO_CD,
					EZM0121A010CBSMsg1List.WARIATE_TSJGS_CD, EZM0121A010CBSMsg1List.USE_TSJGS_CD, EZM0121A010CBSMsg1List.SVC_DIV,
					EZM0121A010CBSMsg1List.HKAT_SIYK_SBT_CD, EZM0121A010CBSMsg1List.HKAT_SIYK_SET_DTM, EZM0121A010CBSMsg1List.TLN_SETMEI,
					EZM0121A010CBSMsg1List.KOJIN_HOJIN_TLN_TAI_CD, EZM0121A010CBSMsg1List.C5_SERVER_GOKI_SKBT_CD,
					EZM0121A010CBSMsg1List.TELNO_TSTAYMD, EZM0121A010CBSMsg1List.TELNO_TENDYMD, EZM0121A010CBSMsg1List.NRN_NO,
					EZM0121A010CBSMsg1List.FIRST_WARIATE_YMD, EZM0121A010CBSMsg1List.UPD_DTM, EZM0121A010CBSMsg1List.UPD_OPEACNT,
					EZM0121A010CBSMsg1List.UPD_DTM, EZM0121A010CBSMsg1List.BMP_HAISHI_REQ_CTRL_CD, EZM0121A010CBSMsg1List.SHK_KOJIN_HOJIN_TLN_TAI_CD,
					EZM0121A010CBSMsg1List.TLN_STKU_TSJGS_CD, EZM0121A010CBSMsg1List.ITNM_TSJGS_CD, EZM0121A010CBSMsg1List.ITNS_TSJGS_CD);

	/* ■□ 電話番号変更SC ■□ */
	/** テンプレートID(電話番号変更) */
	private static final String TMP_UPD_1 = "EZM0121C010";
	private static final List<String> IN_COL_LIST_UPD_1 =
			Arrays.asList(EZM0121C010CBSMsg.TELNO, EZM0121C010CBSMsg.KYOKU_NO, EZM0121C010CBSMsg.NO_CD, EZM0121C010CBSMsg.WARIATE_TSJGS_CD,
					EZM0121C010CBSMsg.USE_TSJGS_CD, EZM0121C010CBSMsg.SVC_DIV, EZM0121C010CBSMsg.HKAT_SIYK_SBT_CD,
					EZM0121C010CBSMsg.HKAT_SIYK_SET_DTM, EZM0121C010CBSMsg.TLN_SETMEI, EZM0121C010CBSMsg.KOJIN_HOJIN_TLN_TAI_CD,
					EZM0121C010CBSMsg.C5_SERVER_GOKI_SKBT_CD, EZM0121C010CBSMsg.TELNO_TSTAYMD, EZM0121C010CBSMsg.TELNO_TENDYMD,
					EZM0121C010CBSMsg.NRN_NO, EZM0121C010CBSMsg.FIRST_WARIATE_YMD, EZM0121C010CBSMsg.UPD_DTM, EZM0121C010CBSMsg.UPD_OPEACNT,
					EZM0121C010CBSMsg.LAST_UPD_DTM_BF, EZM0121C010CBSMsg.BMP_HAISHI_REQ_CTRL_CD, EZM0121C010CBSMsg.SHK_KOJIN_HOJIN_TLN_TAI_CD,
					EZM0121C010CBSMsg.TLN_STKU_TSJGS_CD, EZM0121C010CBSMsg.ITNM_TSJGS_CD, EZM0121C010CBSMsg.ITNS_TSJGS_CD);

	/**
	 * 電話番号マスタ変更処理
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception Exception
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		try
		{
			setDebugLog("電話番号マスタ変更処理 start");
			// ユーザデータ取得
			HashMap inMap = (HashMap)param.getData(fixedText);
			if (null == inMap || inMap.size() == 0)
			{
				// パラメータ未設定は、処理なし
				setDebugLog("パラメータ設定無し");
				return param;
			}

			//----------------------------------------------
			// 入力パラメータ退避
			//----------------------------------------------
			String inFuncCd = (String)inMap.get(FUNC_CODE);

			// ユーザデータ取得
			List<HashMap> telNoList = (List<HashMap>)inMap.get(TEL_NO_LIST);
			// 件数が0件の場合
			if (telNoList == null || telNoList.size() == 0)
			{
				// 電話番号マスタへの更新処理なし
				setDebugLog("電話番号マスタへの更新処理無し（番ポではないため）");
				return param;
			}

			//----------------------------------------------
			// 最新世代の電話番号マスタを元に更新処理を行う
			//----------------------------------------------
			for (int i = 0; i < telNoList.size(); i++)
			{
				HashMap telNoMap = (HashMap)telNoList.get(i);
				setDebugLog(getParamMsg(telNoMap));
				String telNo = (String)telNoMap.get(TELNO);
				if (JFUBPCommon.isNull(telNo))
				{
					continue;
				}
				//----------------------------------------------
				// 電話番号一意照会から最新世代の情報を取得する
				//----------------------------------------------
				// ユーザデータ初期化
				initData(param, fixedText, IN_COL_LIST_FIND_1);
				// 上りマッピング
				setInMapEZM0121A010(param, fixedText, telNo);
				// 検索エラーなし
				inMap.put(IGNORE_SEARCH_ERR, true);
				// サービスIF実行
				executeSC(handle, param, fixedText, TMP_FIND_1, TMP_FIND_1_DETAIL, IN_COL_LIST_FIND_1, ERR_COLUMN);
				if (!isExistsTemplateDetail(inMap, getMaxTempTempleteKey(inMap, TMP_FIND_TMPKEY_1), TMP_FIND_1_DETAIL))
				{
					// 電話番号マスタが存在しない場合は次の処理へ
					setDebugLog("電話番号マスタへの更新処理無し（存在しないため）");
					continue;
				}
				// データマップ
				HashMap dataMap = getTemplateListMap(inMap, getMaxTempTempleteKey(inMap, TMP_FIND_TMPKEY_1), TMP_FIND_1_DETAIL, 0);

				// 電話番号マスタに存在していて「電話番号取得通信事業者コード≠オプテージの番号」の場合、更新処理を行う。
				if (JFUStrConst.TU0051_TSJGS_CD_5100.equals((String)dataMap.get(EZM0121A010CBSMsg1List.TLN_STKU_TSJGS_CD)))
				{
					continue;
				}
				setDebugLog("電話番号取得通信事業者コード≠オプテージの番号の電話番号マスタ更新[" + telNo + "]");

				//----------------------------------------------
				// 電話番号変更処理
				//----------------------------------------------
				// ユーザデータ初期化
				initData(param, fixedText, IN_COL_LIST_UPD_1);
				// 上りマッピング
				setInMapEZM0121C010(param, fixedText, telNoMap, dataMap, inFuncCd);
				// サービスIF実行
				executeSC(handle, param, fixedText, TMP_UPD_1, "", IN_COL_LIST_UPD_1, null);
			}
		}
		catch (Throwable e)
		{
			// 更新に失敗した場合はCCException
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
			throw new CCException("", e);
		}
		finally
		{
			// 一時領域削除
			super.deleteTempArea(param, fixedText);
		}
		setDebugLog("電話番号マスタ変更処理 end");
		return param;

	}

	/**
	 * チェック処理
	 * 
	 * <br>
	 * @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;
	}

	/**
	 * 上りマッピング項目設定(電話番号一意照会)
	 * <br>
	 * @param param			リクエストパラメータ
	 * @param fixedText		サービスメッセージ
	 * @parm telNo 電話番号
	 * @throws RequestParameterException
	 */
	private void setInMapEZM0121A010(IRequestParameterReadWrite param, String fixedText, String telNo) throws RequestParameterException
	{
		// 機能コード設定(1:電話番号一意照会(カレント))
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// リクエストパラメータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿電話番号 ← 電話番号
		inMap.put(EZM0121A010CBSMsg.KEY_TELNO, telNo);
	}

	/**
	 * 上りマッピング項目設定(電話番号変更)
	 * <br>
	 * @param param				リクエストパラメータ
	 * @param fixedText			サービスメッセージ
	 * @param telNoMap			更新情報
	 * @param dataMap			電話番号一意照会明細情報マップ
	 * @param inFuncCd         呼出時の機能コード
	 * @throws Exception 
	 */
	private void setInMapEZM0121C010(IRequestParameterReadWrite param, String fixedText, HashMap telNoMap, HashMap dataMap, String inFuncCd) throws Exception
	{

		// 機能コード設定(1:チェック&登録、2:チェックのみ)
		setFuncCode(param, fixedText, inFuncCd);

		// リクエストパラメータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		//----------------------------------------------
		// カレント情報をコピー(一意照会の結果を設定)
		//----------------------------------------------
		String updColNm = null;
		String motoColNm = null;

		// IN項目リスト(申込明細情報変更)に、一意照会結果を転記する。
		for (int i = 0; i < IN_COL_LIST_UPD_1.size(); i++)
		{
			updColNm = IN_COL_LIST_UPD_1.get(i);
			motoColNm = OUT_COLUMN_LIST_1.get(i);
			inMap.put(updColNm, dataMap.get(motoColNm));
		}

		//----------------------------------------------
		// 更新情報の設定
		//----------------------------------------------
		// 更新前最終年月日時分秒
		inMap.put(EZM0121C010CBSMsg.LAST_UPD_DTM_BF, dataMap.get(EZM0121A010CBSMsg1List.UPD_DTM));
		// 移転元通信事業者コード
		inMap.put(EZM0121C010CBSMsg.ITNM_TSJGS_CD, telNoMap.get("itnm_tsjgs_cd"));
		// 移転先通信事業者コード
		inMap.put(EZM0121C010CBSMsg.ITNS_TSJGS_CD, telNoMap.get("itns_tsjgs_cd"));
	}

	/**
	 * エラーログ出力
	 * 
	 * <br>
	 * @param errMsg エラーメッセージ
	 * @param inMap 入力パラメータ
	 */
	private void setErrLog(String errMsg, HashMap inMap)
	{
		StringBuffer sb = new StringBuffer();

		sb.append(errMsg);
		sb.append(getParamMsg(inMap));

		JSYejbLog.println(JSYejbLog.ERROR, this.getClass(), sb.toString(), null, null, null);
	}

	/**
	 * デバッグログ出力
	 * 
	 * <br>
	 * @param errMsg エラーメッセージ
	 * @param inMap 入力パラメータ
	 */
	private void setDebugLog(String strMsg)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), strMsg, null, null, null);
	}

	/**
	 * パラメータ情報
	 * 
	 * <br>
	 * @param errMsg エラーメッセージ
	 * @param inMap 入力パラメータ
	 */
	private String getParamMsg(HashMap inMap)
	{
		StringBuffer sb = new StringBuffer();

		sb.append(" パラメータ情報：");
		Set<String> set = inMap.keySet();
		for (String key : set)
		{
			sb.append(key);
			sb.append("[" + inMap.get(key) + "] ");
		}
		return sb.toString();
	}
}
