/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUGetIdoRsvCC
*   ソースファイル名：JFUGetIdoRsvCC.java
*   作成者          ：富士通
*   日付            ：2014年08月08日
*＜機能概要＞
*   異動予約取得コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v11.00.00   2014/08/08   FJ）谷本    【ANK-2141-00-00】STB交換方法の変更
*   
**********************************************************************/
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.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B021CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B021CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg;

/**
 * 異動予約取得コモンコンポーネント部品
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUGetIdoRsvCC extends JFUBaseCC
{
	// ■ サービスＩＦ定義 ■

	/* ■□ EKK0341B021_機器提供サービス契約一覧照会（予約）SC ■□ */
	/** テンプレートID(機器提供サービス契約一覧照会（予約）) */
	private static final String TEMP_ID_EKK0341B021 = "EKK0341B021";
	/** テンプレートID(機器提供サービス契約一覧照会（予約）明細) */
	private static final String TEMP_ID_DTL_EKK0341B021 = EKK0341B021CBSMsg.EKK0341B021CBSMSG1LIST;
	/** IN項目リスト(機器提供サービス契約一覧照会（予約）) */
	private static final List<String> IN_COL_LIST_EKK0341B021 = Arrays.asList(EKK0341B021CBSMsg.KEY_SVC_KEI_NO, EKK0341B021CBSMsg.KEY_RSV_IDO_DIV);
	/** 関連チェックエラー項目(機器提供サービス契約一覧照会（予約）) */
	private static final String ERR_COL_EKK0341B021 = EKK0341B021CBSMsg.KEY_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(機器提供サービス契約一覧照会（予約）) */
	private static final String TEMP_TEMP_KEY_EKK0341B021 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_EKK0341B021 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ EKK0341A010_機器提供サービス契約一意照会SC ■□ */
	/** テンプレートID(機器提供サービス契約一意照会) */
	private static final String TEMP_ID_EKK0341A010 = "EKK0341A010";
	/** テンプレートID(機器提供サービス契約一意照会明細) */
	private static final String TEMP_ID_DTL_EKK0341A010 = EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST;
	/** IN項目リスト(機器提供サービス契約一意照会) */
	private static final List<String> IN_COL_LIST_EKK0341A010 =
			Arrays.asList(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, EKK0341A010CBSMsg.KEY_GENE_ADD_DTM, EKK0341A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(機器提供サービス契約一意照会) */
	private static final String ERR_COL_EKK0341A010 = EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(機器提供サービス契約一意照会) */
	private static final String TEMP_TEMP_KEY_EKK0341A010 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_EKK0341A010 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□EKK1681B001_異動予約一覧照会SC ■□ */
	/** テンプレートID(異動予約一覧照会) */
	private static final String TEMP_ID_EKK1681B001 = "EKK1681B001";
	/** テンプレートID(明細)(異動予約一覧照会) */
	private static final String TEMP_ID_DTL_EKK1681B001 = EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST;
	/** IN項目リスト(異動予約一覧照会) */
	private static final List<String> IN_COL_LIST_EKK1681B001 =
			Arrays.asList(EKK1681B001CBSMsg.KEY_IDO_DIV, EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, EKK1681B001CBSMsg.KEY_RSV_APLY_YMD,
					EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, EKK1681B001CBSMsg.KEY_MSKM_DTL_NO, EKK1681B001CBSMsg.KEY_SYSID,
					EKK1681B001CBSMsg.KEY_SEIKY_KEI_NO, EKK1681B001CBSMsg.KEY_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_SVC_KEI_UCWK_NO,
					EKK1681B001CBSMsg.KEY_OP_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_SBOP_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_KKTK_SVC_KEI_NO,
					EKK1681B001CBSMsg.KEY_WRIB_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, EKK1681B001CBSMsg.KEY_HEIGO_SK_SYSID,
					EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SYSID, EKK1681B001CBSMsg.KEY_HEIGO_SK_SEIKY_KEI_NO,
					EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SEIKY_KEI_NO, EKK1681B001CBSMsg.KEY_KOJIAK_NO, EKK1681B001CBSMsg.KEY_OP_HKTGI_SK_SVC_KEI_NO,
					EKK1681B001CBSMsg.KEY_SORT_ITEM_NO, EKK1681B001CBSMsg.KEY_SORT_KBN);
	/** 関連チェック,エラー項目(異動予約一覧照会) */
	private static final String ERR_COL_EKK1681B001 = EKK1681B001CBSMsg.KEY_IDO_DIV_ERR;
	/** SC実行結果取得キー(異動予約一覧照会) */
	private static final String TEMP_TEMP_KEY_EKK1681B001 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_EKK1681B001 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□EKK1681A010_異動予約一意照会SC ■□ */
	/** テンプレートID(異動予約一意照会) */
	private static final String TEMP_ID_EKK1681A010 = "EKK1681A010";
	/** テンプレートID(明細)(異動予約一意照会) */
	private static final String TEMP_ID_DTL_EKK1681A010 = EKK1681A010CBSMsg.EKK1681A010CBSMSG1LIST;
	/** IN項目リスト(異動予約一意照会) */
	private static final List<String> IN_COL_LIST_EKK1681A010 = Arrays.asList(EKK1681A010CBSMsg.KEY_IDO_RSV_NO);
	/** 関連チェック,エラー項目(異動予約一意照会) */
	private static final String ERR_COL_EKK1681A010 = EKK1681A010CBSMsg.KEY_IDO_RSV_NO_ERR;

	// ■ IN項目ID ■

	/** IN項目ID：サービス契約番号 */
	private static final String IN_SVC_KEI_NO = "key_svc_kei_no";
	/** IN項目ID：サービス契約内訳番号 */
	private static final String IN_SVC_KEI_UCWK_NO = "key_svc_kei_ucwk_no";

	// ■ OUT項目ID ■

	/** OUT項目ID：異動予約一覧(サービス契約) "C009"(STB）、"C010"(B-CAS）、"C011"(C-CAS) */
	private static final String OUT_IDO_RSV_SVC_KEI_LIST = "ido_rsv_svc_kei_list";
	/** OUT項目ID：異動予約一覧(サービス契約内訳) */
	private static final String OUT_IDO_RSV_SVC_KEI_UCWK_LIST = "ido_rsv_svc_kei_ucwk_list";
	/** OUT項目ID：異動予約一覧(サービス契約) "C013"(VONU) */
	private static final String OUT_IDO_RSV_SVC_KEI_VONU_LIST = "ido_rsv_svc_kei_vonu_list";

	// ■ その他 ■

	/** ＫＥＹ＿ソート項目Ｎｏ：異動予約番号 */
	private static final String SORT_IDO_RSV_NO = "1";

	/**
	 * 機器変更中異動予約データ取得処理<br>
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite getKikiChgRsvData(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{

		// 開始ログ
		outDebugLog("----- getStbTakhaiRsvData Start  -----");
		// 
		HashMap inMap = (HashMap)param.getData(fixedText);

		if (inMap == null)
		{
			return param;
		}
		// ●ＩＮ項目
		// IN項目ID：サービス契約番号
		String inSvcKeiNo = (String)inMap.get(IN_SVC_KEI_NO);
		// IN項目ID：サービス契約内訳番号
		String inSvcKeiUcwkNo = (String)inMap.get(IN_SVC_KEI_UCWK_NO);

		// ●ＯＵＴ項目
		// OUT項目ID：異動予約リスト(サービス契約)
		ArrayList rsvSvcKeiList = new ArrayList();
		inMap.put(OUT_IDO_RSV_SVC_KEI_LIST, rsvSvcKeiList);
		// OUT項目ID：異動予約リスト(サービス契約内訳)
		ArrayList rsvSvcKeiUcwkList = new ArrayList();
		inMap.put(OUT_IDO_RSV_SVC_KEI_UCWK_LIST, rsvSvcKeiUcwkList);
		// OUT項目ID：異動予約一覧(サービス契約) "C013"(VONU) 
		ArrayList rsvSvcKeiVonuList = new ArrayList();
		inMap.put(OUT_IDO_RSV_SVC_KEI_VONU_LIST, rsvSvcKeiVonuList);

		// ●EKK0341B021_機器提供サービス契約一覧照会（予約）
		// ユーザデータ初期化
		JFUBPCommon.initData(param, fixedText, IN_COL_LIST_EKK0341B021);
		// 上りマッピング
		setInMapEKK0341B021(param, fixedText, inSvcKeiNo);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// サービスIF実行
		JFUBPCommon.executeSC(handle, param, fixedText, TEMP_ID_EKK0341B021, TEMP_ID_DTL_EKK0341B021, IN_COL_LIST_EKK0341B021, ERR_COL_EKK0341B021);

		for (HashMap<String, String> dataMap : getTemplateList(inMap, JFUBPCommon.getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_EKK0341B021),
				TEMP_ID_DTL_EKK0341B021))
		{

			if (JFUStrConst.CD00132_C013.equals(dataMap.get(EKK0341B021CBSMsg1List.RSV_KKTK_SVC_CD)))
			{
				// 予約機器提供サービスコード＝"C013"(VONU)
				rsvSvcKeiVonuList.add(dataMap);
				continue;
			}
			// 下記条件以外の場合は、次のループ処理にうつる。
			// @予約機器提供サービスコード＝"C009"(STB）、"C010"(B-CAS）、"C011"(C-CAS)
			if ((!JFUStrConst.CD00132_C009.equals(dataMap.get(EKK0341B021CBSMsg1List.RSV_KKTK_SVC_CD))
					&& !JFUStrConst.CD00132_C010.equals(dataMap.get(EKK0341B021CBSMsg1List.RSV_KKTK_SVC_CD)) && !JFUStrConst.CD00132_C011
					.equals(dataMap.get(EKK0341B021CBSMsg1List.RSV_KKTK_SVC_CD))))
			{
				continue;
			}

			// ●EKK1681B001_異動予約一覧照会
			// ユーザデータ初期化
			JFUBPCommon.initData(param, fixedText, IN_COL_LIST_EKK1681B001);
			// 上りマッピング
			setInMapEKK1681B001(param, fixedText, dataMap.get(EKK0341B021CBSMsg1List.KKTK_SVC_KEI_NO));
			//検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// サービスIF実行
			JFUBPCommon.executeSC(handle, param, fixedText, TEMP_ID_EKK1681B001, TEMP_ID_DTL_EKK1681B001, IN_COL_LIST_EKK1681B001,
					ERR_COL_EKK1681B001);

			for (HashMap<String, String> dataMap2 : getTemplateList(inMap, JFUBPCommon.getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_EKK1681B001),
					TEMP_ID_DTL_EKK1681B001))
			{

				// ●EKK1681A010_異動予約一意照会
				// ユーザデータ初期化
				JFUBPCommon.initData(param, fixedText, IN_COL_LIST_EKK1681A010);
				// 上りマッピング
				setInMapEKK1681A010(param, fixedText, dataMap2.get(EKK1681A010CBSMsg1List.IDO_RSV_NO));
				// サービスIF実行
				JFUBPCommon.executeSC(handle, param, fixedText, TEMP_ID_EKK1681A010, TEMP_ID_DTL_EKK1681A010, IN_COL_LIST_EKK1681A010,
						ERR_COL_EKK1681A010);

				HashMap dataMap3 =
						getTemplateListMap(inMap, JFUBPCommon.getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_EKK1681B001), TEMP_ID_DTL_EKK1681B001, 0);

				// 予約の機器がわかるように設定
				dataMap3.put(EKK0341B021CBSMsg1List.RSV_KKTK_SVC_CD, dataMap.get(EKK0341B021CBSMsg1List.RSV_KKTK_SVC_CD));

				// ＩＮ項目（サービス契約内訳番号）が設定されている場合
				if (!JFUBPCommon.isNull(inSvcKeiUcwkNo))
				{

					// ●EKK0341A010_機器提供サービス契約一意照会
					// ユーザデータ初期化
					JFUBPCommon.initData(param, fixedText, IN_COL_LIST_EKK0341A010);
					// 上りマッピング
					setInMapEKK0341A010(param, fixedText, dataMap.get(EKK0341B021CBSMsg1List.KKTK_SVC_KEI_NO), dataMap
							.get(EKK0341B021CBSMsg1List.RSV_GENE_ADD_DTM));
					// サービスIF実行
					JFUBPCommon.executeSC(handle, param, fixedText, TEMP_ID_EKK0341A010, TEMP_ID_DTL_EKK0341A010, IN_COL_LIST_EKK0341A010,
							ERR_COL_EKK0341A010);

					HashMap dataMap4 =
							getTemplateListMap(inMap, JFUBPCommon.getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_EKK0341A010), TEMP_ID_DTL_EKK0341A010, 0);

					// ＩＮ項目（サービス契約内訳番号と、取得した値が同じ場合に、返却処理を行う
					if (inSvcKeiUcwkNo.equals(dataMap4.get(EKK0341A010CBSMsg1List.SVC_KEI_UCWK_NO)))
					{
						// ●返却処理（異動予約リスト(サービス契約内訳)）
						ArrayList tmpIdoSvcKeiUcwkList = (ArrayList)inMap.get(OUT_IDO_RSV_SVC_KEI_UCWK_LIST);
						if (tmpIdoSvcKeiUcwkList == null)
						{
							tmpIdoSvcKeiUcwkList = new ArrayList();
						}
						tmpIdoSvcKeiUcwkList.add(dataMap3);
					}
				}

				// ●返却処理異動予約リスト(サービス契約)
				ArrayList tmpIdoSvcKeiList = (ArrayList)inMap.get(OUT_IDO_RSV_SVC_KEI_LIST);
				if (tmpIdoSvcKeiList == null)
				{
					tmpIdoSvcKeiList = new ArrayList();
				}
				tmpIdoSvcKeiList.add(dataMap3);
			}
		}

		// 終了ログ
		outDebugLog("----- getStbTakhaiRsvData End  -----");
		return param;
	}

	/**
	 * 上りマッピング項目設定(機器提供サービス契約一覧照会（予約）)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0341B021(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws RequestParameterException
	{
		// 機能コード設定(1:一覧)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// ＫＥＹ＿サービス契約番号
		inMap.put(EKK0341B021CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);

	}

	/**
	 * 上りマッピング項目設定(機器提供サービス契約一意照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @param geneAddDtm 世代登録年月日時分秒
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0341A010(IRequestParameterReadWrite param, String fixedText, String kktkSvcKeiNo, String geneAddDtm)
			throws RequestParameterException
	{
		// 機能コード設定(1:一覧)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// ＫＥＹ＿機器提供サービス契約番号
		inMap.put(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		// ＫＥＹ＿世代登録年月日時分秒
		inMap.put(EKK0341A010CBSMsg.KEY_GENE_ADD_DTM, geneAddDtm);

	}

	/**
	 * 上りマッピング項目設定(異動予約一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapEKK1681B001(IRequestParameterReadWrite param, String fixedText, String kktkSvcKeiNo) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定(1:一覧照会)
		JFUBPCommon.setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK1681B001CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null)); // 運用日
		// ＫＥＹ＿異動予約状態コード
		inMap.put(EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, JFUStrConst.CD01168_00); // "00":未反映
		// ＫＥＹ＿ソート項目Ｎｏ
		inMap.put(EKK1681B001CBSMsg.KEY_SORT_ITEM_NO, SORT_IDO_RSV_NO); // "1":異動予約番号

		// ＫＥＹ＿機器提供サービス契約番号
		inMap.put(EKK1681B001CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);

	}

	/**
	 * 上りマッピング項目設定(異動予約一意照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param idoRsvNo 異動予約番号
	 * @throws RequestParameterException
	 */
	private void setInMapEKK1681A010(IRequestParameterReadWrite param, String fixedText, String idoRsvNo) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定(1:一覧照会)
		JFUBPCommon.setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿異動予約番号
		inMap.put(EKK1681A010CBSMsg.KEY_IDO_RSV_NO, idoRsvNo);

	}

	/**
	 * チェック処理（共通処理）
	 * 
	 * <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 obj 出力内容
	 */
	private void outDebugLog(Object obj)
	{
		// デバッグ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), obj, null, null, null);
	}
}
