/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：FUSV0242_FUSV0242OPDBMapper
*	ソースファイル名：FUSV0242_FUSV0242OPDBMapper.java
*	作成者			：富士通
*	日付			：2012年07月05日
*＜機能概要＞
*	BP（引越しナビ住所変更申込照会(電話)）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00		2012/07/05	FJ)岡井		【ANK-0274-00-00】Web受付引越し受付：新規作成
*
**********************************************************************/
package eo.web.webview.mapping;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x33.beans.X33VDataTypeList;

import eo.common.constant.JFUStrConst;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.FUW10401SF.FUW10401SFConst;
import eo.web.webview.common.JFUWebCommon;

/**
 * DataBean-BPマッピングをします。
 * <p>
 * <BR>
 * @author 富士通
 */

public class FUSV0242_FUSV0242OPDBMapper
{
	// ■ SC
	/** FUSV024201SC */
	private static final String FUSV024201SC = "FUSV024201SC";
	/** FUSV024202SC */
	private static final String FUSV024202SC = "FUSV024202SC";

	// ■CC
	/** FUSV024201CC */
	private static final String FUSV024201CC = "FUSV024201CC";

	// ■ 明細(SC)
	/** 通信事業者一覧照会明細 */
	private static final String ETU0051B010CBSMSG1LIST = "ETU0051B010CBSMsg1List";
	/** 異動予約一覧照会明細 */
	private static final String EKK1681B001CBSMSG1LIST = "EKK1681B001CBSMsg1List";

	// ■ 明細(CC)
	/** eo光電話サービス契約内訳一覧照会(整理番号)明細 */
	private static final String JFUEOTELSVCKEIUWSHOKAILIST = "JFUeoTelSvcKeiUwShokaiList";
	/** オプションサービス契約＜電話＞一覧照会（サービス契約内訳番号）明細 */
	private static final String OPSVCKEITELICRNLIST = "OPSVCKEITELICRNLIST";

	// ■ 項目ID
	/** 機能コード */
	private static final String FUNC_CODE = "func_code";
	/** 整理番号 */
	private static final String SEIRI_NO = "seiri_no";
	/** ＫＥＹ＿サービス契約番号 */
	private static final String KEY_SVC_KEI_NO = "key_svc_kei_no";
	/** 電話番号 */
	private static final String TELNO = "telno";
	/** サービス契約内訳番号 */
	private static final String SVC_KEI_UCWK_NO = "svc_kei_ucwk_no";
	/** 通信事業者コード */
	private static final String TSJGS_CD = "tsjgs_cd";
	/** 通信事業者名 */
	private static final String TSJGS_NM = "tsjgs_nm";
	/** 新料金グループコード */
	private static final String NEW_PRC_GRP_CD = "new_prc_grp_cd";
	/** 新料金コースコード */
	private static final String NEW_PCRS_CD = "new_pcrs_cd";
	/** 新料金プランコード */
	private static final String NEW_PPLAN_CD = "new_pplan_cd";
	/** オプションサービスコード */
	private static final String OP_SVC_CD = "op_svc_cd";

	// ■FUDispDefinition
	/** 定義取得パス 文言 */
	private static final String PATH_MONGON = "DISPSETTING/SETTING[@screenId='FUW10405']/DISPTEXT[@groupid='MONGON']";
	/** プロパティファイル取得文字列 */
	private static final String PATH_TSJGS_ICRN = "DISPSETTING/SETTING[@screenId='#']/DISPTEXT[@groupid='TSJGS_ICRN']";
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";

	// ■定義取得ID
	/** 文言取得キー */
	private static final String GET_MSKM_MONGON_STR = "001";
	/** 文言取得キー */
	private static final String GET_NASHI_MONGON_STR = "002";

	/**
	 * コンストラクタです。
	 */
	public FUSV0242_FUSV0242OPDBMapper()
	{
	}

