/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JFUEohDnBknSearchCC
*	ソースファイル名：JFUEohDnBknSearchCC.java
*	作成者			：FJ
*	日付			：2023年08月14日
*＜機能概要＞
*	eo光導入物件情報検索処理の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v67.00      2023/08/14  FJ) 張本    【ANK-4467-00-00】FRONTIERのマンション導線巻き取りに伴うAPI変更
*   v73.00      2024/11/15   FJ) 張本   【ANK-4493-00-00】【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 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.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JKKStrConst;

/**
* eo光導入物件情報検索処理の共通コンポーネントクラスです。
 * <BR>
 * @author FJ
 */
public class JFUEohDnBknSearchCC extends JFUEohDnBknSearchBaseCC
{
	/** エラー情報 **/
	private static final String ERROR_INFO = "ERROR_INFO";
	/** エラーコード **/
	private static final String ERROR_CODE = "errCode";
	/** エラーメッセージ **/
	private static final String ERROR_MESSAGE = "errMessage";

	/** CCパラメータ：利用場所＿郵便番号 */
	private static final String REQ_PCD = "pcd";

	/** マンション検索マップの項目リスト */
	private static final List<String> MANSION_MAP_KEY =
			Arrays.asList(RES_MANSION_BUKKEN_NO, RES_MANSION_BUKKEN_CD, RES_BKN_KNRI_NO, RES_KISNUSEKEI_BKN_NM, RES_KISNUSEKEI_BKN_KANA, RES_KISNUSEKEI_BKN_AD_CD, RES_KISNUSEKEI_BKN_PCD,
					RES_KISNUSEKEI_BKN_STATE_NM, RES_KISNUSEKEI_BKN_CITY_NM, RES_KISNUSEKEI_BKN_OAZTSU_NM, RES_KISNUSEKEI_BKN_AZCHO_NM, RES_KISNUSEKEI_BKN_BNCHIGO, RES_NET_KAISEN_USE_KEI_NO,
					RES_TV_KAISEN_USE_KEI_NO, RES_MANSION_ID, RES_PAIRID, RES_CATID, RES_TAKNI_TOKUHSEN_YRKOJI_CD, RES_MANSION_KAKAKUTAI_CD, RES_KNYKEI_MSKM_JOKEN_CD, RES_NET_KNYKEI_MSKM_JOKEN_CD,
					RES_TV_KNYKEI_MSKM_JOKEN_CD, RES_MAISON_HIKARI_TV_TK_CD, RES_HIKARI_TV_TK_JOKYO_CD, RES_HIKARI_TEL_TK_CD, RES_KNYKEI_NET_10G_MSKM_KH, RES_KNYKEI_NET_1G_MSKM_KH, RES_TK_HOSHIKI_CD,
					RES_TK_PRC_SBT_CD, RES_TONAI_SPEED_CD, RES_NET_TK_HOSHIKI_KEI_NO, RES_TV_TK_HOSHIKI_KEI_NO, RES_PID, RES_KANYU_KEI_PAY_HOSHIKI_CD, RES_NET_MANS_CAMPAIGN_LIST,
					RES_NET_MANS_CAMPAIGN_CD, RES_TV_MANS_CAMPAIGN_LIST, RES_TV_MANS_CAMPAIGN_CD, RES_SIRYO_SEIKY_FLG, RES_SVC_STA_YMD, RES_SVC_STA_RSV_YMD, RES_STDARD_SVC_STA_NISU, RES_BSPT_KH,
					RES_HHS_1GONLY_FLG, RES_KOJI_SBT, RES_TK_HOSHIKI_PATTERN_CD, RES_MZ_OPJSK_PON_SBT_CD);

	/**
	 * eo光導入物件情報検索処理を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// ユーザデータ取得
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
		// 返却用ボディ
		Map<String, Object> bodyMap = new HashMap<String, Object>();

		// データチェック
		/* 単項目チェック */
		if (!checkUnitParam(ccMsg))
		{
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
			return param;
		}

		// 利用場所＿郵便番号
		ccMsg.put(KEY_PCD, ccMsg.get(REQ_PCD));

		// マンション検索
		execMansionSearch(handle, param, ccMsg, bodyMap);

		// 一度ユーザデータを削除し、再度設定する
		param.removeData(fixedText);
		param.setData(fixedText, bodyMap);

		// 正常終了
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
		param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

		return param;
	}

	/**
	 * eo光導入物件情報検索処理を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return マンション検索結果
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public Map<String, Object> searchEohDnBkn(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// ユーザデータ取得
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
		// 返却用ボディ
		Map<String, Object> respMap = new HashMap<String, Object>();

		// マンション検索
		execMansionSearch(handle, param, ccMsg, respMap);

		return respMap;
	}

	/**
	 * 単項目チェック
	 * 
	 * @param ccMsg
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkUnitParam(Map<String, Object> ccMsg) throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		String itemName = null;
		String itemValue = null;

		// 利用場所＿郵便番号
		itemName = REQ_PCD;
		itemValue = (String)ccMsg.get(itemName);

		// 必須チェック
		if (itemValue == null || itemValue.trim().isEmpty())
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName, itemValue));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 7))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName, itemValue));
		}

		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}

		return true;
	}

	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @param itemName
	 *            項目名
	 * @param itemValue
	 * 				項目値
	 * @return Map<String, String>
	 */
	private Map<String, String> getReqErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1001);
		returnMap.put(ERROR_MESSAGE, String.format("%s:%s", itemName, ""));

		return returnMap;
	}

	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * 
	 * @param itemName
	 *            項目名
	 * @param itemValue
	 * 				項目値
	 * @return Map<String, String>
	 */
	private Map<String, String> getFormErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1002);
		returnMap.put(ERROR_MESSAGE, String.format("%s:%s", itemName, itemValue));

		return returnMap;
	}

	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @param itemName
	 *            項目名
	 * @param itemValue
	 * 				項目値
	 * @return Map<String, String>
	 */
	private Map<String, String> getLenErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1003);
		returnMap.put(ERROR_MESSAGE, String.format("%s:%s", itemName, itemValue));

		return returnMap;
	}

	/**
	 * マンション検索結果の内容を必要に応じて編集する
	 * 
	 * @param mansionMap マンション検索結果のマップ
	 * @return マンション検索結果のマップ
	 */
	@Override
	protected Map<String, Object> editMansionMap(Map<String, Object> mansionMap)
	{
		Map<String, Object> createMap = new HashMap<String, Object>();

		for (String key : MANSION_MAP_KEY)
		{
			if (mansionMap.containsKey(key))
			{
				createMap.put(key, mansionMap.get(key));
			}
		}

		// 光配線（コース変更可能）マンションはMANMOS管理物件対象にする
		if(JFUStrConst.CD01213_53.equals(createMap.get(RES_TK_HOSHIKI_PATTERN_CD)))
		{
			createMap.put(RES_HHS_1GONLY_FLG, JFUStrConst.HHS_1GONLY_FLG_1);
		}

		return createMap;
	}
}