/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUGetStbTknKikiCC
*   ソースファイル名：JFUGetStbTknKikiCC.java
*   作成者          ：富士通
*   日付            ：2012年11月15日
*＜機能概要＞
*   STB宅内機器取得コンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00		2012/11/15	 FJ) 岡井	 【ANK-1224-00-00】機器の料金コース追加等について
*   v6.00		2013/11/27	 FJ) 文元	 【IT2-2013-0000831】保有している宅内機器型式がまだ決まっていない場合の考慮追加
*   v39.00      2018/11/29   FJ) 美濃原  【OM-2018-0001176】既契約のSTB選択リスト作成条件をHDD容量コードに変更
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
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;

/**
 * STB宅内機器取得コンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUGetStbTknKikiCC extends JFUBaseNetChgCommonCC
{

	/** 項目ID：宅内機器種別コード */
	private static final String IN_TAKNKIKI_SBT_CD = "taknkiki_sbt_cd";
	/** 項目ID：料金コースコード */
	private static final String IN_PCRS_CD = "pcrs_cd";
	/** 項目ID：現在使用中ＳＴＢの宅内機器型式コード */
	private static final String IN_HOYU_TAKNKIKI_MODEL_CD = "hoyu_taknkiki_model_cd";
	/** 項目ID：現在使用中ＳＴＢの宅内機器型式コード */
	private static final String IN_HOYU_HDD_CAPA_CD = "hoyu_hdd_capa_cd";
	/** 項目ID：宅内機器型式コード */
	private static final String IN_TAKNKIKI_MODEL_CD = "taknkiki_model_cd";
	/** 項目ID：ＨＤＤ容量コード */
	private static final String IN_HDD_CAPA_CD = "hdd_capa_cd";
	/** 項目ID：機器リスト */
	private static final String IN_KIKI_LIST = "kiki_list";
	/** 項目ID：機能コード */
	private static final String IN_FUNC_CODE = "func_code";

	/** 項目ID：STB機器リスト(グレード考慮：内部リスト) */
	private static final String OUT_CHG_STB_LIST = "chg_stb_list";
	/** 項目ID：STB機器リスト(グレード考慮) */
	private static final String OUT_CHG_STB_KIKI_LIST = "chg_stb_kiki_list";
	/** 項目ID：STB機器リスト(全て) */
	private static final String OUT_ADD_STB_KIKI_LIST = "add_stb_kiki_list";

	/**
	 * STB宅内機器取得処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 例外
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// 結果マップ
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		// ユーザデータ取得
		HashMap<?, ?> childMap = (HashMap<?, ?>)param.getData(fixedText);

		// IN項目を結果マップに退避
		resultMap = getInParams(childMap, resultMap);

		// リクエストパラメータに設定
		param.setData(fixedText, resultMap);

		// ●宅内機器型式リスト取得処理(STB用)呼出(グレード考慮)
		resultMap = getChgTgKikiList(handle, param, fixedText, resultMap);

		// ●宅内機器型式リスト取得処理(STB用)呼出(全て)
		resultMap = getAddTgKikiList(handle, param, fixedText, resultMap);

		// 一度ユーザデータを削除し、再度設定する
		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 childMap ユーザデータマップ
	 * @param resultMap 結果マップ
	 * @return 結果マップ
	 */
	private HashMap<String, Object> getInParams(HashMap childMap, HashMap resultMap)
	{
		// 宅内機器種別コード(固定値：A0(STB))
		resultMap.put(IN_TAKNKIKI_SBT_CD, JFUStrConst.CD01262_A0);
		// 料金コースコード
		resultMap.put(IN_PCRS_CD, (String)childMap.get(IN_PCRS_CD));
		// 機能コード
		resultMap.put(IN_FUNC_CODE, (String)childMap.get(IN_FUNC_CODE));

		// 機器リスト
		if(childMap.containsKey(IN_KIKI_LIST))
		{
			resultMap.put(IN_KIKI_LIST, (ArrayList)childMap.get(IN_KIKI_LIST));
		}

		return resultMap;
	}

	/**
	 * 宅内機器型式リスト取得処理(グレード考慮)です。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @return 結果マップ
	 * @throws Exception
	 */
	private HashMap getChgTgKikiList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// 機器リスト
		ArrayList kikiList = (ArrayList)resultMap.get(IN_KIKI_LIST);
		// 機能コード
		String chkFuncCd = (String)resultMap.get(IN_FUNC_CODE);
		if (chkFuncCd == null || chkFuncCd.length() == 0)
		{
			// 機能コードが未設定の場合、
			// デフォルト：１（チェック＆登録）として扱う。
			// 「chkFuncCd」は、宅内機器型式リスト取得処理(STB用)呼出(グレード考慮)の
			// 処理判定に使用するものである
			// （後続の部品「JFUBPCommon.getTaknkikiStbList」の処理にて、
			// 「EKK1861B501」のinパラメータ設定時、nullの場合はデフォルト"1"を設定している箇所と関連)
			chkFuncCd = JPCModelConstant.FUNC_CD_1;
		}
		

		// 結果格納リスト
		ArrayList resList = new ArrayList();

		for (int i = 0; i < kikiList.size(); i++)
		{
			HashMap childMap = (HashMap)kikiList.get(i);
			HashMap kikiMap = new HashMap();
			List<HashMap> chgStbKikiList =  new ArrayList();
			
			// 宅内機器型式コード、ＨＤＤ容量コードを設定
			String taknkikiModelCd = (String)childMap.get(IN_TAKNKIKI_MODEL_CD);
			String hddCapaCd = (String)childMap.get(IN_HDD_CAPA_CD);
			
			// 処理判定
			if (!doTaknkikiStbList(chkFuncCd, taknkikiModelCd))
			{
				// 空リストを入れて読み飛ばす
				kikiMap.put(OUT_CHG_STB_LIST, chgStbKikiList);
				resList.add(kikiMap);
				continue;
			}
			
			resultMap.put(IN_HOYU_TAKNKIKI_MODEL_CD, taknkikiModelCd);
			resultMap.put(IN_HOYU_HDD_CAPA_CD, hddCapaCd);

			// 宅内機器型式リスト取得処理(STB用)呼出(グレード考慮)
			chgStbKikiList = JFUBPCommon.getTaknkikiStbList(handle, param, fixedText);
	
			// マップとリストに設定
			kikiMap.put(OUT_CHG_STB_LIST, chgStbKikiList);
			resList.add(kikiMap);
		}

		// 宅内機器型式リスト取得処理(STB用)の結果を結果マップに設定
		resultMap.put(OUT_CHG_STB_KIKI_LIST, resList);

		return resultMap;
	}

	/**
	 * 宅内機器型式リスト取得処理(全て)です。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @return 結果マップ
	 * @throws Exception
	 */
	private HashMap getAddTgKikiList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// 宅内機器型式コードを削除
		resultMap.remove(IN_HOYU_TAKNKIKI_MODEL_CD);
		// ＨＤＤ容量コードを削除
		resultMap.remove(IN_HOYU_HDD_CAPA_CD);
		// 機能コードを削除(指定しない)
		resultMap.remove(IN_FUNC_CODE);

		// 宅内機器型式リスト取得処理(STB用)呼出(全て)
		List<HashMap> allStbKikiList = JFUBPCommon.getTaknkikiStbList(handle, param, fixedText);

		// 宅内機器型式リスト取得処理(STB用)の結果を結果マップに設定
		resultMap.put(OUT_ADD_STB_KIKI_LIST, allStbKikiList);

		return resultMap;
	}
	
	/**
	 * 宅内機器型式リスト取得処理(STB用)呼出(グレード考慮)処理判定
	 * 
	 * <br>
	 * @param chkFuncCd チェック用機能コード
	 * @param taknkikiModelCd 宅内機器型式コード
	 * @return true:処理対象 false:処理対象外
	 */
	private boolean doTaknkikiStbList(String chkFuncCd, String taknkikiModelCd)
	{
		// 機能コードが"2"の場合の処理判定
		if (JPCModelConstant.FUNC_CD_2.equals(chkFuncCd))
		{
			if (taknkikiModelCd == null || taknkikiModelCd.length() == 0)
			{
				// 機能コード'2'(保有しているSTBに関する情報取得)の時
				// (保有している)宅内機器型式コードが未設定(まだ機器がきまっていない(受付済〜照査済)
				// の場合、処理対象外
				return false;
			}
		}

		return true;
	}
}