/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUBmpKhChkAddSplitCC
*   ソースファイル名：JFUBmpKhChkAddSplitCC.java
*   作成者          ：富士通
*   日付            ：2024年05月08日
*＜機能概要＞
*   番号可否チェックコモンコンポーネント部品
*   ※CC呼出        JFUBmpTelNoAddChkCC：番ポ電話番号登録可否チェック（契約済等チェック）
*                   JKKChkDobanitenPsbAreaCC：番ポ可否チェックCC（MAチェック）【旧：同番移転可能エリアチェック】
*＜修正履歴＞
*   バージョン  修正日		修正者		修正内容
*   v72.00      2024/05/08	FJ)美濃原	ANK-4494-00-00_【eo定期】 双方向番ポ対応
*
**********************************************************************/
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.exception.SCCallException;
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.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EZM0121A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0121C010CBSMsg;

/**
 * 番号ポータビリティ可否チェックコモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
public class JFUBmpKhChkAddSplitCC extends JFUBaseCC
{

	// IN項目
	/** 電話番号リスト */
	private static final String TEL_NO_LIST = "tel_no_list";
	/** 電話番号 */
	private static final String TEL_NO = "tel_no";

	// OUT項目
	/** 理由コード */
	private static final String OUT_REASON_MSG = "reason_msg";

	/** 番ポチェックRESULTキー チェック結果リスト */
	private static final String ERR_UM = "err_um";
	/** 番ポチェックRESULTキー チェック結果リスト エラー無し */
	private static final String ERR_UM_OK = "0";
	/** 番ポチェックRESULTキー チェック結果リスト エラー有り */
	private static final String ERR_UM_NG = "1";
	/** チェック結果リスト */
	private static final String CHK_RES_LIST = "chk_res_list";
	/** エラーコード */
	private static final String ERR_CODE = "err_code";
	/** エラー */
	private static final String ERR_CODE_NG = "1";

	// ■ＭＡチェックCC【旧：同番移転可能エリアチェック】JKKChkDobanitenPsbAreaCC
	/** 番ポ電話番号登録可否チェック用 */
	/** 電話番号 */
	private static final String KEY_TEL_NO1 = "key_telno1";
	/** 電話番号 */
	private static final String KEY_TEL_NO2 = "key_telno2";
	/** 郵便番号（前） */
	private static final String KEY_PDC_BF = "key_pcd_bf";
	/** 郵便番号（後） */
	private static final String KEY_PDC_AF = "key_pcd_af";
	/** 都道府県 */
	private static final String KEY_STATE_NM = "key_state_nm";
	/** 市区町村 */
	private static final String KEY_CITY_NM = "key_city_nm";
	/** 大字通称名 */
	private static final String KEY_OAZTSU_NM = "key_oaztsu_nm";
	/** 字丁目名 */
	private static final String KEY_AZCHO_NM = "key_azcho_nm";
	/** 例外入力 */
	private static final String KEY_EXCEPTION_INPUT = "key_exception_input";
	/** 同一住所フラグ */
	private static final String SAME_AD_FLG = "same_ad_flg";
	/** 住所コード一覧最大検索件数 */
	private static final String AD_CD_LIST_MAX_SEARCH_NUM = "ad_cd_list_max_search_num";

	/** 電話番号１−簡易チェック結果 */
	private static final String KANI_CKRLT_1 = "kani_ckrlt_1";
	/** 電話番号１−簡易チェック結果 */
	private static final String KANI_CKRLT_2 = "kani_ckrlt_2";
	/** 電話番号１−簡易チェック結果 NG */
	private static final String KANI_CKRLT_NG = "2";

	/** 機能コード */
	private static final String FUNC_CODE = "func_code";
	/** テンプレートID */
	private static final String TEMPLATE_ID_EZM0121C010 = "EZM0121C010";
	/** 関連チェックエラー項目 */
	private static final String ERROR_COLUMN_EZM0121C010 = EZM0121C010CBSMsg.TELNO_ERR;
	/** テンプレートID */
	private static final String TEMPLATE_ID_EZM0121A010 = "EZM0121A010";
	/** 関連チェックエラー項目 */
	private static final String ERROR_COLUMN_EZM0121A010 = EZM0121A010CBSMsg.KEY_TELNO_ERR;

	/**
	 * 番号ポータビリティ可否チェック処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		if (inMap == null || inMap.size() == 0)
		{
			return param;
		}

		ArrayList telNoList = (ArrayList)inMap.get(TEL_NO_LIST);
		if (telNoList == null || telNoList.size() == 0)
		{
			return param;
		}

		// 呼出時の機能コード
		String execFUNC_CODE = (String)inMap.get(FUNC_CODE);
		// 返却用マップ
		Map<String, Object> childMap = new HashMap<String, Object>();

		boolean isErrorFUcheck = false;
		boolean isErrorKKcheck = false;
		/** 住所分割処理 */
		// ■利用場所住所、機器提供サービス利用場所住所の設定
		HashMap<String, Object> inUsePlaceAddress = new HashMap<String, Object>();

		// 共通情報のマッピング
		inUsePlaceAddress.put("func_code", JPCModelConstant.FUNC_CD_1);

		// 都道府県・市区町村
		inUsePlaceAddress.put("state_city", nullToEmpty(inMap.get("state_city")));
		// 字
		inUsePlaceAddress.put("aza", nullToEmpty(inMap.get("aza")));
		// 丁目・番地等
		inUsePlaceAddress.put("chome_bnchi", nullToEmpty(inMap.get("chome_bnchi")));

		param.setData("JFUSplitAddressInfoCC", inUsePlaceAddress);
		JFUSplitAddressInfoCC editAddress = new JFUSplitAddressInfoCC();
		editAddress.splitAddressInfo(handle, param, "JFUSplitAddressInfoCC");

		// ■番ポ電話番号登録チェックCC
		JFUBmpTelNoAddChkCC bmpCheckCC = new JFUBmpTelNoAddChkCC();

		// チェック実行
		bmpCheckCC.execute(handle, param, fixedText);

		// チェック結果の判定
		HashMap chkMap = (HashMap)param.getData(fixedText);
		String chekRslt = (String)chkMap.get(ERR_UM);
		ArrayList resultList = (ArrayList)chkMap.get(CHK_RES_LIST);

		String reason_msg = JFUStrConst.EMPTY;
		if (chekRslt.equals(ERR_UM_OK))
		{
			// ■ＭＡチェックCC【旧：同番移転可能エリアチェック】
			// チェック対象情報の設定
			HashMap<String, Object> checkMap = setJKKChkDobanitenPsbAreaCC(handle, inMap, param, fixedText);

			// 返却マップに設定
			param.setData("JKKChkDobanitenPsbAreaCC", checkMap);

			JKKChkDobanitenPsbAreaCC psbAreaCC = new JKKChkDobanitenPsbAreaCC();
			psbAreaCC.executeMain(handle, param, "JKKChkDobanitenPsbAreaCC");

			// チェック結果の判定
			chkMap = (HashMap)param.getData("JKKChkDobanitenPsbAreaCC");
			// "1":OK、"2":NG、"3"：審査不可、NULL：エラー発生時
			String result = (String)chkMap.get(KANI_CKRLT_1);
			printlnEjbLog(getMsgDobanitenPsbAreaCC(chkMap));
			String errNo[] = new String[] { "", "" };
			StringBuffer errMsg = new StringBuffer();
			errMsg.append("JKKChkDobanitenPsbAreaCC エラー ");

			if (KANI_CKRLT_NG.equals(result))
			{
				errNo[0] = (String)chkMap.get(KEY_TEL_NO1);
				chekRslt = ERR_UM_NG;
				errMsg.append(" [" + errNo[0] + "]");
			}
			if (!JFUBPCommon.isNull(chkMap.get(KEY_TEL_NO2)))
			{
				result = (String)chkMap.get(KANI_CKRLT_2);
				if (KANI_CKRLT_NG.equals(result))
				{
					errNo[1] = (String)chkMap.get(KEY_TEL_NO2);
					chekRslt = ERR_UM_NG;
					errMsg.append(" [" + errNo[1] + "]");
				}
			}
			if (ERR_UM_NG.equals(chekRslt))
			{
				isErrorKKcheck = true;
				reason_msg = errMsg.toString();
			}

			for (int idx = 0; idx < resultList.size(); idx++)
			{
				HashMap resultMap = (HashMap)resultList.get(idx);
				// 電話番号
				String chkTelNo = (String)resultMap.get(TEL_NO);
				if (!JFUBPCommon.isNull(errNo[0]) && errNo[0].equals(chkTelNo))
				{
					resultMap.put(ERR_CODE, ERR_CODE_NG);
				}
				if (!JFUBPCommon.isNull(errNo[1]) && errNo[1].equals(chkTelNo))
				{
					resultMap.put(ERR_CODE, ERR_CODE_NG);
				}
			}

		}
		else
		{
			isErrorFUcheck = true;
			reason_msg = "JFUBmpTelNoAddChkCC エラー";
		}

		childMap.put(ERR_UM, chekRslt);
		childMap.put(OUT_REASON_MSG, reason_msg);
		childMap.put(CHK_RES_LIST, resultList);

		param.setData(fixedText, childMap);

		// 呼出時の機能コードが"2"の場合、エラー発生時は、Exceptionをスローする
		if (JPCModelConstant.FUNC_CD_2.equals(execFUNC_CODE))
		{
			if (isErrorKKcheck)
			{
				JFUBPCommon.setRelationErrorInfo(param, TEMPLATE_ID_EZM0121C010, ERROR_COLUMN_EZM0121C010, fixedText);
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
						.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}
			if (isErrorFUcheck)
			{
				// ※JFUBmpTelNoAddChkCCはここにくる前にスローされる前提なので、到達しない前提。
				setRelationErrorInfo(param, TEMPLATE_ID_EZM0121A010, ERROR_COLUMN_EZM0121A010, fixedText);
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
						.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}
		}

		return param;
	}

	/**
	 * ＭＡチェックの上りマッピング【旧：同番移転可能エリアチェックCC】
	 * 
	 * @param handle
	 * @param inMap 入力パラメータ
	 * @param chkParam チェック用パラメータ
	 * @param fixedText サービスメッセージ
	 * @return parentMap
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> setJKKChkDobanitenPsbAreaCC(SessionHandle handle, HashMap inMap, IRequestParameterReadWrite chkParam,
			String fixedText) throws Throwable
	{

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// getBmpAddressParam,JFUSplitAddressInfoCC
		Map<String, Object> addMap = (Map<String, Object>)chkParam.getData("JFUSplitAddressInfoCC");
		Map<String, Object> editedBmpAddress = addressEdit(chkParam, fixedText, addMap);

		// 番ポ電話番号
		String telNo1 = (String)inMap.get("key_telno1");
		String telNo2 = (String)inMap.get("key_telno2");
		// 電話番号を設定
		parentMap.put(KEY_TEL_NO1, telNo1);
		parentMap.put(KEY_TEL_NO2, telNo2);

		// 郵便番号
		String pcd_bf = (String)inMap.get("key_pcd_bf");
		String pcd_af = (String)inMap.get("key_pcd_af");
		parentMap.put(KEY_PDC_BF, pcd_bf);
		parentMap.put(KEY_PDC_AF, pcd_af);

		// 都道府県	
		parentMap.put(KEY_STATE_NM, nullToEmpty((String)editedBmpAddress.get("state_nm")));
		// 市区町村	
		parentMap.put(KEY_CITY_NM, nullToEmpty((String)editedBmpAddress.get("city_nm")));
		// 大字通称名	
		parentMap.put(KEY_OAZTSU_NM, nullToEmpty((String)editedBmpAddress.get("oaztsu_nm")));
		// 字丁目名	
		parentMap.put(KEY_AZCHO_NM, nullToEmpty((String)editedBmpAddress.get("azcho_nm")));

		// 例外入力
		parentMap.put(KEY_EXCEPTION_INPUT, "1");
		// 同一住所フラグ
		parentMap.put(SAME_AD_FLG, "1");
		// 住所コード一覧最大検索件数
		parentMap.put(AD_CD_LIST_MAX_SEARCH_NUM, JFUStrConst.MAX_SEARCH_NUM);

		return parentMap;

	}

	/**
	 * 住所分割結果を設定
	 * 
	 * @param param
	 * @param fixedText
	 * @param addMap
	 */
	private Map<String, Object> addressEdit(IRequestParameterReadWrite param, String fixedText, Map<String, Object> addMap)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		if (!JFUBPCommon.isNull(addMap.get("ad_cd")))
		{
			parentMap.put("ad_cd", addMap.get("ad_cd"));
		}
		else
		{
			parentMap.put("ad_cd", "00000000000");
		}
		parentMap.put("state_nm", addMap.get("state_nm"));
		parentMap.put("city_nm", addMap.get("city_nm"));
		parentMap.put("oaztsu_nm", addMap.get("oaztsu_nm"));
		parentMap.put("azcho_nm", addMap.get("azcho_nm"));
		if (addMap.containsKey("bnchigo"))
		{
			parentMap.put("after_bnchi", addMap.get("bnchigo"));
		}
		else if (addMap.containsKey("after_bnchi"))
		{
			parentMap.put("after_bnchi", addMap.get("after_bnchi"));
		}
		parentMap.put("pcd", addMap.get("pcd"));
		parentMap.put("adrttm", addMap.get("adrttm"));
		parentMap.put("adrrm", addMap.get("adrrm"));

		return parentMap;
	}

	/**
	 * チェック処理（共通処理）です。
	 * 
	 * @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 dumpObj 出力するオブジェクト
	 */
	private void printlnEjbLog(Object dumpObj)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}

	/**
	 * メッセージ編集
	 * 
	 * @param chkMap 結果マップ
	 * @return メッセージ
	 */
	@SuppressWarnings("unchecked")
	private String getMsgDobanitenPsbAreaCC(HashMap chkMap)
	{
		StringBuffer sb = new StringBuffer();

		String tel_ma_cd1 = (String)chkMap.get("tel_ma_cd1");
		String l_ad_cd = (String)chkMap.get("l_ad_cd");
		String kani_ckrlt_1 = (String)chkMap.get(KANI_CKRLT_1);
		List macdList = (ArrayList)chkMap.get("ma_cd_list");
		String l_ma_cd = JFUStrConst.EMPTY;
		if (macdList != null && macdList.size() > 0)
		{
			HashMap childMap = (HashMap)macdList.get(0);
			if (childMap != null)
			{
				l_ma_cd = (String)childMap.get("l_ma_cd");
			}
		}

		sb.append("kani_ckrlt_1[" + JFUBPCommon.nvl(kani_ckrlt_1, "") + "], ");
		sb.append("l_ad_cd[" + JFUBPCommon.nvl(l_ad_cd, "") + "], ");
		sb.append("tel_ma_cd1[" + JFUBPCommon.nvl(tel_ma_cd1, "") + "], ");
		sb.append("l_ma_cd[" + JFUBPCommon.nvl(l_ma_cd, "") + "], ");
		return sb.toString();
	}

	/**
	 * 空文字変換
	 * @param inParam 変換前文字列
	 * @return 変換後文字列
	 */
	private String nullToEmpty(Object inParam)
	{
		if (JFUBPCommon.isNull(inParam))
		{
			return JFUStrConst.EMPTY;
		}
		return (String)inParam;
	}

}
