/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：DKSV0158_DKSV0158OPDBMapper
*	ソースファイル名：DKSV0158_DKSV0158OPDBMapper.java
*	作成者			：FJ
*	日付			：2014年09月26日
*＜機能概要＞
*	BP（出荷型番変更初期表示）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v10.00.00	2014/09/26	FJ）宇野	ANK-2042-00-00対応
*
**********************************************************************/
package eo.web.webview.mapping;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.web.webview.DKW06402SF.DKW06402SFConst;

/**
 * DataBean-BPマッピングをする。
 * 
 */
public class DKSV0158_DKSV0158OPDBMapper {
	
	/**
	 * コンストラクタ
	 */
	public DKSV0158_DKSV0158OPDBMapper(){
	}
	
	// ---------------手修正-----------------------------------------------------------------------------
	// MAX日付
	private String MAX_DATE = "20991231";
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：出荷型番変更
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setDKSV015801CC(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_code", func_code);
		
		// 型確定条件一覧照会マップ
		HashMap<String, Object> mdlFixJknIcrnMap = new HashMap<String, Object>();
		// 販売種別コード
		mdlFixJknIcrnMap.put("key_hambai_sbt_cd", bean[0].sendMessageString(DKW06402SFConst.HAMBAI_SBT_CD, X31CWebConst.DATABEAN_GET_VALUE));
		// 型確定パターン
		mdlFixJknIcrnMap.put("key_mdl_fix_ptn", bean[0].sendMessageString(DKW06402SFConst.MDL_FIX_PATTAN_CD, X31CWebConst.DATABEAN_GET_VALUE));
		
		// 宅内機器型式（型確定パターン）一覧照会マップ
		HashMap<String, Object> tkkikiMdlMdlFixPtnMap = new HashMap<String, Object>();
		//
		tkkikiMdlMdlFixPtnMap.put("key_mdl_fix_ptn", bean[0].sendMessageString(DKW06402SFConst.MDL_FIX_PATTAN_CD, X31CWebConst.DATABEAN_GET_VALUE));
		
		parentMap.put("mdlFixJknIcrnMap", mdlFixJknIcrnMap);
		
		parentMap.put("tkkikiMdlMdlFixPtnMap", tkkikiMdlMdlFixPtnMap);
		
		outputMap.put("DKSV015801CC", parentMap);
		
		return outputMap;
	}
	// ---------------手修正-----------------------------------------------------------------------------