	/**
	 * eo光電話サービス契約内訳一覧照会(整理番号)CCの上りマッピング処理です。
	 * @param bean データBean
	 * @param outputMap アウトマップ
	 * @return HashMap 結果マップ
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> setFUSV024201CC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 整理番号
		parentMap.put(SEIRI_NO, bean[2].sendMessageString(CommonInfoCFConst.SEIRI_NO_23, X31CWebConst.DATABEAN_GET_VALUE));

		outputMap.put(FUSV024201CC, parentMap);

		return outputMap;
	}

	/**
	 * 通信事業者一覧照会SCの上りマッピング処理です。
	 * @param bean データBean
	 * @param outputMap アウトマップ
	 * @param func_code 機能コード
	 * @return HashMap 結果マップ
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> setFUSV024201SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 機能コード
		parentMap.put(FUNC_CODE, func_code);

		// 明細
		ArrayList arrayList = new ArrayList<HashMap>();
		HashMap detailMap = new HashMap();
		arrayList.add(detailMap);
		parentMap.put(ETU0051B010CBSMSG1LIST, arrayList);

		outputMap.put(FUSV024201SC, parentMap);

		return outputMap;
	}

	/**
	 * 異動予約一覧照会SCの上りマッピング処理です。
	 * @param bean データBean
	 * @param outputMap アウトマップ
	 * @param func_code 機能コード
	 * @return HashMap 結果マップ
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> setFUSV024202SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 機能コード
		parentMap.put(FUNC_CODE, func_code);
		// サービス契約番号
		parentMap.put(KEY_SVC_KEI_NO, bean[2].sendMessageString(CommonInfoCFConst.SVC_KEI_NO_23, X31CWebConst.DATABEAN_GET_VALUE));

		// 明細
		ArrayList arrayList = new ArrayList<HashMap>();
		HashMap detailMap = new HashMap();
		arrayList.add(detailMap);
		parentMap.put(EKK1681B001CBSMSG1LIST, arrayList);

		outputMap.put(FUSV024202SC, parentMap);

		return outputMap;
	}

	/**
	 * eo光電話サービス契約内訳一覧照会(整理番号)CCの下りマッピング処理です。
	 *
	 * <br>
	 * @param bean データBean
	 * @param outputMap アウトマップ
	 * @param flg 2番号契約フラグ
	 * @return データBean
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess getFUSV024201CC(X31SDataBeanAccess bean, HashMap outputMap, Boolean flg) throws Exception
	{
		HashMap parentMap = null;
		ArrayList childList = null;
		ArrayList opSvcKeiList = null;

		// CCマップ取得
		if (outputMap.containsKey(FUSV024201CC))
		{
			parentMap = (HashMap)outputMap.get(FUSV024201CC);
		}

		// 明細取得
		if(parentMap != null && parentMap.size() > 0)
		{
			childList = (ArrayList)parentMap.get(JFUEOTELSVCKEIUWSHOKAILIST);
			opSvcKeiList = (ArrayList)parentMap.get(OPSVCKEITELICRNLIST);
		}

		// 利用中サービス契約情報作成処理
		// 文言マップ取得
		Map<String, String> mongonMap = JFUWebCommon.getDispItemsAsMap(PATH_MONGON, QUERY_ATTR_NAME);

		if(childList != null && childList.size() == 2 && !flg)
		{
			// ■1番号＆2番号有り、異動予約存在無し

			X33VDataTypeList useSvcList = new X33VDataTypeList(childList.size());
			X31SDataBeanAccessArray useSvcBeanArray = bean.getDataBeanArray(FUW10401SFConst.TEL_USE_SVC_LIST);
			useSvcBeanArray.clearArray();

			for (int i = 0; i < childList.size(); i++)
			{
				HashMap childMap = (HashMap)childList.get(i);

				// 電話番号
				String telNo = (String)childMap.get(TELNO);
				// サービス契約内訳番号
				String svcKeiUwNo = (String)childMap.get(SVC_KEI_UCWK_NO);

				// Beanを追加し、追加したBeanを取得する
				useSvcBeanArray.addDataBean();
				X31SDataBeanAccess useSvcDataBean = useSvcBeanArray.getDataBean(i);

				// 電話番号
				useSvcDataBean.sendMessageString(FUW10401SFConst.NOW_TEL_NO_02, X31CWebConst.DATABEAN_SET_VALUE,
						telNo);
				// 電話番号識別コード
				useSvcDataBean.sendMessageString(FUW10401SFConst.TELNO_SBT_CD_02, X31CWebConst.DATABEAN_SET_VALUE,
						String.valueOf(i + 1));
				// サービス契約内訳番号
				useSvcDataBean.sendMessageString(FUW10401SFConst.TEL_SVC_UW_NO_02, X31CWebConst.DATABEAN_SET_VALUE,
						svcKeiUwNo);

				if(opSvcKeiList != null && opSvcKeiList.size() > 0)
				{
					for (int j = 0; j < ((ArrayList)((HashMap)opSvcKeiList.get(i)).get("opSvcKeiTelIcrnList")).size(); j++)
					{
						HashMap opSvcKeiMap = (HashMap)((ArrayList)((HashMap)opSvcKeiList.get(i)).get("opSvcKeiTelIcrnList")).get(j);
						String opSvcCd = String.valueOf(opSvcKeiMap.get(OP_SVC_CD));
						
						// 既存申込状態フラグ（発信者番号通知）
						if (JFUStrConst.CD00136_B022.equals(opSvcCd)) 
						{
							useSvcDataBean.sendMessageBoolean(FUW10401SFConst.KZN_MSKM_HASSHINSHA_FLG_02, X31CWebConst.DATABEAN_SET_VALUE, true);
						}
					}
				}
				useSvcList.add(useSvcDataBean);
			}

			// 利用中サービス契約情報あり
			bean.sendMessageBoolean(FUW10401SFConst.TEL_USE_SVC_FLG, X31CWebConst.DATABEAN_SET_VALUE, true);
		}
		else if(childList != null && childList.size() == 1 && !flg)
		{
			// ■1番号有り、2番号無し、異動予約存在無し

			int listSize = childList.size() + 1;

			X33VDataTypeList useSvcList = new X33VDataTypeList(listSize);
			X31SDataBeanAccessArray useSvcBeanArray = bean.getDataBeanArray(FUW10401SFConst.TEL_USE_SVC_LIST);
			useSvcBeanArray.clearArray();

			for (int i = 0; i < listSize; i++)
			{
				HashMap childMap = null;

				if(i == 0)
				{
					childMap = (HashMap)childList.get(i);
				}

				// 電話番号
				String telNo = JFUStrConst.EMPTY;
				// サービス契約内訳番号
				String svcKeiUwNo = JFUStrConst.EMPTY;

				if(i == 0)
				{
					telNo = (String)childMap.get(TELNO);
					svcKeiUwNo = (String)childMap.get(SVC_KEI_UCWK_NO);
				}
				else if(i == 1)
				{
					telNo = mongonMap.get(GET_NASHI_MONGON_STR);
				}

				// Beanを追加し、追加したBeanを取得する
				useSvcBeanArray.addDataBean();
				X31SDataBeanAccess useSvcDataBean = useSvcBeanArray.getDataBean(i);

				// 電話番号
				useSvcDataBean.sendMessageString(FUW10401SFConst.NOW_TEL_NO_02, X31CWebConst.DATABEAN_SET_VALUE,
						telNo);
				// 電話番号識別コード
				useSvcDataBean.sendMessageString(FUW10401SFConst.TELNO_SBT_CD_02, X31CWebConst.DATABEAN_SET_VALUE,
						String.valueOf(i + 1));
				// サービス契約内訳番号
				useSvcDataBean.sendMessageString(FUW10401SFConst.TEL_SVC_UW_NO_02, X31CWebConst.DATABEAN_SET_VALUE,
						svcKeiUwNo);

				
				if (i == 0)
				{
					if(opSvcKeiList != null && opSvcKeiList.size() > 0)
					{
						for (int j = 0; j < ((ArrayList)((HashMap)opSvcKeiList.get(i)).get("opSvcKeiTelIcrnList")).size(); j++)
						{
							HashMap opSvcKeiMap = (HashMap)((ArrayList)((HashMap)opSvcKeiList.get(i)).get("opSvcKeiTelIcrnList")).get(j);
							String opSvcCd = String.valueOf(opSvcKeiMap.get(OP_SVC_CD));
							
							// 既存申込状態フラグ（発信者番号通知）
							if (JFUStrConst.CD00136_B022.equals(opSvcCd)) 
							{
								useSvcDataBean.sendMessageBoolean(FUW10401SFConst.KZN_MSKM_HASSHINSHA_FLG_02, X31CWebConst.DATABEAN_SET_VALUE, true);
							}
						}
					}
				}

				
				useSvcList.add(useSvcDataBean);
			}

			// 利用中サービス契約情報あり
			bean.sendMessageBoolean(FUW10401SFConst.TEL_USE_SVC_FLG, X31CWebConst.DATABEAN_SET_VALUE, true);
		}
		else if(childList != null && childList.size() > 0 && flg)
		{
			// ■1番号有り、2番号無し、異動予約存在有り

			int listSize = childList.size() + 1;

			X33VDataTypeList useSvcList = new X33VDataTypeList(listSize);
			X31SDataBeanAccessArray useSvcBeanArray = bean.getDataBeanArray(FUW10401SFConst.TEL_USE_SVC_LIST);
			useSvcBeanArray.clearArray();

			for (int i = 0; i < listSize; i++)
			{
				HashMap childMap = null;

				if(i == 0)
				{
					childMap = (HashMap)childList.get(i);
				}

				// 電話番号
				String telNo = JFUStrConst.EMPTY;
				// サービス契約内訳番号
				String svcKeiUwNo = JFUStrConst.EMPTY;

				if(i == 0)
				{
					telNo = (String)childMap.get(TELNO);
					svcKeiUwNo = (String)childMap.get(SVC_KEI_UCWK_NO);
				}
				else if(i == 1)
				{
					telNo = mongonMap.get(GET_MSKM_MONGON_STR);
				}

				// Beanを追加し、追加したBeanを取得する
				useSvcBeanArray.addDataBean();
				X31SDataBeanAccess useSvcDataBean = useSvcBeanArray.getDataBean(i);

				// 電話番号
				useSvcDataBean.sendMessageString(FUW10401SFConst.NOW_TEL_NO_02, X31CWebConst.DATABEAN_SET_VALUE,
						telNo);
				// 電話番号識別コード
				useSvcDataBean.sendMessageString(FUW10401SFConst.TELNO_SBT_CD_02, X31CWebConst.DATABEAN_SET_VALUE,
						String.valueOf(i + 1));
				// サービス契約内訳番号
				useSvcDataBean.sendMessageString(FUW10401SFConst.TEL_SVC_UW_NO_02, X31CWebConst.DATABEAN_SET_VALUE,
						svcKeiUwNo);
				
				if(opSvcKeiList != null && opSvcKeiList.size() > 0)
				{
					for (int j = 0; j < ((ArrayList)((HashMap)opSvcKeiList.get(i)).get("opSvcKeiTelIcrnList")).size(); j++)
					{
						HashMap opSvcKeiMap = (HashMap)((ArrayList)((HashMap)opSvcKeiList.get(i)).get("opSvcKeiTelIcrnList")).get(j);
						String opSvcCd = String.valueOf(opSvcKeiMap.get(OP_SVC_CD));
						
						// 既存申込状態フラグ（発信者番号通知）
						if (JFUStrConst.CD00136_B022.equals(opSvcCd)) 
						{
							useSvcDataBean.sendMessageBoolean(FUW10401SFConst.KZN_MSKM_HASSHINSHA_FLG_02, X31CWebConst.DATABEAN_SET_VALUE, true);
						}
					}
				}

				useSvcList.add(useSvcDataBean);
			}
			
			// 利用中サービス契約情報あり
			bean.sendMessageBoolean(FUW10401SFConst.TEL_USE_SVC_FLG, X31CWebConst.DATABEAN_SET_VALUE, true);
		}
		else
		{
			// ■契約無し

			int listSize = 2;

			X33VDataTypeList useSvcList = new X33VDataTypeList(listSize);
			X31SDataBeanAccessArray useSvcBeanArray = bean.getDataBeanArray(FUW10401SFConst.TEL_USE_SVC_LIST);
			useSvcBeanArray.clearArray();

			for (int i = 0; i < listSize; i++)
			{
				// 電話番号
				String telNo = mongonMap.get(GET_NASHI_MONGON_STR);
				// サービス契約内訳番号
				String svcKeiUwNo = JFUStrConst.EMPTY;

				// Beanを追加し、追加したBeanを取得する
				useSvcBeanArray.addDataBean();
				X31SDataBeanAccess useSvcDataBean = useSvcBeanArray.getDataBean(i);

				// 電話番号
				useSvcDataBean.sendMessageString(FUW10401SFConst.NOW_TEL_NO_02, X31CWebConst.DATABEAN_SET_VALUE,
						telNo);
				// 電話番号識別コード
				useSvcDataBean.sendMessageString(FUW10401SFConst.TELNO_SBT_CD_02, X31CWebConst.DATABEAN_SET_VALUE,
						String.valueOf(i + 1));
				// サービス契約内訳番号
				useSvcDataBean.sendMessageString(FUW10401SFConst.TEL_SVC_UW_NO_02, X31CWebConst.DATABEAN_SET_VALUE,
						svcKeiUwNo);

				useSvcList.add(useSvcDataBean);
			}

			// 利用中サービス契約情報なし
			bean.sendMessageBoolean(FUW10401SFConst.TEL_USE_SVC_FLG, X31CWebConst.DATABEAN_SET_VALUE, false);
		}

		return bean;
	}

	/**
	 * 通信事業者一覧照会SCの下りマッピング処理です。
	 *
	 * <br>
	 * @param bean データBean
	 * @param outputMap アウトマップ
	 * @return データBean
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess getFUSV024201SC(X31SDataBeanAccess bean, HashMap outputMap) throws Exception
	{
		// ●通信事業者一覧プロパティ取得処理
		Map<String, String> tsjgsIcrneMap = JFUWebCommon.getDispItemsAsMap(PATH_TSJGS_ICRN, QUERY_ATTR_NAME);
		Set<String> tsjgsIcrneSet = tsjgsIcrneMap.keySet();
		tsjgsIcrneSet = new TreeSet(tsjgsIcrneSet);
		Iterator<String> itr = tsjgsIcrneSet.iterator();
		
		if(tsjgsIcrneMap !=null && tsjgsIcrneMap.size() > 0)
		{
			// プルダウンリスト作成
			X33VDataTypeList jigyoshaList = new X33VDataTypeList(tsjgsIcrneMap.size());
			X31SDataBeanAccessArray jigyoshaBeanArray = bean.getDataBeanArray(FUW10401SFConst.TEL_JIGYOSHA_LIST);
			jigyoshaBeanArray.clearArray();
			int i = 0;
			while(itr.hasNext())
			{
				String tsjgsCdStr = itr.next();
				String tsjgsNmStr = tsjgsIcrneMap.get(tsjgsCdStr);
				String tsjgsNm[] = tsjgsNmStr.split(",");
				
				// Beanを追加し、追加したBeanを取得する
				jigyoshaBeanArray.addDataBean();
				X31SDataBeanAccess jigyoshaDataBean = jigyoshaBeanArray.getDataBean(i);

				// 通信事業者コード
				jigyoshaDataBean.sendMessageString(FUW10401SFConst.JIGYOSHA_CD_03, X31CWebConst.DATABEAN_SET_VALUE, tsjgsCdStr);
				// 通信事業者名
				jigyoshaDataBean.sendMessageString(FUW10401SFConst.JIGYOSHA_NM_03, X31CWebConst.DATABEAN_SET_VALUE, tsjgsNm[1]);

				jigyoshaList.add(jigyoshaDataBean);
				i++;
			}
		}

		return bean;
	}

	/**
	 * 異動予約一覧照会SCの下りマッピング処理です。
	 *
	 * <br>
	 * @param bean データBean
	 * @param outputMap アウトマップ
	 * @return データBean
	 */
	@SuppressWarnings("unchecked")
	public Boolean getFUSV024202SC(X31SDataBeanAccess bean, HashMap outputMap)
	{
		HashMap parentMap = null;
		ArrayList childList = null;
		Boolean bool = false;

		// SCマップ取得
		if (outputMap.containsKey(FUSV024202SC))
		{
			parentMap = (HashMap)outputMap.get(FUSV024202SC);
		}

		// 明細取得
		if(parentMap != null && parentMap.size() > 0)
		{
			childList = (ArrayList)parentMap.get(EKK1681B001CBSMSG1LIST);
		}

		// 存在チェック処理
		for (int i = 0; i < childList.size(); i++)
		{
			HashMap childMap = (HashMap)childList.get(i);

			// 2番号(ホームタイプ)が存在する場合
			if(JFUStrConst.CD00133_10.equals(childMap.get(NEW_PRC_GRP_CD))
					&& JFUStrConst.CD00134_A32.equals(childMap.get(NEW_PCRS_CD)))
			{
				bool = true;
				break;
			}
		}

		return bool;
	}
}