/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：KKSV1050_KKSV1050OPDBMapper
*	ソースファイル名：KKSV1050_KKSV1050OPDBMapper.java
*	作成者			：GDC)J.Zabala
*	日付			：2024年12月12日
*＜機能概要＞
*	BP（CSコース用オプションチャンネル登録・更新画面）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v74.00.00	2024/12/12	GDC)J.Zabala		【ANK-4592-00-00】テレビ新コース（スカパー用）導入対応
*
**********************************************************************/
package eo.web.webview.mapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.common.util.JPCDateChecker;
import eo.web.webview.KKW22901SF.KKW22901SFConst;



/**
 * DataBean-BPマッピングをする。
 * 
 */
public class KKSV1050_KKSV1050OPDBMapper {
	
	/** 処理コード オプション登録・解約 */
	private static final String SHORI_CD_OP_ADD_DSL = "6";
	
	/** CC実行時用固定文字列 */
	private static final String KEY_CC_FIXED_TEXT = "JKKCsCrsOpchAddUpdShokaiCC";
	
	/** スカパー連携ステータス : 予約中オプション */
	private static final String[] RSVCU_OP_STAT_LIST = {"010", "020", "090", "110", "120", "190"};
	
	/** スカパー連携ステータス : 予約中オプション */
	private static final String[] RSVCU_OP_STAT_LIST_OPN = {"010", "020", "090"};
	
	/** スカパー連携ステータス : 鍵開け済みオプション */
	private static final String[] KEYOPN_ZM_OP_STAT_LIST = {"100"};
	
	/** 相手システムID (バックヤード) */
	private static final String AITE_SYSID_BKYRD = "3";
	
	/** 変更区分 : 登録 */
	private static final String CHG_DIV_REG = "1";
	
	/** 変更区分 : 削除 */
	private static final String CHG_DIV_DEL = "2";
	
	/** 変更区分 : 取消 */
	private static final String CHG_DIV_CNL = "3";
	
	/** スカパー適用基準年月日区分 : 即時  */
	private static final String APLY_STDARDYMD_DIV_1 = "1";
	
	/** スカパー適用基準年月日区分 : 次月  */
	private static final String APLY_STDARDYMD_DIV_2 = "2";
	
	/** スカパー適用基準年月日区分 : 次々月  */
	private static final String APLY_STDARDYMD_DIV_3 = "3";
	
	/** 利用開始日指定 : 次月  */
	private static final String STDARDYMD_DIV_1 = "1";
	
	/** 鍵開け予約中 */
	private static final String RSV_UNLOCK = "鍵開け予約中";
	
	/** 鍵閉め予約中 */
	private static final String UNLOCKED = "鍵閉め予約中";
	
