/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUSmartLinkGetRelInfoAndRelCheckCC
*   ソースファイル名：JFUSmartLinkGetRelInfoAndRelCheckCC.java
*   作成者          ：富士通
*   日付            ：2014年05月12日
*＜機能概要＞
*   eoスマートリンク関連情報取得および関連チェック部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v9.00       2014/05/12   FJ)文元     新規作成
*                                        
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

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.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;

import eo.ejb.cbs.cbsmsg.EKK0601B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0811A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
 * eoスマートリンク関連情報取得および関連チェック部品です。
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUSmartLkGetInfoAndChkCC extends JFUBaseCC
{

	/* ■□ 料金コース_オプションサービス一意照会SC ■□ */
	/** テンプレートID(料金コース_オプションサービス) */
	private static final String TEMPLATE_ID_1 = "EKK0811A010";
	/** テンプレートID(料金コース_オプションサービス明細 */
	private static final String TEMPLATE_ID_1_DETAIL = EKK0811A010CBSMsg.EKK0811A010CBSMSG1LIST;
	/** 関連チェックエラー項目(料金コース_オプションサービス) */
	private static final String NO_REC_PCRS_OP_SVC_ERR = "no_rec_pcrs_op_svc_err";
	/** 呼出元サービス名 スマートリンク申込（初期表示） */
	private static final String FUSV025601CC = "FUSV025601CC";
	/** SC名:料金コース_オプションサービス (FUSV0256) */
	private static final String SC1_FUSV0256 = "FUSV025604SC";
	/** SC名:料金コース_オプションサービス (FUSV0309) */
	private static final String SC1_FUSV0309 = "FUSV030904SC";

	/* ■□ 料金プラン固定単価SC ■□ */
	/** テンプレートID(料金プラン固定単価) */
	private static final String TEMPLATE_ID_2 = "EKK0601B001";
	/** テンプレートID(料金プラン固定単価明細 */
	private static final String TEMPLATE_ID_2_DETAIL = EKK0601B001CBSMsg.EKK0601B001CBSMSG1LIST;
	/** 関連チェックエラー項目(料金プラン固定単価) */
	private static final String NO_REC_PPLAN_KTTANKA_ERR = "no_rec_pplan_kttanka_err";
	/** SC名:料金プラン固定単価 (FUSV0256) */
	private static final String SC2_FUSV0256 = "FUSV025605SC";
	/** SC名:料金プラン固定単価 (FUSV0309) */
	private static final String SC2_FUSV0309 = "FUSV030905SC";

	/* ■□ 業務パラメータ管理一意照会 ■□ */
	/** 業務パラメータ管理一意照会 テンプレートID*/
	private static final String TEMPLATE_ID_EZM0321A010 = "EZM0321A010";
	/** テンプレートID(業務パラメータ管理一意照会明細) */
	private static final String TEMPLATE_ID_EZM0321A010_DETAIL = EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST;
	/** IN項目リスト(業務パラメータ管理一意照会) */
	private static final List<String> IN_COLUMN_LIST_EZM0321A010 = Arrays.asList(EZM0321A010CBSMsg.KEY_WORK_PARAM_ID);
	/** 関連チェックエラー項目(業務パラメータ管理一意照会) */
	private static final String ERROR_COLUMN_EZM0321A010 = EZM0321A010CBSMsg.KEY_WORK_PARAM_ID_ERR;
	/** SC実行結果取得キー(業務パラメータ管理一意照会) */
	private static final String TEMP_TEMPLATE_KEY_EZM0321A010 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EZM0321A010 + TEMP_TEMPLATE_PRIFIX_SEP;
	
	/** ＣＣ出力マップ項目(タブレット支払残高有無) */
	private static final String TABLET_PAY_ZAN_UM = "tablet_pay_zan_um";
	/** ＣＣ出力マップ項目(タブレット通算台数上限) */
	private static final String KK_TAB_TOTAL_CNT_MAX = "kk_tab_total_cnt_max";
	/** ＣＣ出力マップ項目(同時割賦契約数上限) */
	private static final String KK_KAP_SHR_CNT_MAX = "kk_kap_shr_cnt_max";
	/** ＣＣ出力マップ項目(フロント同時申込台数) */
	private static final String FU_SHR_MSKM_CNT_MAX = "fu_shr_mskm_cnt_max";
	/** ＣＣ出力マップ項目(割賦契約割引適用上限数) */
	private static final String KK_KAP_WRBK_MAX = "kk_kap_wrbk_max";
	
	/**
	 * eoスマートリンク関連チェック実行処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception
	 */
	public IRequestParameterReadWrite executeCheck(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{

		boolean errFlg = false;

		// SC名:料金コース_オプションサービス一意照会
		HashMap optionMap = (HashMap)param.getData(getSc1Data(fixedText));
		if (null == optionMap)
		{
			errFlg = true;
		}
		else
		{
			if (optionMap.get(TEMPLATE_ID_1_DETAIL) == null)
			{
				errFlg = true;
			}
			else
			{
				List optionList = (ArrayList)optionMap.get(TEMPLATE_ID_1_DETAIL);

				if (optionList.size() == 0)
				{
					errFlg = true;
				}
			}
		}

		if (errFlg)
		{
			// データなしエラー
			setRelationErrorInfo(param, TEMPLATE_ID_1, NO_REC_PCRS_OP_SVC_ERR, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String.valueOf(RETURN_CODE_NORMAL),
					JPCModelConstant.RELATION_ERR);
		}

		// SC名:料金プラン固定単価
		HashMap pplanMap = (HashMap)param.getData(getSc2Data(fixedText));
		if (null == pplanMap)
		{
			errFlg = true;
		}
		else
		{
			if (pplanMap.get(TEMPLATE_ID_2_DETAIL) == null)
			{
				errFlg = true;
			}
			else
			{
				List pplanList = (ArrayList)pplanMap.get(TEMPLATE_ID_2_DETAIL);

				if (pplanList.size() == 0)
				{
					errFlg = true;
				}
			}
		}

		if (errFlg)
		{
			// データなしエラー
			setRelationErrorInfo(param, TEMPLATE_ID_2, NO_REC_PPLAN_KTTANKA_ERR, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String.valueOf(RETURN_CODE_NORMAL),
					JPCModelConstant.RELATION_ERR);
		}
		

		// 返却マップ生成
		HashMap resMap = new HashMap();

		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// ★タブレット通算台数制限値取得
		// ●業務パラメータ管理一意照会
		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_EZM0321A010);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setInMapEZM0321A010(param, fixedText, JFUStrConst.KK_TAB_TOTAL_CNT_MAX);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EZM0321A010, TEMPLATE_ID_EZM0321A010_DETAIL, IN_COLUMN_LIST_EZM0321A010,
				ERROR_COLUMN_EZM0321A010);
		// 結果取得
		String tabletAllCntLmt = JFUStrConst.EMPTY;
		// 明細取得時のインデックス
		int cnt = 1;
		if (isExistsTemplateDetail(inMap, TEMP_TEMPLATE_KEY_EZM0321A010 + cnt, TEMPLATE_ID_EZM0321A010_DETAIL))
		{
			// 業務パラメータ設定値取得
			tabletAllCntLmt =
					getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_EZM0321A010 + cnt, TEMPLATE_ID_EZM0321A010_DETAIL,
							EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE, 0);
		}
		// 返却値マップに設定
		resMap.put(KK_TAB_TOTAL_CNT_MAX, tabletAllCntLmt);
		
		// ★同時割賦契約台数制限値取得
		// ●業務パラメータ管理一意照会
		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_EZM0321A010);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setInMapEZM0321A010(param, fixedText, JFUStrConst.KK_KAP_SHR_CNT_MAX);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EZM0321A010, TEMPLATE_ID_EZM0321A010_DETAIL, IN_COLUMN_LIST_EZM0321A010,
				ERROR_COLUMN_EZM0321A010);
		// 結果取得
		String dojiKapKeiNumLmt = JFUStrConst.EMPTY;
		// 明細取得時のインデックス
		cnt += 1;
		if (isExistsTemplateDetail(inMap, TEMP_TEMPLATE_KEY_EZM0321A010 + cnt, TEMPLATE_ID_EZM0321A010_DETAIL))
		{
			// 業務パラメータ設定値取得
			dojiKapKeiNumLmt =
					getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_EZM0321A010 + cnt, TEMPLATE_ID_EZM0321A010_DETAIL,
							EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE, 0);
		}
		// 返却値マップに設定
		resMap.put(KK_KAP_SHR_CNT_MAX, dojiKapKeiNumLmt);
		
		// ★フロント同時申込み台数制限値
		// ●業務パラメータ管理一意照会
		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_EZM0321A010);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setInMapEZM0321A010(param, fixedText, JFUStrConst.FU_SHR_MSKM_CNT_MAX);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EZM0321A010, TEMPLATE_ID_EZM0321A010_DETAIL, IN_COLUMN_LIST_EZM0321A010,
				ERROR_COLUMN_EZM0321A010);
		// 結果取得
		String frontDojiMskmNumLmt = JFUStrConst.EMPTY;
		// 明細取得時のインデックス
		cnt += 1;
		if (isExistsTemplateDetail(inMap, TEMP_TEMPLATE_KEY_EZM0321A010 + cnt, TEMPLATE_ID_EZM0321A010_DETAIL))
		{
			// 業務パラメータ設定値取得
			frontDojiMskmNumLmt =
					getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_EZM0321A010 + cnt, TEMPLATE_ID_EZM0321A010_DETAIL,
							EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE, 0);
		}
		// 返却値マップに設定
		resMap.put(FU_SHR_MSKM_CNT_MAX, frontDojiMskmNumLmt);
		
		// ★割引可能台数制限値
		// ●業務パラメータ管理一意照会
		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_EZM0321A010);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setInMapEZM0321A010(param, fixedText, JFUStrConst.KK_KAP_WRBK_MAX);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EZM0321A010, TEMPLATE_ID_EZM0321A010_DETAIL, IN_COLUMN_LIST_EZM0321A010,
				ERROR_COLUMN_EZM0321A010);
		// 結果取得
		String wribPsbNumLmt = JFUStrConst.EMPTY;
		// 明細取得時のインデックス
		cnt += 1;
		if (isExistsTemplateDetail(inMap, TEMP_TEMPLATE_KEY_EZM0321A010 + cnt, TEMPLATE_ID_EZM0321A010_DETAIL))
		{
			// 業務パラメータ設定値取得
			wribPsbNumLmt =
					getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_EZM0321A010 + cnt, TEMPLATE_ID_EZM0321A010_DETAIL,
							EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE, 0);
		}
		// 返却値マップに設定
		resMap.put(KK_KAP_WRBK_MAX, wribPsbNumLmt);
		
		// 他の返却値設定
		// 支払残高有無（未設定）※支払残高有無チェックは、ANK-2455-00-00により廃止。
		resMap.put(TABLET_PAY_ZAN_UM, JFUStrConst.EMPTY);
		
		// 返却マップに設定
		param.setData(fixedText, resMap);
		
		return param;
	}

	private String getSc1Data(String fixedText)
	{
		if (FUSV025601CC.equals(fixedText))
		{
			return SC1_FUSV0256;
		}
		else
		{
			return SC1_FUSV0309;
		}
	}

	private String getSc2Data(String fixedText)
	{
		if (FUSV025601CC.equals(fixedText))
		{
			return SC2_FUSV0256;
		}
		else
		{
			return SC2_FUSV0309;
		}
	}

	/**
	 * 上りマッピング項目設定(業務パラメータ管理一意照会)
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param paramId 業務パラメータＩＤ
	 * @throws RequestParameterException
	 */
	private void setInMapEZM0321A010(IRequestParameterReadWrite param, String fixedText, String paramId) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿業務パラメータＩＤ
		inMap.put(EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, paramId);
	}

	/**
	 * チェック処理
	 * 
	 * <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;
	}

}
