/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFURecoverOpSvKeiShokaiCC
*   ソースファイル名：JFURecoverOpSvKeiShokaiCC.java
*   作成者          ：富士通
*   日付            ：2011年11月05日
*＜機能概要＞
*   回復対象オプションサービス契約一覧照会コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/11/05   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 eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbs.cbsmsg.EKK0351B007CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B007CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0811A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0821A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0821A010CBSMsg1List;

/**
 * 回復対象オプションサービス契約一覧照会コモンコンポーネント部品です。
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFURecoverOpSvKeiShokaiCC extends JFUBaseCC
{

	/* ■□ 料金コース_オプションサービス一意照会SC ■□ */
	/** 料金コース_オプションサービス一意照会 テンプレートID*/
	private static final String TEMPLATE_ID_EKK0811A010 = "EKK0811A010";
	/** テンプレートID(料金コース_オプションサービス一意照会明細) */
	private static final String TEMPLATE_ID_EKK0811A010_DETAIL = EKK0811A010CBSMsg.EKK0811A010CBSMSG1LIST;
	/** IN項目リスト(料金コース_オプションサービス一意照会) */
	private static final List<String> IN_COLUMN_LIST_EKK0811A010 =
			Arrays.asList(EKK0811A010CBSMsg.KEY_PCRS_CD, EKK0811A010CBSMsg.KEY_OP_SVC_CD, EKK0811A010CBSMsg.KEY_GENE_ADD_DTM,
					EKK0811A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(料金コース_オプションサービス一意照会) */
	private static final String ERROR_COLUMN_EKK0811A010 = EKK0811A010CBSMsg.KEY_PCRS_CD_ERR;

	/* ■□ オプションサービス一意照会SC ■□ */
	/** オプションサービス一意照会 テンプレートID*/
	private static final String TEMPLATE_ID_EKK0821A010 = "EKK0821A010";
	/** テンプレートID(オプションサービス一意照会明細) */
	private static final String TEMPLATE_ID_EKK0821A010_DETAIL = EKK0821A010CBSMsg.EKK0821A010CBSMSG1LIST;
	/** IN項目リスト(オプションサービス一意照会) */
	private static final List<String> IN_COLUMN_LIST_EKK0821A010 =
			Arrays.asList(EKK0821A010CBSMsg.KEY_OP_SVC_CD, EKK0821A010CBSMsg.KEY_GENE_ADD_DTM, EKK0821A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(オプションサービス一意照会) */
	private static final String ERROR_COLUMN_EKK0821A010 = EKK0821A010CBSMsg.KEY_OP_SVC_CD_ERR;

	/* ■□ オプションサービス契約一覧照会(回復可能チェック)SC ■□ */
	/** オプションサービス契約一覧照会(回復可能チェック) テンプレートID*/
	private static final String TEMPLATE_ID_EKK0351B007 = "EKK0351B007";
	/** テンプレートID(オプションサービス契約一覧照会(回復可能チェック)明細) */
	private static final String TEMPLATE_ID_EKK0351B007_DETAIL = EKK0351B007CBSMsg.EKK0351B007CBSMSG1LIST;
	/** IN項目リスト(オプションサービス契約一覧照会(回復可能チェック)) */
	private static final List<String> IN_COLUMN_LIST_EKK0351B007 =
			Arrays.asList(EKK0351B007CBSMsg.KEY_SVC_KEI_NO, EKK0351B007CBSMsg.KEY_OP_SVC_CD, EKK0351B007CBSMsg.MAX_SEARCH_NUM);
	/** 関連チェックエラー項目(オプションサービス契約一覧照会(回復可能チェック)) */
	private static final String ERROR_COLUMN_EKK0351B007 = EKK0351B007CBSMsg.KEY_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(現請求契約情報一覧照会) */
	private static final String TEMP_TEMPLATE_EKK0351B007 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0351B007 + TEMP_TEMPLATE_PRIFIX_SEP + "1";
	/** 同日を含む／含まないの指定(0：含まない、1：含む) */
	private static final String METHOD_FLG_ISFUTUREDATE_0 = "0";

	/**
	 *回復対象オプションサービス契約一覧照会処理です。<br>
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite getResultData(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Exception
	{
		// ●サービスID取得
		String serviceId = param.getUsecaseID();
		if (null == serviceId || serviceId.length() == 0)
		{
			return param;
		}
		// ●機能コード取得
		String funcCode = getFuncCode(param, fixedText);
		if (JPCModelConstant.FUNC_CD_2.equals(funcCode))
		{
			// 機能コードがチェックのみの為、処理終了
			return param;
		}

		// ユーザデータ取得
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);
		dataMap.remove(TEMPLATE_ID_EKK0351B007_DETAIL);
		// ●料金コース_オプションサービス一意照会 サービスIF実行
		// 上りマッピング
		setInMapEKK0811A010Search(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0811A010, TEMPLATE_ID_EKK0811A010_DETAIL, IN_COLUMN_LIST_EKK0811A010,
				ERROR_COLUMN_EKK0811A010);

		ArrayList<HashMap<String, Object>> resultListEKK0811A010 = setResultList(dataMap, TEMPLATE_ID_EKK0811A010_DETAIL);
		int countResultEKK0811A010 = resultListEKK0811A010.size();

		// ●オプションサービス一意照会 サービスIF実行
		// 上りマッピング
		setInMapEKK0821A010Search(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0821A010, TEMPLATE_ID_EKK0821A010_DETAIL, IN_COLUMN_LIST_EKK0821A010,
				ERROR_COLUMN_EKK0821A010);
		ArrayList<HashMap<String, Object>> resultListEKK0821A010 = setResultList(dataMap, TEMPLATE_ID_EKK0821A010_DETAIL);

		// ●オプションサービス契約一覧照会(回復可能チェック) サービスIF実行
		// 上りマッピング
		setInMapEKK0351B007Search(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0351B007, TEMPLATE_ID_EKK0351B007_DETAIL, IN_COLUMN_LIST_EKK0351B007,
				ERROR_COLUMN_EKK0351B007);
		// 下りマッピング
		
		// 回復対象オプションサービス契約一覧リストに一時支払い料金情報を設定
		List<HashMap> resultListEKK0351B007 = null;
		if(dataMap.containsKey(TEMP_TEMPLATE_EKK0351B007) && ((HashMap)dataMap.get(TEMP_TEMPLATE_EKK0351B007)).containsKey(TEMPLATE_ID_EKK0351B007_DETAIL)){
			// サービス契約一意照結果の明細取得
			resultListEKK0351B007 = getTemplateList(dataMap, TEMP_TEMPLATE_EKK0351B007, TEMPLATE_ID_EKK0351B007_DETAIL);			
		}

		// 回復対象オプションサービス契約一覧格納用マップ
		HashMap<String, Object> resMap = new HashMap<String, Object>();

		// 回復対象オプションサービス契約一覧格納用リスト
		ArrayList<HashMap<String, Object>> resList = new ArrayList<HashMap<String, Object>>();
		if (null != resultListEKK0351B007)
		{
			int countResultEKK0351B007 = resultListEKK0351B007.size();

			// 取得件数が小さい方の件数分下記の処理を繰り返す。
			int maxRoopNum = countResultEKK0811A010 > countResultEKK0351B007 ? countResultEKK0351B007 : countResultEKK0811A010;
			for (int i = 0; i < maxRoopNum; i++)
			{

				HashMap<String, Object> resultEKK0351B007Map = resultListEKK0351B007.get(i);
				if (null == resultEKK0351B007Map)
				{
					continue;
				}

				HashMap<String, Object> resultEKK0821A010Map = resultListEKK0821A010.get(i);
				if (null == resultEKK0821A010Map)
				{
					continue;
				}

				// オプションサービス契約ステータスが「"910":解約済み」の場合は処理を続行する。
				String opSvcKeiStat = (String)resultEKK0351B007Map.get(EKK0351B007CBSMsg1List.OP_SVC_KEI_STAT);
				if (!JFUStrConst.CD00037_910.equals(opSvcKeiStat))
				{
					continue;
				}

				// サービス解約年月日
				String svcDslYmd = (String)resultEKK0351B007Map.get(EKK0351B007CBSMsg1List.SVC_DSL_YMD);
				if (isNullOrEmpty(svcDslYmd))
				{
					continue;
				}

				// 回復可能期間
				String kaihkPsbPrd = (String)resultEKK0821A010Map.get(EKK0821A010CBSMsg1List.KAIHK_PSB_PRD);
				if (isNullOrEmpty(kaihkPsbPrd))
				{
					continue;
				}

				// 回復判定基準日(回復可能日数 + 解約年月日) ≧ 運用日付の場合は処理を続行する。
				if (JPCUtilCommon.isFutureDate(JFUBPCommon.getOpeDate(null), JFUBPCommon.addDay(svcDslYmd, Integer.parseInt(kaihkPsbPrd)),
						METHOD_FLG_ISFUTUREDATE_0))
				{
					continue;
				}
				String geneAddDtm = (String)resultEKK0821A010Map.get(EKK0821A010CBSMsg1List.GENE_ADD_DTM);
				resultEKK0351B007Map.put(EKK0821A010CBSMsg1List.GENE_ADD_DTM, geneAddDtm);
				// 回復が可能なオプションサービス契約情報を設定
				resList.add(resultEKK0351B007Map);
			}

		}

		// 回復対象オプションサービス契約一覧がない場合、後続のサービスIF部品用にリストの空箱のみを設定
		if (resList.size() == 0)
		{
			resList.add(new HashMap<String, Object>());
		}

		// 検索結果格納マップをリクエストパラメータ.ユーザデータに設定し返却する
		resMap.put(TEMPLATE_ID_EKK0351B007_DETAIL, resList);
		param.setData(fixedText, resMap);

		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;
	}

	/**
	 * 上りマッピングの項目設定(料金コース_オプションサービス一意照会)です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0811A010Search(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// 機能コード設定(2:料金コース_オプションサービス一意照会結果取得)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		// 予約適用年月日
		inMap.put(EKK0811A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}

	/**
	 * 上りマッピングの項目設定(オプションサービス一意照会)です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0821A010Search(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// 機能コード設定(2:オプションサービス一意照会結果取得)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		// 予約適用年月日
		inMap.put(EKK0821A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}

	/**
	 * 上りマッピングの項目設定(オプションサービス契約一覧照会(回復可能チェック))です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param keyTppn 一時支払料金番号
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0351B007Search(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// 機能コード設定(1:オプションサービス契約一覧照会(回復可能チェック))
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		// 最大検索件数
		inMap.put(EKK0351B007CBSMsg.MAX_SEARCH_NUM, JFUStrConst.MAX_SEARCH_NUM);

		ignoreSearchError(param, fixedText);
	}

	/**
	 * 対象の明細リストを移送します。
	 * 
	 * <br>
	 * @param dataMap
	 * @param listNm
	 * @return 検索結果リスト
	 */
	private ArrayList<HashMap<String, Object>> setResultList(HashMap<String, Object> dataMap, String listNm)
	{
		// 結果格納用リスト
		ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();
		// リスト内検索
		ArrayList<HashMap<String, Object>> childList = (ArrayList<HashMap<String, Object>>)dataMap.get(listNm);
		if (childList != null)
		{
			for (int j = 0; j < childList.size(); j++)
			{
				HashMap<String, Object> childMap = (HashMap<String, Object>)childList.get(j);
				resultList.add(childMap);
			}
		}
		return resultList;
	}

	/**
	 * null又は空文字かをチェックします。
	 * 
	 * <br>
	 * @param str 文字列
	 * @return true:null又は空文字、false:左記以外
	 */
	private static boolean isNullOrEmpty(String str)
	{
		return null == str || str.length() == 0;
	}

}