	/**
	 * コンストラクタ
	 */
	public KKSV1050_KKSV1050OPDBMapper(){
	}
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：CSコース用オプションチャンネル登録・更新
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV105001CC(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("func_cd", func_code);
		// 処理コード
		parentMap.put("shori_cd", SHORI_CD_OP_ADD_DSL);
		// サービス契約番号
		parentMap.put("svc_kei_no", bean[0].sendMessageString(KKW22901SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
		// 相手システムID
		parentMap.put("aite_sysid", AITE_SYSID_BKYRD);
		// CAS-ID
		parentMap.put("cascd_no", bean[0].sendMessageString(KKW22901SFConst.CAS_CARD_NO, X31CWebConst.DATABEAN_GET_VALUE));
		
		// 初期表示の場合
		if (JPCModelConstant.FUNC_CD_3.equals(func_code))
		{
			// オプション更新リスト
			parentMap.put("op_upd_list",  new ArrayList<Map<String,Object>>());
		}
		else
		{
			// オプション更新リスト
			List<Map<String, Object>> opUpdList = getOpUpdList(bean[0]);
			parentMap.put("op_upd_list", opUpdList);
			// 異動区分
			parentMap.put("ido_div", bean[0].sendMessageString(KKW22901SFConst.IDO_DIV, X31CWebConst.DATABEAN_GET_VALUE));
			// 異動理由明細
			List<HashMap<String, Object>> idoRsnList = new ArrayList<HashMap<String, Object>>();
			HashMap<String, Object> childMap = new HashMap<String, Object>();
			childMap.put("ido_rsn_cd", bean[0].sendMessageString(KKW22901SFConst.IDO_RSN_CD, X31CWebConst.DATABEAN_GET_VALUE));
			idoRsnList.add(childMap);
			parentMap.put("EKK1091D010CBSMsg1List", idoRsnList);
		}
		
		outputMap.put(KEY_CC_FIXED_TEXT, parentMap);
						
		return outputMap;
	}
	
	/**
	 * 下りマッピングをする
	 * @param bean　[0]：CSコース用オプションチャンネル登録・更新
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getKKSV105001CC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		HashMap parentMap = null;
		if(outputMap.containsKey(KEY_CC_FIXED_TEXT)){
			parentMap = (HashMap)outputMap.get(KEY_CC_FIXED_TEXT);
		}
		
		// 運用日付
		String opeDate = bean[0].sendMessageString(KKW22901SFConst.OPE_DATE, X31CWebConst.DATABEAN_GET_VALUE);
		// 予約中オプション
		X31SDataBeanAccessArray rsvcu_op_list = bean[0].getDataBeanArray(KKW22901SFConst.RSVCU_OP_LIST);
		rsvcu_op_list.clearArray();
		// 鍵開け済みオプション
		X31SDataBeanAccessArray keyopn_zm_op_list = bean[0].getDataBeanArray(KKW22901SFConst.KEYOPN_ZM_OP_LIST);
		keyopn_zm_op_list.clearArray();
		// 鍵開け可能オプション
		X31SDataBeanAccessArray keyopn_psb_op_list = bean[0].getDataBeanArray(KKW22901SFConst.KEYOPN_PSB_OP_LIST);
		keyopn_psb_op_list.clearArray();
		
		if (parentMap != null && parentMap.containsKey("op_list"))
		{
			// オプションリスト
			List<HashMap<String, Object>> opList = (List<HashMap<String, Object>>) parentMap.get("op_list");
			
			if (opList != null && opList.size() > 0)
			{
				for (HashMap<String, Object> opMap : opList)
				{
					// スカパー連携ステータス
					String stat = (String) opMap.get("sptv_rnk_stat");
					// 鍵開け日付
					String keyopnYmd = (String) opMap.get("keyopn_ymd");
					// 鍵閉め日付
					String keyclsYmd = (String) opMap.get("keycls_ymd");
					
					// 鍵開け年月日が運用日より未来日となっているオプション
					if (!JKKStringUtil.isNullBlank(keyopnYmd) && JPCDateChecker.isFutureDate(keyopnYmd, opeDate, "0"))
					{
						// DataBeanの構造と合わないため、追記
						X31SDataBeanAccess subbean = rsvcu_op_list.addDataBean();
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_CHANNEL_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_cd_nm"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_SPTV_RNK_STAT, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("sptv_rnk_stat"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_SPTV_RNK_STAT_NM, X31CWebConst.DATABEAN_SET_VALUE,  RSV_UNLOCK);
						subbean.sendMessageString(KKW22901SFConst.RSVCU_KEYOPN_YMD, X31CWebConst.DATABEAN_SET_VALUE, keyopnYmd);
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_kei_no"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_cd"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_STAT, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_stat"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_STAT_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_stat_nm"));
					}
					// 鍵閉め年月日が運用日より未来日となっているオプション
					else if (!JKKStringUtil.isNullBlank(keyclsYmd) && JPCDateChecker.isFutureDate(keyclsYmd, opeDate, "0"))
					{
						// DataBeanの構造と合わないため、追記
						X31SDataBeanAccess subbean = rsvcu_op_list.addDataBean();
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_CHANNEL_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_cd_nm"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_SPTV_RNK_STAT, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("sptv_rnk_stat"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_SPTV_RNK_STAT_NM, X31CWebConst.DATABEAN_SET_VALUE,  UNLOCKED);
						subbean.sendMessageString(KKW22901SFConst.RSVCU_KEYOPN_YMD, X31CWebConst.DATABEAN_SET_VALUE, keyclsYmd);
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_kei_no"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_cd"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_STAT, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_stat"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_STAT_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_stat_nm"));
					}
					// 予約中オプション
					else if (inStatusList(RSVCU_OP_STAT_LIST, stat))
					{
						// DataBeanの構造と合わないため、追記
						X31SDataBeanAccess subbean = rsvcu_op_list.addDataBean();
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_CHANNEL_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_cd_nm"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_SPTV_RNK_STAT, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("sptv_rnk_stat"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_SPTV_RNK_STAT_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("sptv_rnk_stat_nm"));
						if (inStatusList(RSVCU_OP_STAT_LIST_OPN, stat))
						{
							subbean.sendMessageString(KKW22901SFConst.RSVCU_KEYOPN_YMD, X31CWebConst.DATABEAN_SET_VALUE, keyopnYmd);

						}
						else
						{
							subbean.sendMessageString(KKW22901SFConst.RSVCU_KEYOPN_YMD, X31CWebConst.DATABEAN_SET_VALUE, keyclsYmd);
						}
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_kei_no"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_cd"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_STAT, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_stat"));
						subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_STAT_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_stat_nm"));
					}
					// 鍵開け済みオプション
					else if (inStatusList(KEYOPN_ZM_OP_STAT_LIST, stat))
					{
						// DataBeanの構造と合わないため、追記
						X31SDataBeanAccess subbean = keyopn_zm_op_list.addDataBean();
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_OP_CHANNEL_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_cd_nm"));
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_USE_STAYMD, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("svc_staymd"));
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_OP_SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_kei_no"));
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_OP_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_cd"));
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_OP_CHRG_STAYMD, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("svc_chrg_staymd"));
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_OP_SVC_KEI_STAT, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_stat"));
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_OP_SVC_KEI_STAT_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_stat_nm"));
					}
					// 鍵開け可能オプション
					else
					{
						// DataBeanの構造と合わないため、追記
						X31SDataBeanAccess subbean = keyopn_psb_op_list.addDataBean();
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_PSB_OP_CHANNEL_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_cd_nm"));
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_PSB_USE_STAYMD_RADIO, X31CWebConst.DATABEAN_SET_VALUE, STDARDYMD_DIV_1);
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_PSB_BIKO, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_biko"));
						subbean.sendMessageString(KKW22901SFConst.KEYOPN_PSB_OP_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, (String)opMap.get("op_svc_cd"));

					}
				}
			}
		}
		
		return bean;
	}
	
	private boolean inStatusList(String[] statList, String status)
	{
		if (statList == null || statList.length == 0) 
		{
			return false;
		}
		if (null == status)
		{
			return false;
		}
		for (String stat : statList)
		{
			if (stat.equals(status))
			{
				return true;
			}
		}
		return false;
	}
	
	private List<Map<String, Object>> getOpUpdList(X31SDataBeanAccess serviceBean)
	{
		List<Map<String, Object>> opUpdList = new ArrayList<Map<String,Object>>();
		
		// 運用日付
		String opeDate = serviceBean.sendMessageString(KKW22901SFConst.OPE_DATE, X31CWebConst.DATABEAN_GET_VALUE);
		
		// 予約中オプション
		X31SDataBeanAccessArray rsvOpBeanList = serviceBean.getDataBeanArray(KKW22901SFConst.RSVCU_OP_LIST);
		for (int i = 0; i < rsvOpBeanList.getCount(); i++)
		{
			X31SDataBeanAccess subbean = rsvOpBeanList.getDataBean(i);
			boolean cls = subbean.sendMessageBoolean(KKW22901SFConst.CLS, X31CWebConst.DATABEAN_GET_VALUE);
			if (cls)
			{
				Map<String, Object> subMap = new HashMap<String, Object>();
				subMap.put("op_svc_kei_no", subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("op_svc_kei_stat", subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_KEI_STAT, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("op_svc_cd", subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_SVC_CD, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("op_svc_cd_nm", subbean.sendMessageString(KKW22901SFConst.RSVCU_OP_CHANNEL_NM, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("chg_div", CHG_DIV_CNL);
				subMap.put("sptv_aply_stdardymd_div", APLY_STDARDYMD_DIV_1);
				opUpdList.add(subMap);
			}
		}
		
		// 鍵開け済みオプション
		X31SDataBeanAccessArray zmOpBeanList = serviceBean.getDataBeanArray(KKW22901SFConst.KEYOPN_ZM_OP_LIST);
		for (int i = 0; i < zmOpBeanList.getCount(); i++)
		{
			X31SDataBeanAccess subbean = zmOpBeanList.getDataBean(i);
			boolean dsl = subbean.sendMessageBoolean(KKW22901SFConst.DSL, X31CWebConst.DATABEAN_GET_VALUE);
			if (dsl)
			{
				Map<String, Object> subMap = new HashMap<String, Object>();
				subMap.put("op_svc_kei_no", subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_OP_SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("op_svc_kei_stat", subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_OP_SVC_KEI_STAT, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("op_svc_cd", subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_OP_SVC_CD, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("op_svc_cd_nm", subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_OP_CHANNEL_NM, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("chg_div", CHG_DIV_DEL);
				subMap.put("use_endymd", subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_USE_ENDYMD, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("svc_chrg_endymd", subbean.sendMessageString(KKW22901SFConst.KEYOPN_ZM_CHRG_ENDYMD, X31CWebConst.DATABEAN_GET_VALUE));
				opUpdList.add(subMap);
			}
		}
		
		// 鍵開け可能オプション
		X31SDataBeanAccessArray psbOpBeanList = serviceBean.getDataBeanArray(KKW22901SFConst.KEYOPN_PSB_OP_LIST);
		for (int i = 0; i < psbOpBeanList.getCount(); i++)
		{
			X31SDataBeanAccess subbean = psbOpBeanList.getDataBean(i);
			boolean mskm = subbean.sendMessageBoolean(KKW22901SFConst.MSKM, X31CWebConst.DATABEAN_GET_VALUE);
			if (mskm)
			{
				Map<String, Object> subMap = new HashMap<String, Object>();
				subMap.put("op_svc_cd", subbean.sendMessageString(KKW22901SFConst.KEYOPN_PSB_OP_SVC_CD, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("op_svc_cd_nm", subbean.sendMessageString(KKW22901SFConst.KEYOPN_PSB_OP_CHANNEL_NM, X31CWebConst.DATABEAN_GET_VALUE));
				subMap.put("chg_div", CHG_DIV_REG);
				String beanAplyStdardYmdDiv = subbean.sendMessageString(KKW22901SFConst.KEYOPN_PSB_USE_STAYMD, X31CWebConst.DATABEAN_GET_VALUE);
				if ("即時".equals(beanAplyStdardYmdDiv)) 
				{
					subMap.put("sptv_aply_stdardymd_div", APLY_STDARDYMD_DIV_1);
				}
				else if ("次月より".equals(beanAplyStdardYmdDiv))
				{
					subMap.put("sptv_aply_stdardymd_div", APLY_STDARDYMD_DIV_2);
				}
				else if ("次々月より".equals(beanAplyStdardYmdDiv))
				{
					subMap.put("sptv_aply_stdardymd_div", APLY_STDARDYMD_DIV_3);
				}
				opUpdList.add(subMap);
			}
		}
		
		return opUpdList;
	}
	
}
