/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKGetMskmNewInitCC
*   ソースファイル名：JKKGetMskmNewInitCC.java
*   作成者          ：富士通
*   日付            ：2013年06月26日
*＜機能概要＞
*   検索画面初期表示照会部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/06/27   FJ）三浦      新規作成
**********************************************************************/
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.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.ICommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
 * 検索画面初期表示の照会を行います。
 * <br>
 * @author 富士通
 */
public class JKKGetMskmSchInitCC extends AbstractCommonComponent implements ICommonComponent
{

	/**
	 * 申込新規初期表示照会処理
	 * <br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccName ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getMskmSchInit(SessionHandle handle, IRequestParameterReadWrite param, String ccName) throws Throwable
	{
		// エラーフラグ(実行判定用)
		String errFlgCc = "0";

		// 作業用変数の初期化
		Map<?, ?> result = null;

		// データ返却用のマップオブジェクト
		Map userMap = new HashMap();

		// CCへの入力パラメータ取得
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);

		// MapがNULLなら処理終了。
		if (ccParam == null)
		{
			return param;
		}

		// 運用日付
		String opeDate = (String)ccParam.get("ope_date");

		/****************************************************/
		/** 業務パラメータ取得SC呼出                        */
		/****************************************************/
		if (!callGetWorkParamListScAndSet(handle, param, userMap, ccName, opeDate))
		{
			errFlgCc = "1";
		}

		/***************************************************/
		/** 下りデータマッピング処理開始                   */
		/***************************************************/
		JKKBpCommon.setResultUserData(param, ccName, userMap);
		if ("0".equals(errFlgCc))
		{
			JKKBpCommon.setResultCtrlData(param, result, ccName, 0, 0);
		} 
		else
		{
			String errMsg = "申込新規共通照会CCで例外が発生しました";
			throw new CCException(errMsg, new Exception(errMsg));
		}

		return param;
	}

	/**
	 * 業務パラメータ管理一意照会SC呼出を行い結果を返却用マップに設定します。
	 * <br/>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param userMap 返却用マップ
	 * @param ccName ユーザ定義文字列
	 * @param opeDate 運用日付
	 * @return 実行結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	protected boolean callGetWorkParamListScAndSet(SessionHandle handle,
			IRequestParameterReadWrite param, Map userMap, String ccName, String opeDate)
			throws Throwable
	{
		boolean retVal = true;
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		ArrayList<HashMap<String, Object>> dataList = (ArrayList<HashMap<String, Object>>)ccParam.get("work_param_list");
		if (dataList == null)
		{
			return retVal;
		}
		
		ArrayList<HashMap<String, Object>> wpList = (ArrayList<HashMap<String, Object>>)userMap.get("work_param_list");
		if (wpList == null)
		{
			wpList = new ArrayList<HashMap<String, Object>>();
			userMap.put("work_param_list", wpList);
		}
		
		for (HashMap<String, Object> dataMap : dataList)
		{
			Map<?, ?> result = callGetWorkParamSc(handle, param, ccName, opeDate, dataMap);
			CAANMsg[] caanMsgList = JKKBpCommon.getResultMsgList(result, EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);
			for (int i = 0; i < caanMsgList.length; i++)
			{
				HashMap wpMap = new HashMap();
				String listNamePre = EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST + "[" + i + "].";
				setDataMap(wpMap, "work_param_sette_value", JKKBpCommon.getResultString(result, listNamePre
						+ EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE));
				wpList.add(wpMap);
				break;
			}
			if (JKKBpCommon.isError(result))
			{
				JKKBpCommon.setResultCtrlData(param, result);
				retVal = false;
			}
		}
		return retVal;
	}

	/**
	 * 業務パラメータ管理一意照会SCを呼び出します。
	 * <br/>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccName ユーザ定義文字列
	 * @param opeDate 運用日付
	 * @param dataMap Inputデータマップ
	 * @return 実行結果
	 * @throws Throwable
	 */
	private Map<?, ?> callGetWorkParamSc(SessionHandle handle, IRequestParameterReadWrite param,
			String ccName, String opeDate, HashMap<String, Object> dataMap) throws Throwable
	{

		/**************************************************************************/
		/** 業務パラメータ管理一意照会SCへの上りマッピング                        */
		/**************************************************************************/
		String funcCd = "1";
		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EZM0321A010CBSMsg.FUNC_CODE, funcCd);
		inMap.put(EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, (String)dataMap.get("key_work_param_id"));
		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EZM0321A010", EZM0321A010CBSMsg.class , inMap, funcCd);

		/**************************************************************************/
		/** ＳＣ呼出実行                                                          */
		/**************************************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);

		return result;
	}
	
	/**
	 * ＢＰチェック用の入力パラメータを作成する。
	 * <br />
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return ＢＰチェック用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	{
		// 当CCではBPチェックは行わない(0件のCAANMsg配列を返却)
		return JKKBpCommon.createBpNotCheckParam();
	}

	/**
	 * ＢＰチェック結果を編集する。
	 * <br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode)
	{
		// BPチェックを行わない為、チェック結果の編集も不要
		return param;
	}

	/**
	 * ユーザデータ情報に値を設定します。<br>
	 * 　@getValueにデータが存在する場合、dataMapに設定します。<br>
	 * 　A上記以外の場合、空文字を設定します。<br>
	 * @param dataMap 値を設定するユーザデータ情報
	 * @param setKey ユーザデータ情報のキー名
	 * @param getValue メッセージキャリアからの取得値
	 */
	@SuppressWarnings("unchecked")
	private void setDataMap(Map dataMap, String setKey, String getValue)
	{
		if (null == getValue)
		{
			dataMap.put(setKey, "");
		}
		else
		{
			dataMap.put(setKey, getValue);
		}
	}
}
