/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUGetDchskmUtil
*   ソースファイル名：JFUGetDchskmUtil.java
*   作成者          ：富士通
*   日付            ：2014年04月14日
*＜機能概要＞
*   データ抽出項目取得関連部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v8.00       2014/04/14   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 java.util.TreeMap;

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 eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK1351B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1351B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1371B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1371B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2391B501CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2391B501CBSMsg1List;

/**
 * データ抽出項目取得関連部品です。
 * 
 * <br>
 * @author 富士通
 */
public class JFUGetDchskmUtil extends JFUBaseCC
{
	// ■データ抽出項目設定条件一覧照会（その他CP）
	/** テンプレートID データ抽出項目設定条件一覧照会（その他CP） */
	private static final String TEMP_ID_EKK2391B501 = "EKK2391B501";
	/** テンプレートID(明細) データ抽出項目設定条件一覧照会（その他CP） */
	private static final String TEMP_DTL_EKK2391B501 = EKK2391B501CBSMsg.EKK2391B501CBSMSG1LIST;
	/** IN項目リスト データ抽出項目設定条件一覧照会（その他CP） */
	private static final List<String> IN_COLUMN_LIST_EKK2391B501 =
			Arrays.asList(EKK2391B501CBSMsg.KEY_KJNYMD, EKK2391B501CBSMsg.KEY_DCHSKM_SETE_JKN_SBT_CD, EKK2391B501CBSMsg.KEY_DCHSKM_SETE_JKN_VALUE_1);
	/** 関連チェックエラー項目 データ抽出項目設定条件一覧照会（その他CP） */
	private static final String ERROR_COLUMN_EKK2391B501 = EKK2391B501CBSMsg.KEY_DCHSKM_SETE_JKN_VALUE_1_ERR;
	/** SC実行結果取得キー(データ抽出項目設定条件一覧照会（その他CP）) */
	private static final String TEMP_TEMPLATE_KEY_EKK2391B501 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_EKK2391B501 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	// ■データ抽出項目対象サービス一覧照会
	/** テンプレートID データ抽出項目対象サービス一覧照会 */
	private static final String TEMP_ID_EKK1371B001 = "EKK1371B001";
	/** テンプレートID(明細) データ抽出項目対象サービス一覧照会 */
	private static final String TEMP_DTL_EKK1371B001 = EKK1371B001CBSMsg.EKK1371B001CBSMSG1LIST;
	/** IN項目リスト データ抽出項目対象サービス一覧照会 */
	private static final List<String> IN_COLUMN_LIST_EKK1371B001 =
			Arrays.asList(EKK1371B001CBSMsg.KEY_DCHSKM_CD, EKK1371B001CBSMsg.KEY_PRC_GRP_CD, EKK1371B001CBSMsg.KEY_PCRS_CD,
					EKK1371B001CBSMsg.KEY_PPLAN_CD, EKK1371B001CBSMsg.KEY_KJN_YMD, EKK1371B001CBSMsg.MAX_SEARCH_NUM);
	/** 関連チェックエラー項目 データ抽出項目対象サービス一覧照会 */
	private static final String ERROR_COLUMN_EKK1371B001 = EKK1371B001CBSMsg.KEY_DCHSKM_CD_ERR;
	/** SC実行結果取得キー(データ抽出項目対象サービス一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_EKK1371B001 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_EKK1371B001 + TEMP_TEMPLATE_PRIFIX_SEP;

	// ■データ抽出項目一覧照会（申込種別コード）
	/** テンプレートID データ抽出項目一覧照会（申込種別コード） */
	private static final String TEMP_ID_EKK1351B003 = "EKK1351B003";
	/** テンプレートID(明細) データ抽出項目一覧照会（申込種別コード） */
	private static final String TEMP_DTL_EKK1351B003 = EKK1351B003CBSMsg.EKK1351B003CBSMSG1LIST;
	/** IN項目リスト データ抽出項目一覧照会（申込種別コード） */
	private static final List<String> IN_COLUMN_LIST_EKK1351B003 =
			Arrays.asList(EKK1351B003CBSMsg.KEY_DCHSKM_CD, EKK1351B003CBSMsg.KEY_SET_PSB_STA_YMD_TO, EKK1351B003CBSMsg.KEY_SET_PSB_END_YMD_FROM,
					EKK1371B001CBSMsg.MAX_SEARCH_NUM);
	/** 関連チェックエラー項目 データ抽出項目一覧照会（申込種別コード） */
	private static final String ERROR_COLUMN_EKK1351B003 = EKK1351B003CBSMsg.KEY_DCHSKM_CD_ERR;
	/** SC実行結果取得キー(データ抽出項目一覧照会（申込種別コード）) */
	private static final String TEMP_TEMPLATE_KEY_EKK1351B003 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_EKK1351B003 + TEMP_TEMPLATE_PRIFIX_SEP;
	
