/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUKhriSmbcfsResultCC
*   ソースファイル名：JFUKhriSmbcfsResultCC.java
*   作成者          ：富士通
*   日付            ：2023年07月03日
*＜機能概要＞
*   口座振替契約申込結果(取引検索)コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v67.00      2023/07/03   FJ) 美濃原  【ANK-4415-00-00】口振請求及びWeb申込システム移行 STEP1
*                                                          新規系画面「fromClearpass」→「fromSMBCFS」変更
*                                                          注）変更系画面 FUW07701_支払方法変更受付、FUW00702_支払方法変更受付の機能については、既にCMP移管済。*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
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.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EFUA0010001CBSMsg;
import eo.ejb.cbs.cbsmsg.EFUA0010001CBSMsg1List;

/**
 * 口座振替契約申込結果(取引検索)を取得する。
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUKhriSmbcfsResultCC extends JFUBaseCC
{
	/* ===== パラメータ ===== */
	// 共通情報
	/** IN項目：顧客番号 */
	private static final String IN_BILL_NO = "bill_no";
	

	/* ■□ EFUA0010001_口座振替契約申込結果(取引検索) ■□ */
	/** テンプレートID(EFUA0010001_口座振替契約申込結果(取引検索)) */
	private static final String TEMPLATE_ID_EFUA0010001 = "EFUA0010001";

	/** OUT項目：口座振替契約申込結果(取引検索)一覧 */
	private static final String OUT_RESULT_LIST = "result_list";

	// 共通情報
	/** OUT項目：APIエラーフラグ */
	private static final String OUT_API_ERR_FLG = "api_err_flg";

	/** リターンコード：正常値 */
	private static final String RETURN_CD_OK = "0";

	/** リターンコード：エラー */
	private static final String RETURN_CD_NG = "1";

	/** APIエラーフラグ：正常値 */
	private static final String API_ERR_FLG_OK = "0";
	
	/** APIエラーフラグ：エラー値 */
	private static final String API_ERR_FLG_NG = "1";

	// JFUejbFUA0010001SecProc
	/** 処理結果コード 0:正常 */
	public static final String TRN_RSLT_CD_NORMAL = "0";
	/** 処理結果コード 1：パラメータエラー */
	public static final String TRN_RSLT_CD_ERR_PARAM = "1";
	/** 処理結果コード CC：呼出元CCで設定する業務エラー */
	public static final String TRN_RSLT_CD_GYOMU_ERR_CC = "CC";

	/** CBSMsgフォーマット */
	private static final String FMT_CBSMSG = "eo.ejb.cbs.cbsmsg.%sCBSMsg";


	/**
	 *  口座振替契約申込結果(取引検索)取得処理です。
	 * 
	 * <br>
	 * FUIFE211_口座振替契約申込結果(取引検索)
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 例外
	 */
	public IRequestParameterReadWrite getKhriResult(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 結果リスト（結果マップ格納用）
		ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();
		// 結果マップ
		HashMap<String, Object> resultMap = new HashMap<String, Object>();

		// 顧客番号
		String bill_no = (String)inMap.get(IN_BILL_NO);
		// -----------------------------------------------------
		// ■EFUA0010001_口座振替契約申込結果(取引検索) (API) start
		// -----------------------------------------------------
		// EFUA0010001_口座振替契約申込結果(取引検索)の上りマッピング  EFUA0010001

		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		HashMap<String, Object> retMap = new HashMap<String, Object>();
		Object[][] EFUA0010001In =
				{ { EFUA0010001CBSMsg.TEMPLATEID, TEMPLATE_ID_EFUA0010001 }, { EFUA0010001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EFUA0010001CBSMsg.BILL_NO, bill_no } };
		// サービスIF実行
		CAANMsg EFUA0010001Out = callSC(handle, scCall, param, fixedText, EFUA0010001In, retMap);
		CAANMsg[] EFUA0010001OutList = EFUA0010001Out.getCAANMsgList(EFUA0010001CBSMsg.EFUA0010001CBSMSG1LIST);
		// リターンコード取得
		String trnRsltCd = (String)retMap.get("trn_rslt_cd");
		String khri_uk_status = JFUStrConst.EMPTY;
		if (RETURN_CD_OK.equals(trnRsltCd))
		{
			if (EFUA0010001OutList != null && EFUA0010001OutList.length > 0)
			{
				trnRsltCd = EFUA0010001OutList[0].getString("trn_rslt_cd");
				khri_uk_status = EFUA0010001OutList[0].getString(EFUA0010001CBSMsg1List.KHRI_UK_STATUS);
			}
			if (!JFUStrConst.KHRI_UK_STATUS_MSKM_NORMAL.equals(khri_uk_status))
			{
				trnRsltCd = TRN_RSLT_CD_GYOMU_ERR_CC;
			}
		}
		else
		{
			trnRsltCd = TRN_RSLT_CD_GYOMU_ERR_CC;
		}
		// -----------------------------------------------------
		// ■EFUA0010001_口座振替契約申込結果(取引検索) (API) end
		// -----------------------------------------------------
		if (RETURN_CD_OK.equals(trnRsltCd))
		{
			// APIエラーフラグを設定
			resultMap.put(OUT_API_ERR_FLG, API_ERR_FLG_OK);
			// 結果コード
			resultMap.put(EFUA0010001CBSMsg1List.TRN_RSLT_CD, trnRsltCd);

			// 口座振替契約申込結果(取引検索)明細が取得できている場合
			if (EFUA0010001OutList != null && EFUA0010001OutList.length > 0)
			{
				for (int idx = 0; idx < EFUA0010001OutList.length; idx++)
				{
					HashMap childMap = EFUA0010001OutList[idx].getMsgData();
					HashMap<String, Object> resultChildMap = new HashMap();

					// ※項目設定 null時空文字設定
					// 口座振替受付ステータス
					String status = nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.KHRI_UK_STATUS));
					// 処理結果コード
					resultChildMap.put(EFUA0010001CBSMsg1List.TRN_RSLT_CD, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.TRN_RSLT_CD)));
					// 結果コード
					resultChildMap.put(EFUA0010001CBSMsg1List.RESULT_CODE, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.RESULT_CODE)));
					// 結果内容
					resultChildMap.put(EFUA0010001CBSMsg1List.RESULT_MESSAGE, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.RESULT_MESSAGE)));
					// 明細顧客番号
					resultChildMap.put(EFUA0010001CBSMsg1List.DTL_BILL_NO, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.DTL_BILL_NO)));
					// 口座振替受付ステータス
					resultChildMap.put(EFUA0010001CBSMsg1List.KHRI_UK_STATUS, status);
					//委託者コード
					resultChildMap.put(EFUA0010001CBSMsg1List.ITKSHA_CD, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.ITKSHA_CD)));

					//金融機関コード
					resultChildMap.put(EFUA0010001CBSMsg1List.BANK_CD, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.BANK_CD)));
					//金融機関名
					resultChildMap.put(EFUA0010001CBSMsg1List.BANK_NM, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.BANK_NM)));
					//支店コード
					resultChildMap.put(EFUA0010001CBSMsg1List.BRANCH_CD, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.BRANCH_CD)));
					//支店名
					resultChildMap.put(EFUA0010001CBSMsg1List.BRANCH_NM, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.BRANCH_NM)));
					//預金種目コード
					resultChildMap.put(EFUA0010001CBSMsg1List.DEPODIT_ITEM, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.DEPODIT_ITEM)));
					//預金種目名
					resultChildMap.put(EFUA0010001CBSMsg1List.DEPODIT_ITEM_NM, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.DEPODIT_ITEM_NM)));
					//口座番号
					resultChildMap.put(EFUA0010001CBSMsg1List.ACCOUNT_NUMBER, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.ACCOUNT_NUMBER)));
					//口座名義（カタカナ）
					resultChildMap.put(EFUA0010001CBSMsg1List.ACCOUNT_HOLDER, nullToEmpty(childMap.get(EFUA0010001CBSMsg1List.ACCOUNT_HOLDER)));
					resultList.add(resultChildMap);
				}
			}
		}
		else
		{
			// リターンコードが"0000"以外の場合
			// APIエラーフラグを設定
			resultMap.put(OUT_API_ERR_FLG, API_ERR_FLG_NG);
			// 結果コード
			resultMap.put(EFUA0010001CBSMsg1List.TRN_RSLT_CD, trnRsltCd);
		}

		// 口座振替契約申込結果(取引検索) を設定
		resultMap.put(OUT_RESULT_LIST, resultList);

		//取得結果をユーザデータに設定する
		param.setData(fixedText, resultMap);

		return param;
	}

	/**
	 * チェック処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param returnCdMap リターンコードのマップ
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData,
							HashMap<String, Object> returnCdMap) throws Throwable
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);

		CAANMsg msg = templates[0];

		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);

		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		if (!(RETURN_CD_OK.equals(return_code.toString()) && 0 == status))
		{
			if (RETURN_CD_OK.equals(return_code.toString()))
			{
				returnCdMap.put(JCMConstants.RET_CD_INT_KEY, RETURN_CD_NG);
				returnCdMap.put("trn_rslt_cd", TRN_RSLT_CD_GYOMU_ERR_CC);
			}
			else
			{
				returnCdMap.put(JCMConstants.RET_CD_INT_KEY, result.get(JCMConstants.RET_CD_INT_KEY));
				returnCdMap.put("trn_rslt_cd", TRN_RSLT_CD_GYOMU_ERR_CC);
			}
			returnCdMap.put(JCMConstants.STATUS_INT_KEY, msg.getInt(JCMConstants.STATUS_INT_KEY));
		}
		else
		{
			returnCdMap.put(JCMConstants.RET_CD_INT_KEY, RETURN_CD_OK);
			returnCdMap.put("trn_rslt_cd", TRN_RSLT_CD_NORMAL);
		}

		return msg;
	}
	
	
	/**
	 * 共通項目のメッセージを作成します。
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param,
												Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());

		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());

		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());

		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));

		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));

		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));

		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		String svcIf = (String)mappingData[0][1];

		CAANMsg template = new CAANMsg(String.format(FMT_CBSMSG, svcIf));

		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));

		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if (JFUStrConst.EMPTY.equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}

		CAANMsg[] templates = new CAANMsg[1];

		templates[0] = template;

		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * nullの場合、空文字に変換します。
	 * 
	 * <br>
	 * @param value 入力値
	 * @return String nullの場合は空文字返却
	 */
	private String nullToEmpty(Object value)
	{
		if (JFUBPCommon.isNull(value))
		{
			return JFUStrConst.EMPTY;
		}
		return (String)value;
	}

}
