/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：FUSV0176_FUSV0176OPDBMapper
*	ソースファイル名：FUSV0176_FUSV0176OPDBMapper.java
*	作成者			：FJ
*	日付			：2011年10月25日
*＜機能概要＞
*	BP（STB情報一覧取得(K-CAT)）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/25	FJ）        新規作成
*	v8.00.00	2014/01/10	FJ）大島   【ANK-1796-00-00】STB提供メニュー拡充(機器追加・価格改定)A
*   v39.00.00   2018/09/12	FJ) 岡井   【ANK-3488-00-00】4KSTB（ACASチップ）導入対応
*   v52.00      2021/01/15  FJ）美濃原 【ANK-3991-00-00】STB新機種追加(2021年4月〜)
*   v53.00      2021/06/07  FJ）岡井   【ANK-4066-00-00】新4KSTBの申込可能条件変更
**********************************************************************/
package eo.web.webview.mapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JFUStrConst;
import eo.web.webview.FUW00108SF.FUW00108SFConst;
import eo.web.webview.common.JFUWebCommon;

/**
 * DataBean-BPマッピングをする。
 * 
 */
public class FUSV0176_FUSV0176OPDBMapper
{

	/** リスト名 */
	private static final String EKK0791B501CBSMsg1List = "EKK0791B501CBSMsg1List";
	/** 料金コースコード */
	private static final String KEY_PCRS_CD = "pcrs_cd";
	/** 料金プランコード */
	private static final String KEY_PPLAN_CD = "pplan_cd";
	/** 料金コース名 */
	private static final String KEY_PCRS_NM = "pcrs_nm";
	/** 機能コード */
	private static final String KEY_FUNC_CODE = "func_code";
	/** 基準年月日 */
	private static final String KEY_KJNYMD = "key_kjnymd";
	/** 出力マップキー */
	private static final String KEY_OUTPUT_MAP = "FUSV017601SC";
	/** プロパティファイル文字列 */
	private static final String PATTERN = "pattern_";
	/** プロパティファイル文字列 */
	private static final String DISP_START = "disp_start_";
	/** プロパティファイル文字列 */
	private static final String DISP_END = "disp_end_";
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";

	/** プロパティファイル取得文字列（グループID指定）STB */
	private static final String settingPattern = "DISPSETTING/SETTING[@screenId='FUW00108']/DISPTEXT[@groupid='stbPattern']";

	/** プロパティファイル取得文字列（グループID指定）STBの並べ替え用*/
	private static final String settingLine = "DISPSETTING/SETTING[@screenId='FUW00108']/DISPTEXT[@groupid='settingLine']";
	/** 料金コースコード毎にフロントから出荷する予定の宅内機器型式コード（設定無しの場合はブランク）*/
	private static final String PATH_STB_MDL_ITEM_NM = "DISPSETTING/COMMONSETTING/DISPTEXT[@groupid='STB_PCRS_MDL']";

	/**
	 * コンストラクタ
	 */
	public FUSV0176_FUSV0176OPDBMapper()
	{
	}

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：ｅｏ光テレビ入力
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setFUSV017601SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{

		if (bean == null)
		{
			return null;
		}

		if (bean.length != 1)
		{
			return null;
		}

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put(KEY_FUNC_CODE, func_code);

		// 基準日 → STB情報一覧取得（ＫＣＮ）マップ.ＫＥＹ＿基準年月日
		parentMap.put(KEY_KJNYMD, bean[0].sendMessageString(FUW00108SFConst.STDARDYMD, X31CWebConst.DATABEAN_GET_VALUE));

		outputMap.put(KEY_OUTPUT_MAP, parentMap);

		return outputMap;
	}

