/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUMansWribAplyPsbChkCC
*   ソースファイル名：JFUMansWribAplyPsbChkCC.java
*   作成者          ：富士通
*   日付            ：2013年10月01日
*＜機能概要＞
*   サービス契約申込情報取得コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00       2013/10/01   FJ) 岡井    新規作成
*   v8.00.00    2014/04/13   FJ) 文元    【ANK-1997-00-00】【ＮＯ．１３８３】商品券CPの新設(カカクコム、関電CSフォーラム)対応
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0841B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1351B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1351B001CBSMsg1List;

/**
 * マンション割引適用可能チェックコモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
public class JFUMansWribAplyPsbChkCC extends JFUBaseCC
{
	// ■データ抽出項目一覧照会
	/** テンプレートID データ抽出項目一覧照会 */
	private static final String TEMP_ID_EKK1351B001 = "EKK1351B001";
	/** テンプレートID(明細) データ抽出項目一覧照会 */
	private static final String TEMP_DTL_EKK1351B001 = EKK1351B001CBSMsg.EKK1351B001CBSMSG1LIST;
	/** IN項目リスト データ抽出項目一覧照会 */
	private static final List<String> IN_COLUMN_LIST_EKK1351B001 = Arrays.asList(EKK1351B001CBSMsg.KEY_DSP_DCHSKM_CD,
			EKK1351B001CBSMsg.DISPLAY_NUM, EKK1351B001CBSMsg.DISPLAY_PAGE_NUM, EKK1351B001CBSMsg.MAX_SEARCH_NUM);
	/** 関連チェックエラー項目 データ抽出項目一覧照会 */
	private static final String ERROR_COLUMN_EKK1351B001 = EKK1351B001CBSMsg.KEY_DSP_DCHSKM_CD;

	// ■割引サービス一覧照会（基準年月日）
	/** テンプレートID 割引サービス一覧照会（基準年月日） */
	private static final String TEMP_ID_EKK0841B003 = "EKK0841B003";
	/** テンプレートID(明細) 割引サービス一覧照会（基準年月日） */
	private static final String TEMP_DTL_EKK0841B003 = EKK0841B003CBSMsg.EKK0841B003CBSMSG1LIST;
	/** IN項目リスト 割引サービス一覧照会（基準年月日） */
	private static final List<String> IN_COLUMN_LIST_EKK0841B003 =
		Arrays.asList(EKK0841B003CBSMsg.KEY_DSP_CAMPAIGN_CD, EKK0841B003CBSMsg.KEY_KJNYMD);
	/** 関連チェックエラー項目 割引サービス一覧照会（基準年月日） */
	private static final String ERROR_COLUMN_EKK0841B003 = EKK0841B003CBSMsg.KEY_DSP_CAMPAIGN_CD_ERR;

	// ■IN項目
	/** 割引サービスコードリスト */
	private static final String IN_WRIB_SVC_CD_LIST = "wrib_svc_cd_list";
	/** 割引サービスコード */
	private static final String IN_WRIB_SVC_CD = "wrib_svc_cd";
	/** 取扱コード */
	private static final String IN_TRAT_CD = "trat_Cd";

	// ■OUT項目
	/** データ抽出項目リスト */
	private static final String DCHSKM_LIST = "dchskm_list";
	/** 割引サービスリスト */
	private static final String WRIB_SVC_LIST = "wrib_svc_list";

	// ■その他
	/** 日付フォーマット：yyyyMMddHHmm */
	private static final String YYYYMMDDHHMM = "yyyyMMddHHmm";

	// ■OUTリスト
	@SuppressWarnings("unchecked")
	/** データ抽出項目リスト */
	private ArrayList dchskmList = new ArrayList();
	/** 割引サービスリスト */
	@SuppressWarnings("unchecked")
	private ArrayList wribSvcList = new ArrayList();

	/**
	 * マンション割引適用可能チェック処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getResultData(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// 結果返却マップ
		HashMap resultMap = new HashMap();

		// 取扱コードを取得(取得できない時はString.Emptyを返却)
		String tradCd = chkAndGetTradCd(param, fixedText, resultMap);
		if (!JFUBPCommon.isNull(tradCd))
		{
			// 部品を実行して表示用データ抽出コードを取得
			JFUBPCommon.getDchskmByTratCd(handle, param, fixedText);

			// 処理終了
			return param;
		}
		
		// 以降、取扱コードが未設定の場合の処理
		// ●IN項目取得
		resultMap = chkAndGetInValues(param, fixedText, resultMap);

		// ●実行判定
		if(resultMap == null || resultMap.size() == 0)
		{
			// IN項目値が不正の場合処理をしない
			return param;
		}

		// ●データ抽出項目チェック
		chkDchskm(handle, param, fixedText, resultMap);

		// ●割引サービスチェック
		chkWribSvc(handle, param, fixedText, resultMap);

		// データ抽出項目リスト
		resultMap.put(DCHSKM_LIST, this.dchskmList);
		// 割引サービスリスト
		resultMap.put(WRIB_SVC_LIST, this.wribSvcList);

		// 一度リクエストパラメータを初期化
		param.removeData(fixedText);
		// 返却マップをリクエストパラメータに設定
		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;
	}

	/**
	 * IN項目値を取得します。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param resultMap 結果マップ
	 * @return 結果マップ
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private HashMap chkAndGetInValues(IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// リクエストパラメータデータ取得
		HashMap<?, ?> paramMap = (HashMap<?, ?>)param.getData(fixedText);

		// ●IN項目取得
		// 割引サービスコードリスト
		if(paramMap.containsKey(IN_WRIB_SVC_CD_LIST))
		{
			ArrayList inList = (ArrayList)paramMap.get(IN_WRIB_SVC_CD_LIST);
			if(inList != null && inList.size() > 0)
			{
				resultMap.put(IN_WRIB_SVC_CD_LIST, inList);
			}
			else
			{
				// IN項目値が不正の場合
				resultMap = new HashMap();
			}
		}
		else
		{
			// IN項目値が不正の場合
			resultMap = new HashMap();
		}

		return resultMap;
	}

	/**
	 * IN項目値(データ抽出項目)を取得します。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param resultMap 結果マップ
	 * @return 取扱コード
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private String chkAndGetTradCd(IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// 返却値初期設定
		String retCd = JFUStrConst.EMPTY;

		// リクエストパラメータデータ取得
		HashMap<?, ?> paramMap = (HashMap<?, ?>)param.getData(fixedText);

		// ●IN項目の取扱コードを取得
		//  IN項目に取扱コードが無い場合、JFUStrConst.EMPTYを返却
		if (paramMap.containsKey(IN_TRAT_CD))
		{
			// 取扱コードが未設定の場合はJFUStrConst.EMPTYを返却
			if (JFUBPCommon.isNull(paramMap.get(IN_TRAT_CD)))
			{
				return retCd;
			}

			retCd = paramMap.get(IN_TRAT_CD).toString();
		}

		return retCd;
	}
	
	/**
	 * データ抽出項目チェック処理です。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param 
	 * @return 結果リスト
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private void chkDchskm(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// IN項目リスト
		ArrayList inList = (ArrayList)resultMap.get(IN_WRIB_SVC_CD_LIST);
		// オンライン運用日付
		String inOpeDate = JFUBPCommon.getOpeDateTime(null).substring(0, 12);

		// 検索結果リスト
		ArrayList searchList = new ArrayList();

		// 日付フォーマット
		SimpleDateFormat adf = new SimpleDateFormat(YYYYMMDDHHMM);
		Date opeDate = adf.parse(inOpeDate);

		for (int i = 0; i < inList.size(); i++)
		{
			HashMap inChildMap = (HashMap)inList.get(i);

			if (inChildMap == null || inChildMap.size() == 0)
			{
				// マップが空の場合、次の処理へ
				continue;
			}

			// 割引サービスコード取得
			String wribSvcCd = (String)inChildMap.get(IN_WRIB_SVC_CD);

			if (JFUBPCommon.isNull(wribSvcCd))
			{
				// キー文字列が空の場合、次の処理へ
				continue;
			}

			// ●上りマッピング
			HashMap inMap = (HashMap)param.getData(fixedText);
			// 機能コード設定
			inMap.put(EKK1351B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
			// ＫＥＹ＿表示用データ抽出項目コード
			inMap.put(EKK1351B001CBSMsg.KEY_DSP_DCHSKM_CD, wribSvcCd);
			// 表示件数
			inMap.put(EKK1351B001CBSMsg.DISPLAY_NUM, JFUStrConst.DISPLAY_NUM);
			// 表示ページ番号
			inMap.put(EKK1351B001CBSMsg.DISPLAY_PAGE_NUM, JFUStrConst.DISPLAY_PAGE_NUM);
			// 最大検索件数
			inMap.put(EKK1351B001CBSMsg.MAX_SEARCH_NUM, JFUStrConst.MAX_SEARCH_NUM);
			// 検索なしエラーとしない
			inMap.put(IGNORE_SEARCH_ERR, true);

			// ●サービスIF実行
			executeSC(handle, param, fixedText, TEMP_ID_EKK1351B001, TEMP_DTL_EKK1351B001, IN_COLUMN_LIST_EKK1351B001,
					ERROR_COLUMN_EKK1351B001);

			// ●下りマッピング
			ArrayList resultList = (ArrayList)((HashMap)param.getData(fixedText)).get(TEMP_DTL_EKK1351B001);

			// 結果が存在しない場合、NULLを返却する
			if (resultList == null || resultList.size() == 0)
			{
				continue;
			}

			// ●適用可能チェック
			for (int j = 0; j < resultList.size(); j++)
			{
				HashMap childMap = (HashMap)resultList.get(j);
				if(childMap == null || childMap.size() == 0)
				{
					continue;
				}

				// 設定可能開始年月日時分
				String setPsbStaTime = (String)childMap.get(EKK1351B001CBSMsg1List.SET_PSB_STA_YMDHM);
				// 設定可能終了年月日時分
				String setPsbEndTime = (String)childMap.get(EKK1351B001CBSMsg1List.SET_PSB_END_YMDHM);

				Date sta = new Date();
				Date end = new Date();

				// 日付変換
				if(!JFUBPCommon.isNull(setPsbStaTime))
				{
					sta = adf.parse(setPsbStaTime);
				}
				if(!JFUBPCommon.isNull(setPsbEndTime))
				{
					end = adf.parse(setPsbEndTime);
				}

				// チェック結果
				if(sta.before(opeDate) && end.after(opeDate))
				{
					// 設定可能期間内の場合
					this.dchskmList.add(childMap);
				}

				// 検索結果格納
				searchList.add(childMap);
			}
		}

		// データ抽出項目検索結果格納
		resultMap.put(EKK1351B001CBSMsg.EKK1351B001CBSMSG1LIST, searchList);
	}

	/**
	 * 割引サービスチェック処理です。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param inList INリスト
	 * @return 結果リスト
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private void chkWribSvc(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// IN項目リスト
		ArrayList inList = (ArrayList)resultMap.get(IN_WRIB_SVC_CD_LIST);
		// 検索結果リスト
		ArrayList searchList = new ArrayList();

		for (int i = 0; i < inList.size(); i++)
		{
			HashMap inChildMap = (HashMap)inList.get(i);

			if (inChildMap == null || inChildMap.size() == 0)
			{
				// マップが空の場合、次の処理へ
				continue;
			}

			// 割引サービスコード取得
			String wribSvcCd = (String)inChildMap.get(IN_WRIB_SVC_CD);

			if (JFUBPCommon.isNull(wribSvcCd))
			{
				// キー文字列が空の場合、次の処理へ
				continue;
			}

			// ●上りマッピング
			HashMap inMap = (HashMap)param.getData(fixedText);
			// 機能コード設定
			inMap.put(EKK0841B003CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
			// ＫＥＹ＿基準年月日
			inMap.put(EKK0841B003CBSMsg.KEY_KJNYMD, JFUBPCommon.getOpeDate(null));
			// ＫＥＹ＿表示用キャンペーンコード
			inMap.put(EKK0841B003CBSMsg.KEY_DSP_CAMPAIGN_CD, wribSvcCd);
			// 検索なしエラーとしない
			inMap.put(IGNORE_SEARCH_ERR, true);

			// ●サービスIF実行
			executeSC(handle, param, fixedText, TEMP_ID_EKK0841B003, TEMP_DTL_EKK0841B003, IN_COLUMN_LIST_EKK0841B003,
					ERROR_COLUMN_EKK0841B003);

			// ●下りマッピング
			ArrayList resultList = (ArrayList)((HashMap)param.getData(fixedText)).get(TEMP_DTL_EKK0841B003);

			if(resultList == null || resultList.size() == 0)
			{
				// 結果がない場合、次の処理へ
				continue;
			}

			// ●適用可能チェック
			for (int j = 0; j < resultList.size(); j++)
			{
				HashMap childMap = (HashMap)resultList.get(j);
				if(childMap == null || childMap.size() == 0)
				{
					continue;
				}

				// 適用期間内の場合、割引サービスリストに格納
				this.wribSvcList.add(childMap);
				// 検索結果格納
				searchList.add(childMap);
			}
		}

		// 割引サービス検索結果格納
		resultMap.put(EKK0841B003CBSMsg.EKK0841B003CBSMSG1LIST, searchList);
	}
}