	// ■IN項目
	/** 取扱コード */
	private static final String IN_TRAT_CD = "trat_Cd";
	/** 料金グループコード */
	private static final String IN_PRC_GRP_CD = "prc_grp_cd";
	/** 料金コースコード */
	private static final String IN_PCRS_CD = "pcrs_cd";
	/** 料金プランコード */
	private static final String IN_PPLAN_CD = "pplan_cd";

	// ■OUT項目
	/** データ抽出項目コード */
	private static final String OUT_DCHSKM_CD = "dchskm_cd";
	/** データ抽出項目名 */
	private static final String OUT_DCHSKM_NM = "dchskm_nm";
	/** 受付開始年月日時分 */
	private static final String OUT_UK_STA_YMDHM = "uk_sta_ymdhm";
	/** 受付終了年月日時分 */
	private static final String OUT_UK_END_YMDHM = "uk_end_ymdhm";
	/** 表示用データ抽出項目コード */
	private static final String OUT_DSP_DCHSKM_CD = "dsp_dchskm_cd";

	/**
	 * 取扱コードよりデータ抽出項目情報取得処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getDchskmByTratCd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		ArrayList<HashMap> wkList1 = new ArrayList<HashMap>();
		ArrayList<HashMap> wkList2 = new ArrayList<HashMap>();

		// ●データ抽出項目設定条件一覧照会（その他CP）
		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_EKK2391B501);
		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setInMapEKK2391B501(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_ID_EKK2391B501, TEMP_DTL_EKK2391B501, IN_COLUMN_LIST_EKK2391B501, ERROR_COLUMN_EKK2391B501);
		// ●判定１
		if (!isExistsTemplateDetail(inMap, TEMP_TEMPLATE_KEY_EKK2391B501, TEMP_DTL_EKK2391B501))
		{
			// データ抽出項目設定条件一覧照会（その他CP）のデータ抽出項目設定一覧明細が存在しない場合、処理を終了する
			return param;
		}

		// データ抽出項目設定条件一覧照会（その他CP）のデータ抽出項目設定一覧明細を取得
		ArrayList<HashMap> resEKK2391B501List = getDTLList((HashMap)param.getData(fixedText), TEMP_DTL_EKK2391B501);

		// ●繰り返し処理１
		// データ抽出項目設定条件一覧照会（その他CP）の結果件数分ループ
		int i = 0;
		for (HashMap mapEKK2391B501 : resEKK2391B501List)
		{
			String dchskmCd1 = JFUStrConst.EMPTY;
			// データ抽出項目取得
			if (!JFUBPCommon.isNull(mapEKK2391B501.get(EKK2391B501CBSMsg1List.DCHSKM_CD)))
			{
				dchskmCd1 = (String)mapEKK2391B501.get(EKK2391B501CBSMsg1List.DCHSKM_CD);
				dchskmCd1 = dchskmCd1.replace(JFUStrConst.HALF_SPACE,JFUStrConst.EMPTY);
			}
			
			if (dchskmCd1.length() == 0)
			{
				// データ抽出項目コードが未設定の場合は、次のデータへ
				continue;
			}

			// ●データ抽出項目対象サービス一覧照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_EKK1371B001);
			// 検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setInMapEKK1371B001(param, fixedText, dchskmCd1);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMP_ID_EKK1371B001, TEMP_DTL_EKK1371B001, IN_COLUMN_LIST_EKK1371B001, ERROR_COLUMN_EKK1371B001);
			// ●判定２
			i += 1;
			if (!isExistsTemplateDetail(inMap, TEMP_TEMPLATE_KEY_EKK1371B001 + String.valueOf(i), TEMP_DTL_EKK1371B001))
			{
				// データ抽出項目対象サービス一覧照会のデータ抽出項目対象サービス一覧照会明細が存在しない場合、次のデータへ
				continue;
			}
			
			// データ抽出項目対象サービス一覧照会のデータ抽出項目対象サービス一覧照会明細を取得
			ArrayList<HashMap> resEKK1371B001List = getDTLList((HashMap)param.getData(fixedText), TEMP_DTL_EKK1371B001);
			
			// ●繰り返し処理２
			// データ抽出項目対象サービス一覧照会の結果件数分ループ
			int j = 0;
			for (HashMap mapEKK1371B001 : resEKK1371B001List)
			{
				String dchskmCd2 = JFUStrConst.EMPTY;
				// データ抽出項目取得
				if (!JFUBPCommon.isNull(mapEKK1371B001.get(EKK1371B001CBSMsg1List.DCHSKM_CD)))
				{
					dchskmCd2 = (String)mapEKK1371B001.get(EKK1371B001CBSMsg1List.DCHSKM_CD);
					dchskmCd2 = dchskmCd2.replace(JFUStrConst.HALF_SPACE,JFUStrConst.EMPTY);
				}
				
				if (dchskmCd2.length() == 0)
				{
					// データ抽出項目コードが未設定の場合は、次のデータへ
					continue;
				}
				
				// データ抽出項目設定条件一覧照会（その他CP）のデータ抽出項目コードと、
				// データ抽出項目対象サービス一覧照会のデータ抽出項目コードが同じ場合、
				// データ抽出項目設定条件一覧照会（その他CP）の内容をワークに退避し、繰り返し処理１，２を抜ける
				if (dchskmCd1.equals(dchskmCd2))
				{
					j += 1;
					
					// ●データ抽出項目一覧照会（申込種別コード）
					// ユーザデータ初期化
					initData(param, fixedText, IN_COLUMN_LIST_EKK1351B003);
					// 検索エラーなし設定
					ignoreSearchError(param, fixedText);
					// 上りマッピング
					setInMapEKK1351B003(param, fixedText, dchskmCd2);
					// サービスIF実行
					executeSC(handle, param, fixedText, TEMP_ID_EKK1351B003, TEMP_DTL_EKK1351B003, IN_COLUMN_LIST_EKK1351B003, ERROR_COLUMN_EKK1351B003);
					// ●判定３
					if (!isExistsTemplateDetail(inMap, TEMP_TEMPLATE_KEY_EKK1351B003 + String.valueOf(j), TEMP_DTL_EKK1351B003))
					{
						// データ抽出項目が、設定期間外なので
						// 繰り返し２を抜ける
						break;
					}
					
					// データ抽出項目一覧照会（申込種別コード）明細を取得
					ArrayList<HashMap> resEKK1351B003List = getDTLList((HashMap)param.getData(fixedText), TEMP_DTL_EKK1351B003);
					
					// データ抽出項目コードで取得しているので必ず1件
					wkList1.add(resEKK1351B003List.get(0));
					
					// 繰り返し２を抜ける
					break;
				}
			}
		}

		// ●判定４
		if (wkList1 == null || wkList1.size() == 0)
		{
			// 該当のデータ抽出項目が存在しない場合は、処理を終了する
			return param;
		}

		TreeMap sortMap_wkList1 = new TreeMap();

		// ●繰り返し処理３
		for (HashMap wkMap : wkList1)
		{
			// wkList1が複数ある場合、設定可能開始年月日時分が新しいものを採用する為、TreeMapを利用してソートする
			// 設定可能開始年月日時分をキーにマップを設定
			sortMap_wkList1.put(nullToBlank(wkMap.get(EKK1351B003CBSMsg1List.SET_PSB_STA_YMDHM).toString()), wkMap);
		}

		// 最終レコードを採用
		wkList2.add(getLastData(sortMap_wkList1));
		
		// ●OUTパラメータに設定
		setOutParam(param, fixedText, wkList2.get(0));

		// 返却
		return param;
	}

	/**
	 * 上りマッピング項目を設定します。(データ抽出項目設定条件一覧照会（その他CP）)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private void setInMapEKK2391B501(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿基準年月日
		inMap.put(EKK2391B501CBSMsg.KEY_KJNYMD, JFUBPCommon.getOpeDate(null));
		// ＫＥＹ＿データ抽出項目設定条件種別コード
		inMap.put(EKK2391B501CBSMsg.KEY_DCHSKM_SETE_JKN_SBT_CD, JFUStrConst.CD01360_06);
		// ＫＥＹ＿データ抽出項目設定条件値1
		inMap.put(EKK2391B501CBSMsg.KEY_DCHSKM_SETE_JKN_VALUE_1, (String)inMap.get(IN_TRAT_CD));

	}

	/**
	 * 上りマッピング項目を設定します。(データ抽出項目対象サービス一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param dchskm_cd データ抽出項目コード
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private void setInMapEKK1371B001(IRequestParameterReadWrite param, String fixedText, String dchskm_cd) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿データ抽出項目コード
		inMap.put(EKK1371B001CBSMsg.KEY_DCHSKM_CD, dchskm_cd);
		// ＫＥＹ＿料金グループコード
		inMap.put(EKK1371B001CBSMsg.KEY_PRC_GRP_CD, (String)inMap.get(IN_PRC_GRP_CD));
		// ＫＥＹ＿料金コースコード
		inMap.put(EKK1371B001CBSMsg.KEY_PCRS_CD, (String)inMap.get(IN_PCRS_CD));
		// ＫＥＹ＿料金プランコード
		inMap.put(EKK1371B001CBSMsg.KEY_PPLAN_CD, (String)inMap.get(IN_PPLAN_CD));
		// ＫＥＹ＿基準年月日
		inMap.put(EKK1371B001CBSMsg.KEY_KJN_YMD, JFUBPCommon.getOpeDate(null));
		// 最大検索件数
		inMap.put(EKK1371B001CBSMsg.MAX_SEARCH_NUM, JFUStrConst.MAX_SEARCH_NUM);

	}

	/**
	 * 上りマッピング項目を設定します。(データ抽出項目一覧照会（申込種別コード）)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param dchskmCd データ抽出項目コード
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private void setInMapEKK1351B003(IRequestParameterReadWrite param, String fixedText, String dchskmCd) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 運用日付
		String opeDate = JCCBPCommon.getOpeDate(null);

		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿データ抽出項目コード
		inMap.put(EKK1351B003CBSMsg.KEY_DCHSKM_CD, dchskmCd);
		// ＫＥＹ＿設定可能開始年月日(至)
		inMap.put(EKK1351B003CBSMsg.KEY_SET_PSB_STA_YMD_TO, opeDate);
		// ＫＥＹ＿設定可能終了年月日(自)
		inMap.put(EKK1351B003CBSMsg.KEY_SET_PSB_END_YMD_FROM, opeDate);
		// 最大検索件数
		inMap.put(EKK1351B003CBSMsg.MAX_SEARCH_NUM, JFUStrConst.MAX_SEARCH_NUM);

	}
	
	
	/**
	 * OUTパラメータに設定します。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param setMap 設定元Map
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private void setOutParam(IRequestParameterReadWrite param, String fixedText, HashMap setMap) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// データ抽出項目コード
		inMap.put(OUT_DCHSKM_CD, setMap.get(EKK1351B003CBSMsg1List.DCHSKM_CD));
		// データ抽出項目名
		inMap.put(OUT_DCHSKM_NM, setMap.get(EKK1351B003CBSMsg1List.DCHSKM_NM));
		// 受付開始年月日時分
		inMap.put(OUT_UK_STA_YMDHM, setMap.get(EKK1351B003CBSMsg1List.SET_PSB_STA_YMDHM));
		// 受付終了年月日時分
		inMap.put(OUT_UK_END_YMDHM, setMap.get(EKK1351B003CBSMsg1List.SET_PSB_END_YMDHM));
		// 表示用データ抽出項目コード
		inMap.put(OUT_DSP_DCHSKM_CD, setMap.get(EKK1351B003CBSMsg1List.DSP_DCHSKM_CD));

	}

	/**
	 * 明細リストを返却します。
	 * <br>
	 * @param dataMap INマップ
	 * @param listNm リスト名
	 * @return 検索結果リスト
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap> getDTLList(HashMap dataMap, String listNm)
	{
		// 結果格納用リスト
		ArrayList<HashMap> resultList = new ArrayList<HashMap>();
		// リスト内検索
		ArrayList childList = (ArrayList)dataMap.get(listNm);

		if (childList != null && childList.size() > 0)
		{
			for (int j = 0; j < childList.size(); j++)
			{
				HashMap childMap = (HashMap)childList.get(j);
				resultList.add(childMap);
			}
		}

		return resultList;
	}

	/**
	 * Nullの場合は空文字を設定します。
	 * 
	 * <br>
	 * @param temp
	 * @return String
	 */
	private String nullToBlank(String temp)
	{
		String ret = JFUStrConst.EMPTY;

		if (!JFUBPCommon.isNull(temp))
		{
			ret = temp;
		}

		return ret;
	}

	/**
	 * TreeMapの一番最後のデータを取得します。
	 * 
	 * <br>
	 * @param treeMap Treeマップ
	 * @return HashMap 1つめのマップ
	 */
	@SuppressWarnings("unchecked")
	private HashMap getLastData(TreeMap treeMap)
	{
		HashMap tempMap = new HashMap();

		if (treeMap != null && !treeMap.isEmpty())
		{

			tempMap = (HashMap)treeMap.get(treeMap.lastKey());

		}

		return tempMap;
	}
	
	/**
	 * チェック処理です。
	 * <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;
	}


}