	/**
	 * 下りマッピング
	 * @param bean　[0]：ｅｏ光テレビ入力
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getFUSV017601SC(X31SDataBeanAccess[] bean, HashMap outputMap, X31BWebBusinessLogic bl) throws Exception
	{

		//----------------------------------------------------------------
		// 手動マッピング
		//----------------------------------------------------------------

		// コード名称管理一覧照会SC 実行結果の設定
		HashMap parentMap = null;
		if (outputMap.containsKey(KEY_OUTPUT_MAP))
		{
			parentMap = (HashMap)outputMap.get(KEY_OUTPUT_MAP);
		}

		ArrayList childList = (ArrayList)parentMap.get(EKK0791B501CBSMsg1List);

		if (null == childList)
		{
			return bean;
		}

		if (0 == childList.size())
		{
			return bean;
		}

		// プロパティ情報の取得処理・設定処理

		// ANK-4066-00-00 DEL START
		// ＶＯＮＵ４Ｋ−ＳＴＢ登録可否
		//String hoyuVonu4kstbKh = bean[0].sendMessageString(FUW00108SFConst.HOYU_VONU_4KSTB_KH, X31CWebConst.DATABEAN_GET_VALUE);
		// ANK-4066-00-00 DEL END

		// STB情報取得
		Map<String, String> servicenameMap = JFUWebCommon.getDispItemsAsMap(settingPattern, QUERY_ATTR_NAME);
		String strOpeDate = JFUWebCommon.getOpeDate(bl, null);
		ArrayList<String> setList = new ArrayList<String>();

		for (int k = 0; k < servicenameMap.size(); k++)
		{
			String key = PATTERN + String.valueOf(k + 1);
			String staYmd = servicenameMap.get(DISP_START + String.valueOf(k + 1));
			String endYmd = servicenameMap.get(DISP_END + String.valueOf(k + 1));
			String pcrsCd = servicenameMap.get(key);

			// ANK-4066-00-00 DEL START
			// ＶＯＮＵ４Ｋ−ＳＴＢ登録可否が「0：否」の場合、4KSTBは対象外とする。
			//if(JFUStrConst.CD00003_0.equals(hoyuVonu4kstbKh) && JFUStrConst.PCRS_CD_STB_4K.contains(pcrsCd))
			//{
			//	continue;
			//}
			// ANK-4066-00-00 DEL END

			if (JFUWebCommon.isNull(staYmd) || JFUWebCommon.isNull(endYmd))
			{
				// 日付指定が未設定のは、除外対象外とする。
				continue;
			}
			else if (Integer.parseInt(staYmd) <= Integer.parseInt(strOpeDate) && Integer.parseInt(endYmd) >= Integer.parseInt(strOpeDate))
			{
				// 運用日付が開始日以降、終了日以前の場合のみ追加対象とする。
				setList.add(servicenameMap.get(key));
			}
			else
			{
				// 運用日付が開始日以前、終了日以後の場合は追加対象外とする。
				continue;
			}

		}

		// 利用場所形態の並べ替え用情報取得
		Map<String, String> rowMap = JFUWebCommon.getDispItemsAsMap(settingLine, QUERY_ATTR_NAME);
		// ■STB名称の表示切替フラグ
		boolean stbNameFlg = JFUWebCommon.getStbNameFlg(strOpeDate);
		// ■料金コースコード毎にフロントから出荷する予定の宅内機器型式コード（設定無しの場合はブランク）
		Map<String, String> shukkaModelMap = JFUWebCommon.getDispItemsAsMap(PATH_STB_MDL_ITEM_NM, QUERY_ATTR_NAME);

		HashMap<String, String> lineMap = new HashMap<String, String>();
		ArrayList<String> lineList = new ArrayList<String>();

		for (int k = 0; k < rowMap.size(); k++)
		{
			String key = "pattern_" + String.valueOf(k + 1);

			lineList.add((String)rowMap.get(key));
			// 値をセットする。(取得値 , k ←配列順になるため)
			lineMap.put((String)rowMap.get(key), String.valueOf(k));
		}

		ArrayList sortList = new ArrayList();

		// プロパティファイルの数だけ空配列を作成
		for (int n = 0; n < rowMap.size(); n++)
		{
			HashMap karaMap = null;
			sortList.add(karaMap);
		}

		for (int j = 0; j < childList.size(); j++)
		{
			HashMap cchildMap = (HashMap)childList.get(j);

			// プロパティファイルの利用場所形態とコード名称が一致した場合
			if (setList.contains(((String)cchildMap.get("pcrs_cd"))))
			{
				for (int m = 0; m < lineList.size(); m++)
				{
					// プロパティファイルの利用場所形態の並べ替え用とコード値が一致した場合
					if (lineList.get(m).equals(((String)cchildMap.get("pcrs_cd"))))
					{
						// プロパティファイルの指定した場所にデータをセットする
						sortList.set(m, cchildMap);
					}
				}
			}
		}

		// テレビチューナー1機器選択リスト
		X31SDataBeanAccessArray listTvTunerKiki1 = bean[0].getDataBeanArray(FUW00108SFConst.TV_TUNER_KIKI_1_LIST);
		X31SDataBeanAccess tvTunerKiki1 = listTvTunerKiki1.getDataBean(0);
		// テレビチューナー2機器選択リスト
		X31SDataBeanAccessArray listTvTunerKiki2 = bean[0].getDataBeanArray(FUW00108SFConst.TV_TUNER_KIKI_2_LIST);
		X31SDataBeanAccess tvTunerKiki2 = listTvTunerKiki2.getDataBean(0);
		// テレビチューナー3機器選択リスト
		X31SDataBeanAccessArray listTvTunerKiki3 = bean[0].getDataBeanArray(FUW00108SFConst.TV_TUNER_KIKI_3_LIST);
		X31SDataBeanAccess tvTunerKiki3 = listTvTunerKiki3.getDataBean(0);
		// テレビチューナー4機器選択リスト
		X31SDataBeanAccessArray listTvTunerKiki4 = bean[0].getDataBeanArray(FUW00108SFConst.TV_TUNER_KIKI_4_LIST);
		X31SDataBeanAccess tvTunerKiki4 = listTvTunerKiki4.getDataBean(0);
		// テレビチューナー5機器選択リスト
		X31SDataBeanAccessArray listTvTunerKiki5 = bean[0].getDataBeanArray(FUW00108SFConst.TV_TUNER_KIKI_5_LIST);
		X31SDataBeanAccess tvTunerKiki5 = listTvTunerKiki5.getDataBean(0);

		if (null != listTvTunerKiki1 && null != parentMap && parentMap.containsKey(EKK0791B501CBSMsg1List))
		{

			for (int i = 0; i < sortList.size(); i++)
			{

				HashMap childMap = (HashMap)sortList.get(i);

				if (childMap != null)
				{
					String pcrsCd = (String)childMap.get(KEY_PCRS_CD);
					String taknkikiModelCd = shukkaModelMap.get(pcrsCd);
					setKikiList(tvTunerKiki1, childMap, stbNameFlg, taknkikiModelCd);
					setKikiList(tvTunerKiki2, childMap, stbNameFlg, taknkikiModelCd);
					setKikiList(tvTunerKiki3, childMap, stbNameFlg, taknkikiModelCd);
					setKikiList(tvTunerKiki4, childMap, stbNameFlg, taknkikiModelCd);
					setKikiList(tvTunerKiki5, childMap, stbNameFlg, taknkikiModelCd);
				}
			}
		}
		//----------------------------------------------------------------

		return bean;

	}

	//----------------------------------------------------------------
	// 手動マッピング用
	//----------------------------------------------------------------

	/**
	 * 機器リストの設定
	 * <br>
	 * @param tvTunerKiki	チューナー機器Bean
	 * @param childMap		料金コースSTB一覧照会SC 実行結果
	 * @param stbNameFlg STBの表示名称切替フラグ
	 * @param taknkikiModelCd	宅内機器型式コードを設定
	 */
	@SuppressWarnings("unchecked")
	private void setKikiList(X31SDataBeanAccess tvTunerKiki, HashMap childMap, boolean stbNameFlg, String taknkikiModelCd)
	{
		// テレビチューナー機器選択.チューナーコードリスト ← 料金コースSTB一覧照会マップ.料金コースSTB一覧照会明細.料金コースコード + 料金プランコード
		if (null != childMap)
		{
			tvTunerKiki.sendMessageString(FUW00108SFConst.TUNER_CODE_LIST_01, X31CWebConst.DATABEAN_ADD_VALUE, (String)childMap.get(KEY_PCRS_CD)
					+ (String)childMap.get(KEY_PPLAN_CD));
		}
		else
		{
			tvTunerKiki.sendMessageString(FUW00108SFConst.TUNER_CODE_LIST_01, X31CWebConst.DATABEAN_ADD_VALUE, "");
		}
		// テレビチューナー機器選択.チューナー名称リスト ← 料金コースSTB一覧照会マップ.料金コースSTB一覧照会明細.料金コース名
		if (null != childMap)
		{
			// ■『チューナー名称（宅内機器型式コード）』
			String stbName = JFUWebCommon.getDisplayStbName(stbNameFlg, (String)childMap.get(KEY_PCRS_NM), taknkikiModelCd);
			tvTunerKiki.sendMessageString(FUW00108SFConst.TUNER_NAME_LIST_01, X31CWebConst.DATABEAN_ADD_VALUE, stbName);
		}
		else
		{
			tvTunerKiki.sendMessageString(FUW00108SFConst.TUNER_NAME_LIST_01, X31CWebConst.DATABEAN_ADD_VALUE, "");
		}
	}

	//----------------------------------------------------------------

}