/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUSearchWribSvcCC
*   ソースファイル名：JFUSearchWribSvcCC.java
*   作成者          ：富士通
*   日付            ：2013年02月25日
*＜機能概要＞
*   割引サービスコード・データ抽出項目コード検索部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2013/02/25   FJ) 大塚    新規作成 No356 マンション割引対応
*   v4.01       2013/03/01   FJ) 大塚    関連対応 
*   v4.02       2013/03/12   FJ) 大塚    IT1-2013-0000428 契約新規関連対応 EKK0841B509からEKK0841B510にSIF変更
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Arrays;

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.custom.common.JFUBPCommon;
import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0841B510CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0841B510CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1351B501CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1351B501CBSMsg1List;

/**
 * 割引サービスコード検索コモンコンポーネント部品
 * <br>
 * @author 富士通
 */
public class JFUSearchWribSvcCdCC extends JFUBaseCC
{
	/** 割引サービス登録制御一覧照会 */
	private static final String SIF_EKK0841B510 = "EKK0841B510";

	/** データ抽出項目一覧照会（表示データ抽出項目ＣＤ） */
	private static final String SIF_EKK1351B501 = "EKK1351B501";

	/** IN項目リスト */
	/** 割引サービス登録制御一覧照会 */
	private static final List<String> IN_COLUMN_LIST_WRISVC_TG_SVC_CP;

	/** データ抽出項目一覧照会（表示データ抽出項目ＣＤ） */
	private static final List<String> IN_COLUMN_LIST_DCHSKM_CP;

	/** 割引サービス登録制御一覧照会テンプレート名 */
	private static final String EKK0841B510CBSMSG1LIST = "EKK0841B510CBSMsg1List";

	/** データ抽出項目一覧照会（表示データ抽出項目ＣＤ）テンプレート名 */
	private static final String EKK1351B501CBSMSG1LIST = "EKK1351B501CBSMsg1List";

	/**  割引サービスコード取得結果 */
	private static final String SEARCHWRIBSVCCDLIST = "searchWribSvcCdList";

	/** IN項目値 */
	static
	{
		IN_COLUMN_LIST_WRISVC_TG_SVC_CP = Arrays.asList(EKK0841B510CBSMsg.KEY_DSP_CAMPAIGN_CD);

		IN_COLUMN_LIST_DCHSKM_CP = Arrays.asList(EKK1351B501CBSMsg.KEY_DSP_DCHSKM_CD);
	}