	/**
	 * 下りマッピング
	 * @param bean　[0]：出荷型番変更
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getDKSV015801CC(X31SDataBeanAccess[] bean, HashMap outputMap){

		HashMap parentMap = null;
		if(outputMap.containsKey("DKSV015801CC")){
			parentMap = (HashMap)outputMap.get("DKSV015801CC");
		}

		ArrayList childList = null;
		
		// 型確定パターン
		String mdl_fix_cd = bean[0].sendMessageString(DKW06402SFConst.MDL_FIX_PATTAN_CD, X31CWebConst.DATABEAN_GET_VALUE);

		X31SDataBeanAccessArray shka_mdl_info_list = bean[0].getDataBeanArray(DKW06402SFConst.SHKA_MDL_INFO_LIST);
		childList = null;
		
		HashMap mdlFixJknIcrnMap = (HashMap) parentMap.get("mdlFixJknIcrnMap");
		
		if(shka_mdl_info_list != null && parentMap != null && mdlFixJknIcrnMap != null && mdlFixJknIcrnMap.containsKey("EDK0291B030CBSMsg1List")){
			
			childList = (ArrayList)mdlFixJknIcrnMap.get("EDK0291B030CBSMsg1List");
			
			HashMap tkkikiMdlMdlFixPtnMap = (HashMap)parentMap.get("tkkikiMdlMdlFixPtnMap");
			
			ArrayList dataList = new ArrayList();
			ArrayList keyList = new ArrayList();
			ArrayList updList = new ArrayList();
			
			String chk_disp_jun = "";
			int count = 0;
			HashMap dataMap = null;
			boolean flg = false;
			
			// ---------------手修正-----------------------------------------------------------------------------
			for(int i = 0; i < childList.size(); i++){
				
				
				HashMap childMap = (HashMap)childList.get(i);
				
				if (childMap != null) {
					
					String disp_jun = (String)childMap.get("dsp_jun");
					
					
					// 最終レコードの場合
					if (i == childList.size() - 1)
					{
						if (((HashMap)childList.get(i-1)).get("dsp_jun").equals(disp_jun)) 
						{
							count++;
							keyList.add((String)childMap.get("tkkiki_mdl_cd_fix_no"));
							updList.add((String)childMap.get("upd_dtm"));
							
							if (chkScreenData(mdl_fix_cd, count, (String)childMap.get("tendymd")))
							{
								dataMap = new HashMap();
								dataMap.put("taknkiki_model_cd", (String)childMap.get("taknkiki_model_cd"));
								dataMap.put("cd_div_nm", (String)childMap.get("cd_div_nm"));
								dataMap.put("zaiko_rt", (String)childMap.get("zaiko_rt"));
								dataMap.put("dsp_jun", (String)childMap.get("dsp_jun"));
								
								dataMap.put("keyList", keyList);
								dataMap.put("updList", updList);
								
								dataList.add(dataMap);
								keyList = new ArrayList();
								updList = new ArrayList();
							}
						}
					}
					else
					{
						// 表示順が同じデータをキーリストと更新年月日リストに格納する
						if (i == 0) {
							count++;
							
							keyList.add((String)childMap.get("tkkiki_mdl_cd_fix_no"));
							updList.add((String)childMap.get("upd_dtm"));
						}
						else if (i > 0 && (flg == true || ((HashMap)childList.get(i-1)).get("dsp_jun").equals(disp_jun))) {
							count++;
							
							keyList.add((String)childMap.get("tkkiki_mdl_cd_fix_no"));
							updList.add((String)childMap.get("upd_dtm"));
							flg = false;
						}
						else
						{
							
							HashMap childMap2 = (HashMap)childList.get(i-1);
							
							// 一覧の表示するか判定する
							if (chkScreenData(mdl_fix_cd, count, (String)childMap2.get("tendymd")))
							{
								dataMap = new HashMap();
								dataMap.put("taknkiki_model_cd", (String)childMap2.get("taknkiki_model_cd"));
								dataMap.put("cd_div_nm", (String)childMap2.get("cd_div_nm"));
								dataMap.put("zaiko_rt", (String)childMap2.get("zaiko_rt"));
								dataMap.put("dsp_jun", (String)childMap2.get("dsp_jun"));
								
								dataMap.put("keyList", keyList);
								dataMap.put("updList", updList);
								
								dataList.add(dataMap);
								keyList = new ArrayList();
								updList = new ArrayList();
								count = 0;
								
								keyList.add((String)childMap.get("tkkiki_mdl_cd_fix_no"));
								updList.add((String)childMap.get("upd_dtm"));
								count++;
							}
							flg = true;
						}
					}
				}
			}
			
			// 一覧データの設定処理を行う
			for(int i = 0; i < dataList.size(); i++){
				
				X31SDataBeanAccess subbean = null;
				if (shka_mdl_info_list.getCount() -1 >= i){
					subbean = shka_mdl_info_list.getDataBean(i);
				} else {
					subbean = shka_mdl_info_list.addDataBean();
				}
				HashMap childMap = (HashMap)dataList.get(i);
				if (subbean == null) {
					continue;
				}
				
				if (childMap != null) {
					// 基本設定値型番
					subbean.sendMessageString(DKW06402SFConst.L_BASE_MDL_CD_01, X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("taknkiki_model_cd"));
					// メーカー名
					subbean.sendMessageString(DKW06402SFConst.L_MAKER_NM_01, X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("cd_div_nm"));
					// ＨＤＤ容量
					subbean.sendMessageString(DKW06402SFConst.L_HDD_NM_01, X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("cd_div_nm"));
					// 比率
					subbean.sendMessageString(DKW06402SFConst.L_BASE_HIRT_01, X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("zaiko_rt"));
					
					// 宅内機器型式コード確定条件番号リスト（更新時のキー項目）
					getResult(DKW06402SFConst.L_TKKIKI_MDL_CD_FIX_NO_LIST_01, subbean, (ArrayList)childMap.get("keyList"));
					
					// 更新年月日時分秒リスト（更新時の更新年月日時分秒）
					getResult(DKW06402SFConst.L_UPD_DTM_LIST_01, subbean, (ArrayList)childMap.get("updList"));
					
					// 変更設定値宅内機器型式コードリスト（プルダウンリストのデータを設定する）
					if(tkkikiMdlMdlFixPtnMap.containsKey("tkkikiMdlList"))
					{
						setResultPullDown(subbean, childMap, tkkikiMdlMdlFixPtnMap);
					}
				} else {
					subbean.sendMessageString(DKW06402SFConst.L_BASE_MDL_CD_01, X31CWebConst.DATABEAN_SET_VALUE, new String());
					subbean.sendMessageString(DKW06402SFConst.L_MAKER_NM_01, X31CWebConst.DATABEAN_SET_VALUE, new String());
					subbean.sendMessageString(DKW06402SFConst.L_HDD_NM_01, X31CWebConst.DATABEAN_SET_VALUE, new String());
					subbean.sendMessageString(DKW06402SFConst.L_BASE_HIRT_01, X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				
				// 背景色
				if ((i+1) % 2 == 0)
				{
					// 偶数行
					subbean.sendMessageString(DKW06402SFConst.L_COLLAR_01, X31CWebConst.DATABEAN_SET_VALUE, "even");
				} else {
					// 奇数行
					subbean.sendMessageString(DKW06402SFConst.L_COLLAR_01, X31CWebConst.DATABEAN_SET_VALUE, "odd");
				}
			}
		}
		// ---------------手修正-----------------------------------------------------------------------------
		
		return bean;
	}
	
	/**
	 * 下りマッピング
	 * @param bean      出荷型番情報リスト
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	private void getResult(String dataDescription, X31SDataBeanAccess bean, ArrayList dataList){

		for(int i = 0; i < dataList.size(); i++){

			// 
			bean.sendMessageString(dataDescription, X31CWebConst.DATABEAN_ADD_VALUE, (String)dataList.get(i));
		}
	}
	
	/**
	 * 変更設定値宅内機器型式コードリストのマッピング
	 * @param bean      出荷型番情報リスト
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	private void setResultPullDown(X31SDataBeanAccess bean, HashMap map, HashMap tkkikiMdlMap){
		
		if(tkkikiMdlMap.containsKey("tkkikiMdlList"))
		{
			
			int cnt = 1;
			ArrayList mdllist = (ArrayList)tkkikiMdlMap.get("tkkikiMdlList");
			
			for (int i = 0; i < mdllist.size(); i++){
				
				HashMap mdlMap = (HashMap)mdllist.get(i);
				// 表示順が同じ場合設定する
				if(((String)map.get("dsp_jun")).equals((String)mdlMap.get("dsp_jun")))
				{
					
					ArrayList mdllist2 = (ArrayList)mdlMap.get("EZM0411B070CBSMsg1List");
					
					for(int j = 0; j < mdllist2.size(); j++)
					{
						String mdl_cd = (String)((HashMap)mdllist2.get(j)).get("taknkiki_model");
						
						if (mdl_cd == null)
						{
							mdl_cd = "";
							bean.sendMessageString(DKW06402SFConst.I_CHNG_MDL_CD_LIST_01, X31CWebConst.DATABEAN_ADD_VALUE, mdl_cd);
							bean.sendMessageString(DKW06402SFConst.I_CHNG_MDL_NM_LIST_01, X31CWebConst.DATABEAN_ADD_VALUE, mdl_cd);
						}
						else
						{
							bean.sendMessageString(DKW06402SFConst.I_CHNG_MDL_CD_LIST_01, X31CWebConst.DATABEAN_ADD_VALUE, mdl_cd);
							bean.sendMessageString(DKW06402SFConst.I_CHNG_MDL_NM_LIST_01, X31CWebConst.DATABEAN_ADD_VALUE, (cnt - 1) + "." + mdl_cd);
						}
						
						cnt++;
					}
				}
			}
		}
	}
	
	
	/**
	 * 一覧画面に表示できるレコードか判定する
	 * @param  code  型確定パターンコード
	 * @param  cnt   データ件数
	 * @param  ymd   適用終了年月日
	 * 
	 */
	private boolean chkScreenData(String code, int cnt, String ymd)
	{
		// 型確定パターンコードが「3」または「5」の場合
		if ("3".equals(code) || "5".equals(code))
		{
			// データ件数が６件の場合「true」を返却
			if (cnt == 6)
			{
				if(MAX_DATE.equals(ymd))
				{
					return true;
				}
			}
		}
		else
		{
			// データ件数が３件の場合「true」を返却
			if (cnt == 3)
			{
				if(MAX_DATE.equals(ymd))
				{
					return true;
				}
			}
		}
		
		return false;
	}

}