/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：
*	モジュール名	：JFUWebMskmNyoShokaiCC
*	ソースファイル名：JFUWebMskmNyoShokaiCC.java
*	作成者			：富士通
*	日付			：2022年07月20日
*＜機能概要＞
*	WEB申込内容照会処理を行う。
*   外部I/F：「WEB申込内容照会CC(FUIFE206)」処理クラスです。
*＜修正履歴＞
*	バージョン		修正日		修正者				修正内容
*	v60.0.0			2022/07/22	FJ			ANK-4231-00-00_OMO構想対応
*	v72.0.0			2024/11/11	FJ) 張本    ANK-4645-00-00_FRONTIER経由仮申込情報への取扱コード、特殊配線追加
**********************************************************************/
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.ServiceComponentRequestInvoker;
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.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JKKStrConst;
import eo.common.util.JFUMkmInfoAddUtil;
import eo.ejb.cbs.cbsmsg.EFU0381A010CBSMsg1List;

/**
 * WEB申込内容照会
 * 
 * <br/>
 * @author 富士通
 *
 */
public class JFUWebMskmNyoShokaiCC extends AbstractCommonComponent
{
	private static final String RETURN_CD_2001 = "2001";

	private static final String ERROR_INFO = "ERROR_INFO";
	private static final String ERROR_CODE = "errCode";
	private static final String ERROR_MESSAGE = "errMessage";
	
	private static final String IN_PARAM_MSKMSHO_NO = "mskmsho_no";
	
	private static final String FUNC_CODE = "func_code";
	private static final String MSKMSHO_NO = "mskmsho_no";
	private static final String STATE = "state";
	private static final String TKSH_HISN = "tksh_hisn";
	
	/** インスタンス */
	private JFUMkmInfoAddFrontiaUtil chkUtil = new JFUMkmInfoAddFrontiaUtil();
	/**
	 * WEB申込内容照会
	 * <br/>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{

		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);

		try
		{
			// データチェック
			// 単項目チェック
			if (!checkUnitParam(ccMsg))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

				return param;
			}

			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

			String mskmshoNo = (String)ccMsg.get(IN_PARAM_MSKMSHO_NO);
			// FU0381_Web申込内容一時保存 の一意照会
			CAANMsg efu0381a010Msg = chkUtil.execEFU0381A010Merge(handle, scCall, param, fixedText, mskmshoNo);
			if (efu0381a010Msg == null) {
				// エラーリスト
				List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
				Map<String, String> returnMap = new HashMap<String, String>();

				// 受付番号が存在しない場合は以下のエラーコードとエラーメッセージを設定する。
				returnMap.put(ERROR_CODE, RETURN_CD_2001);
				returnMap.put(ERROR_MESSAGE, null);
				errList.add(returnMap);
				ccMsg.put(ERROR_INFO, errList);

				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

				return param;
			}
			String mskmNaiyo = efu0381a010Msg.getString(EFU0381A010CBSMsg1List.MSKM_NAIYO);
			Map<String, Object> mapMskmNaiyo = JFUMkmInfoAddUtil.jsonToMap(mskmNaiyo);
			
			if (!mapMskmNaiyo.containsKey(MSKMSHO_NO))
			{
				mapMskmNaiyo.put(MSKMSHO_NO, efu0381a010Msg.getString(EFU0381A010CBSMsg1List.MSKMSHO_NO));
			}
			
			if (!mapMskmNaiyo.containsKey(FUNC_CODE))
			{
				mapMskmNaiyo.put(FUNC_CODE, "");
			}
			
			if (!mapMskmNaiyo.containsKey(STATE))
			{
				mapMskmNaiyo.put(STATE, "");
			}

			if (mapMskmNaiyo.containsKey(TKSH_HISN))
			{
				mapMskmNaiyo.remove(TKSH_HISN);
			}
			
			param.setData(fixedText, mapMskmNaiyo);
			
			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		}
		// サービスインターフェース呼び出しでエラーが発生した場合
		catch (SCCallException scCallEx)
		{
			// システムエラーを設定する
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
			throw new CCException("サービスインターフェース呼び出しでエラー。", new Exception());
		}

		return param;
	}

	/**
	 * 単項目チェックを行い、チェック結果を返します。
	 * <br/>
	 * @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 = IN_PARAM_MSKMSHO_NO;
		String itemValue = (String)ccMsg.get(itemName);

		// 必須チェック
		if (itemValue == null || itemValue.trim().isEmpty())
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		}

		if (!JFUBPCommon.isNull(itemValue))
		{
			//  属性チェック
			if (!HalfCharCheck.isEnNumber1Check(itemValue))
			{
				// 属性チェックエラー
				errList.add(getFormErrInfMap(itemName, itemValue));
			}
			// 桁数チェック
			else if (!LengthCheck.isLength2Check(itemValue, 10, 10))
			{
				// 桁数チェックエラー
				errList.add(getLenErrInfMap(itemName, itemValue));
			}
		}

		if (errList.size() > 0)
		{
			// エラーが存在する場合

			ccMsg.put(ERROR_INFO, errList);
			return false;
		}

		return true;
	}

	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * <br/>
	 * @param itemName 項目名
	 * @return 必須エラーマップ
	 */
	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, itemName);

		return returnMap;
	}

	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * <br/>
	 * @param itemName 項目名
	 * @return 数エラーマップ
	 */
	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;
	}

	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * <br/>
	 * @param itemName 項目名
	 * @return 属性エラーマップ
	 */
	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;
	}
}