	/**
	 * 割引サービスコード検索処理<br>
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite searchWribSvcCd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		HashMap<String, Object> srcWribSvcMap = (HashMap<String, Object>)param.getData(fixedText);

		// マップが存在しない場合、処理を終了する。
		if ((srcWribSvcMap == null) || (srcWribSvcMap.isEmpty()))
		{
			return param;
		}

		HashMap<String, Object> srcWribSvcListMap = new HashMap();
		ArrayList srcWribSvcList = new ArrayList();

		srcWribSvcList = (ArrayList)srcWribSvcMap.get("campaign_cd_list");

		// 低価格フラグが存在する場合
		if (srcWribSvcMap.containsKey("teikakaku_flg"))
		{
			srcWribSvcList = setTeikakaku(param);
		}

		// 結果を詰めるリスト
		ArrayList wrib_search_list = new ArrayList();

		// 取得したキャンペーンコードリストの件数分処理をループさせる
		for (int i = 0; i < srcWribSvcList.size(); i++)
		{
			srcWribSvcListMap = (HashMap)srcWribSvcList.get(i);
			// 割引サービス登録制御一覧照会

			// 上りマッピング
			setInMapEKK0841B510(param, fixedText, srcWribSvcListMap);
			// 機能コード設定
			setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

			// 検索エラーなし設定
			ignoreSearchError(param, fixedText);

			// サービスIF実行
			executeSC(handle, param, fixedText, SIF_EKK0841B510, EKK0841B510CBSMsg.EKK0841B510CBSMSG1LIST, IN_COLUMN_LIST_WRISVC_TG_SVC_CP, BLANK);

			// 下りマッピング
			setOutMapEKK0841B510(param, fixedText, wrib_search_list);
		}

		for (int i = 0; i < srcWribSvcList.size(); i++)
		{
			srcWribSvcListMap = (HashMap)srcWribSvcList.get(i);

			// 割引サービス登録制御一覧照会
			// 上りマッピング
			setInMapEKK1351B501(param, fixedText, srcWribSvcListMap);
			// 機能コード設定
			setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
			// 検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// サービスIF実行
			executeSC(handle, param, fixedText, SIF_EKK1351B501, EKK1351B501CBSMsg.EKK1351B501CBSMSG1LIST, IN_COLUMN_LIST_DCHSKM_CP, BLANK);

			// 下りマッピング
			setOutMapEKK1351B501(param, fixedText, wrib_search_list);
		}

		srcWribSvcMap.put(SEARCHWRIBSVCCDLIST, wrib_search_list);

		return param;
	}

	/**
	 * 上りマッピング項目設定(割引サービス登録制御一覧照会)
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param addWribSvcListMap 割引サービスマップ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0841B510(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> srcWribSvcListMap)
			throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// ＫＥＹ＿表示用サービスコード
		inMap.put(EKK0841B510CBSMsg.KEY_DSP_CAMPAIGN_CD, srcWribSvcListMap.get("key_dsp_campaign_cd"));
	}

	/**
	 * 上りマッピング項目設定(データ抽出項目一覧照会（表示データ抽出項目CD）)
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param addWribSvcListMap 割引サービスマップ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK1351B501(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> srcWribSvcListMap)
			throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// ＫＥＹ＿表示用データ抽出項目コード
		inMap.put(EKK1351B501CBSMsg.KEY_DSP_DCHSKM_CD, srcWribSvcListMap.get("key_dsp_campaign_cd"));
	}

	/**
	 * 下りマッピング項目設定(割引サービス登録制御一覧照会)
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wrib_search_list 結果を詰めるリスト
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private ArrayList setOutMapEKK0841B510(IRequestParameterReadWrite param, String fixedText, ArrayList wrib_search_list)
			throws RequestParameterException
	{
		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);

		HashMap<String, Object> childMap = null;

		HashMap<String, Object> inMap = null;

		ArrayList<Object> inMapList = (ArrayList)dataMap.get(EKK0841B510CBSMSG1LIST);

		if (inMapList != null)
		{
			for (int i = 0; i < inMapList.size(); i++)
			{
				childMap = new HashMap<String, Object>();

				childMap = (HashMap)inMapList.get(i);

				if (childMap != null)
				{
					inMap = new HashMap<String, Object>();

					// 割引サービスコード
					inMap.put(EKK0841B510CBSMsg1List.WRIB_SVC_CD, childMap.get(EKK0841B510CBSMsg1List.WRIB_SVC_CD));
					// 表示用キャンペーンコード
					inMap.put(EKK0841B510CBSMsg1List.DSP_CAMPAIGN_CD, childMap.get(EKK0841B510CBSMsg1List.DSP_CAMPAIGN_CD));

					wrib_search_list.add(inMap);
				}
			}
		}
		return wrib_search_list;
	}

	/**
	 * 下りマッピング項目設定(データ抽出項目一覧照会（表示データ抽出項目CD）)
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wrib_search_list 結果を詰めるリスト
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private ArrayList setOutMapEKK1351B501(IRequestParameterReadWrite param, String fixedText, ArrayList wrib_search_list)
			throws RequestParameterException
	{
		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);

		HashMap<String, Object> childMap = null;

		HashMap<String, Object> inMap = null;

		ArrayList<Object> inMapList = (ArrayList)dataMap.get(EKK1351B501CBSMSG1LIST);

		if (inMapList != null)
		{
			for (int i = 0; i < inMapList.size(); i++)
			{
				childMap = new HashMap<String, Object>();

				childMap = (HashMap)inMapList.get(i);

				if (childMap != null)
				{
					inMap = new HashMap<String, Object>();

					// データ抽出項目コード
					inMap.put(EKK1351B501CBSMsg1List.DCHSKM_CD, childMap.get(EKK1351B501CBSMsg1List.DCHSKM_CD));
					// 表示用キャンペーンコード
					inMap.put(EKK1351B501CBSMsg1List.DSP_DCHSKM_CD, childMap.get(EKK1351B501CBSMsg1List.DSP_DCHSKM_CD));

					wrib_search_list.add(inMap);
				}
			}
		}
		return wrib_search_list;
	}

	/**
	 * チェック処理
	 * 
	 * <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;
	}

	/**
	 *低価格マンションマップを作成します。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wrib_search_list 結果を詰めるリスト
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private ArrayList setTeikakaku(IRequestParameterReadWrite param) throws RequestParameterException
	{
		// FUSV022604CCからキャンペーンコードを取得する。
		HashMap<String, Object> mansionCCMap = (HashMap<String, Object>)param.getData("FUSV022604CC");

		ArrayList<Object> childList = new ArrayList();

		if (mansionCCMap != null)
		{
			ArrayList mansionList = new ArrayList();

			mansionList = (ArrayList)mansionCCMap.get("mansion_search_a_list");

			if (mansionList != null && mansionList.size() > 0)
			{
				HashMap<String, Object> childMap = null;

				HashMap mnsSrcMap = new HashMap();
				mnsSrcMap = (HashMap)mansionList.get(0);

				// テレビ用マンションキャンペーンコードがある場合
				if (mnsSrcMap.containsKey("net_mans_campaign_cd"))
				{
					String net_campaign_cd = (String)mnsSrcMap.get("net_mans_campaign_cd");

					String[] net_campaign_cd_list = net_campaign_cd.split(JFUStrConst.COMMA);

					for (int i = 0; i < net_campaign_cd_list.length; i++)
					{
						if (!isBlank(net_campaign_cd_list[i]))
						{
							childMap = new HashMap<String, Object>();

							// 空白を削除する
							net_campaign_cd_list[i] = JFUBPCommon.trim(net_campaign_cd_list[i]);

							// KEY_表示用キャンペーンコード 8桁まで0詰めする
							childMap.put("key_dsp_campaign_cd", JFUBPCommon.fillZero(net_campaign_cd_list[i], 8, false));

							childList.add(childMap);
						}
					}
				}

				// テレビ用マンションキャンペーンコードがある場合
				if (mnsSrcMap.containsKey("tv_mans_campaign_cd"))
				{
					String tv_campaign_cd = (String)mnsSrcMap.get("tv_mans_campaign_cd");

					String[] tv_campaign_cd_list = tv_campaign_cd.split(JFUStrConst.COMMA);

					for (int i = 0; i < tv_campaign_cd_list.length; i++)
					{
						if (!isBlank(tv_campaign_cd_list[i]))
						{
							childMap = new HashMap<String, Object>();

							// 空白を削除する
							tv_campaign_cd_list[i] = JFUBPCommon.trim(tv_campaign_cd_list[i]);

							// KEY_表示用キャンペーンコード 8桁まで0詰めする
							childMap.put("key_dsp_campaign_cd", JFUBPCommon.fillZero(tv_campaign_cd_list[i], 8, false));

							childList.add(childMap);
						}
					}
				}

			}
		}
		return childList;
	}

	/**
	 * 値が設定されているか判定する
	 * <br>
	 * @param obj 対象オブジェクト
	 * @return 判定結果
	 */
	@SuppressWarnings("unchecked")
	private boolean isBlank(Object obj)
	{
		boolean ret = false;
		if (obj == null)
		{
			// オブジェクトがNull
			ret = true;
		}
		else if (obj instanceof String)
		{
			// String型の場合
			if (JFUStrConst.EMPTY.equals(obj))
			{
				ret = true;
			}
		}
		else if (obj instanceof ArrayList)
		{
			// ArrayList型の場合
			if (((ArrayList)obj).isEmpty())
			{
				ret = true;
			}
		}
		else if (obj instanceof HashMap)
		{
			// HashMap型の場合
			if (((HashMap)obj).isEmpty())
			{
				ret = true;
			}
		}

		return ret;
	}
}
