/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：FUSV0298_FUSV0298OPDBMapper
*	ソースファイル名：FUSV0298_FUSV0298OPDBMapper.java
*	作成者			：富士通
*	日付			：2016年09月21日
*＜機能概要＞
*	BP（ご契約者情報入力(初期表示)）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v27.00		2016/09/21	FJ)岡井		【ANK-2987-00-00】メールリーチ率向上 新規作成
*	v27.00		2016/12/06	FJ)岡井		【OM-2016-0002470】ＥＦＯデータ集計でシステムエラーとなっている
*	v35.00		2017/10/13	FJ)岡井		【ANK-3225-00-00】未成年mineoマスタユーザのeo申込について
**********************************************************************/
package eo.web.webview.mapping;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

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.JFUStrConst;
import eo.web.webview.FUW00110SF.FUW00110SFConst;
import eo.web.webview.common.JFUWebCommon;

/**
 * DataBean-BPマッピングをします。
 *
 * <br>
 * @author 富士通
 */
public class FUSV0298_FUSV0298OPDBMapper
{

	// ■SC＆CC
	/** FUSV029801CC */
	private static final String FUSV029801CC = "FUSV029801CC";
	/** FUSV029801SC */
	private static final String FUSV029801SC = "FUSV029801SC";

	// ■項目キー
	/** 機能コード */
	private static final String FUNC_CD = "func_cd";
	/** SYSID */
	private static final String SYSID = "sysid";
	/** オプトインメール設定フラグ */
	private static final String OPTINM_SETTEI_FLG = "optinm_settei_flg";
	/** オプトインメールリスト */
	private static final String OPTINM_LIST = "optinm_list";
	/** オプトインメール番号 */
	private static final String OPTINM_NO = "optinm_no";
	/** オプトインメール名 */
	private static final String OPTINM_NM = "optinm_nm";
	/** 初期値フラグ */
	private static final String SHK_VALUE_FLG = "shk_value_flg";
	/** コード名称管理コード区分一覧照会明細 */
	private static final String EZM0171B012CBSMSG1LIST = "EZM0171B012CBSMsg1List";
	/** コード区分 */
	private static final String CD_DIV = "cd_div";
	/** コード区分名 */
	private static final String CD_DIV_NM = "cd_div_nm";

	// ■その他
	/** オプトインメール設定フラグ 1：設定済 */
	private static final String OPTINM_SETTEI_FLG_1 = "1";
	/** メール受信設定表示フラグ 0：非表示 */
	private static final String MAIL_JUSIN_SETTEI_DSP_FLG_0 = "0";
	/** メール受信設定表示フラグ 1：表示 */
	private static final String MAIL_JUSIN_SETTEI_DSP_FLG_1 = "1";
	/** 初期値フラグ 1：デフォルトチェック */
	private static final String SHK_VALUE_FLG_1 = "1";

	// ■プロパティファイル
	/** 定義取得パス 対象外オプトインメール番号 */
	private static final String PATH_TG_OUT_OPTINM_NO = "DISPSETTING/SETTING[@screenId='FUW00110']/DISPTEXT[@groupid='TG_OUT_OPTINM_NO']";
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";
	/** ID：オプトインメール番号 */
	private static final String ID_OPTINM_NO = "OPTINM_NO";

	/**
	 * コンストラクタ
	 */
	public FUSV0298_FUSV0298OPDBMapper()
	{
	}

	/**
	 * オプトインメール情報取得CCの上りマッピングをします。
	 *
	 * <br>
	 * @param bean [0]：共有フォームビーン [1]：サービスフォームBean
	 * @param outputMap
	 * @param func_code 機能コード
	 * @return HashMap 結果
	 */
	@SuppressWarnings("unchecked")
	public HashMap setFUSV029801CC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 機能コード
		parentMap.put(FUNC_CD, func_code);
		// SYSID
		parentMap.put(SYSID, JFUStrConst.EMPTY);

		outputMap.put(FUSV029801CC, parentMap);

		return outputMap;
	}

	/**
	 * コード名称管理コード区分一覧照会SCの上りマッピングをします。
	 *
	 * <br>
	 * @param bean [0]：共有フォームビーン [1]：サービスフォームBean
	 * @param outputMap
	 * @param func_code 機能コード
	 * @return HashMap 結果
	 */
	@SuppressWarnings("unchecked")
	public HashMap setFUSV029801SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 機能コード
		parentMap.put(FUNC_CD, func_code);

		outputMap.put(FUSV029801SC, parentMap);

		return outputMap;
	}

	/**
	 * オプトインメール情報取得CCの下りマッピングをします。
	 * 
	 * @param bean bean [0]：共有フォームビーン [1]：サービスフォームBean
	 * @param outputMap 結果
	 * @return X31SDataBeanAccess
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getFUSV029801CC(X31SDataBeanAccess[] bean, HashMap outputMap) throws Exception
	{

		HashMap parentMap = null;
		if (outputMap.containsKey(FUSV029801CC))
		{
			parentMap = (HashMap)outputMap.get(FUSV029801CC);
		}

		if (parentMap == null || parentMap.size() == 0)
		{
			// 情報が取得できていない場合
			bean[1].sendMessageString(FUW00110SFConst.MAIL_JUSIN_SETTEI_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE,
					MAIL_JUSIN_SETTEI_DSP_FLG_0);
			return bean;
		}

		// 対象外オプトインメール番号リスト
		List<String> tgOutOptinmNoList = getTgOutOptinmNoList();
		DEBUG_LOG.info("※対象外オプトインメール番号リスト：" + tgOutOptinmNoList);

		// メール受信設定表示フラグ
		if (parentMap.containsKey(OPTINM_SETTEI_FLG))
		{
			if (!OPTINM_SETTEI_FLG_1.equals((String)parentMap.get(OPTINM_SETTEI_FLG)))
			{
				// オプトインメール設定フラグが「1：設定済」以外の場合
				bean[1].sendMessageString(FUW00110SFConst.MAIL_JUSIN_SETTEI_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE,
						MAIL_JUSIN_SETTEI_DSP_FLG_1);
			}
			else
			{
				// オプトインメール設定フラグが「1：設定済」の場合
				bean[1].sendMessageString(FUW00110SFConst.MAIL_JUSIN_SETTEI_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE,
						MAIL_JUSIN_SETTEI_DSP_FLG_0);
			}
		}

		// 個人メール受信設定＆法人メール受信設定
		if (parentMap.containsKey(OPTINM_LIST) && (ArrayList)parentMap.get(OPTINM_LIST) != null)
		{
			// 個人メール受信設定
			X31SDataBeanAccessArray kMailJushinSetteiArray = bean[1].getDataBeanArray(FUW00110SFConst.P_MAIL_JUSIN_SETTEI);
			kMailJushinSetteiArray.clearArray();

			// 法人メール受信設定
			X31SDataBeanAccessArray hMailJushinSetteiArray = bean[1].getDataBeanArray(FUW00110SFConst.E_MAIL_JUSIN_SETTEI);
			hMailJushinSetteiArray.clearArray();

			ArrayList optinmList = (ArrayList)parentMap.get(OPTINM_LIST);
			for (int i = 0; i < optinmList.size(); i++)
			{
				HashMap childMap = (HashMap)optinmList.get(i);

				// 対象外オプトインメール番号判定
				if (tgOutOptinmNoList.contains((String)childMap.get(OPTINM_NO)))
				{
					// 対象外オプトインメール番号である場合
					continue;
				}

				X31SDataBeanAccess kMailJushinSettei = kMailJushinSetteiArray.addDataBean();
				X31SDataBeanAccess hMailJushinSettei = hMailJushinSetteiArray.addDataBean();

				// オプトインメール選択状態
				if (SHK_VALUE_FLG_1.equals((String)childMap.get(SHK_VALUE_FLG)))
				{
					// 初期値フラグが「1：デフォルトチェック」の場合
					kMailJushinSettei.sendMessageBoolean(FUW00110SFConst.P_SEL_OPTINM_02, X31CWebConst.DATABEAN_SET_VALUE, true);
					hMailJushinSettei.sendMessageBoolean(FUW00110SFConst.E_SEL_OPTINM_03, X31CWebConst.DATABEAN_SET_VALUE, true);
				}
				else
				{
					// 上記以外の場合
					kMailJushinSettei.sendMessageBoolean(FUW00110SFConst.P_SEL_OPTINM_02, X31CWebConst.DATABEAN_SET_VALUE, false);
					hMailJushinSettei.sendMessageBoolean(FUW00110SFConst.E_SEL_OPTINM_03, X31CWebConst.DATABEAN_SET_VALUE, false);
				}

				// オプトインメール番号
				kMailJushinSettei.sendMessageString(FUW00110SFConst.P_OPTINM_NO_02, X31CWebConst.DATABEAN_SET_VALUE,
						(String)childMap.get(OPTINM_NO));
				hMailJushinSettei.sendMessageString(FUW00110SFConst.E_OPTINM_NO_03, X31CWebConst.DATABEAN_SET_VALUE,
						(String)childMap.get(OPTINM_NO));
				// オプトインメール名
				kMailJushinSettei.sendMessageString(FUW00110SFConst.P_OPTINM_NM_02, X31CWebConst.DATABEAN_SET_VALUE,
						(String)childMap.get(OPTINM_NM));
				hMailJushinSettei.sendMessageString(FUW00110SFConst.E_OPTINM_NM_03, X31CWebConst.DATABEAN_SET_VALUE,
						(String)childMap.get(OPTINM_NM));
			}

			if (kMailJushinSetteiArray == null || kMailJushinSetteiArray.getCount() == 0
					|| hMailJushinSetteiArray == null || hMailJushinSetteiArray.getCount() == 0)
			{
				// 表示するオプトインメール情報がない場合
				bean[1].sendMessageString(FUW00110SFConst.MAIL_JUSIN_SETTEI_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE,
						MAIL_JUSIN_SETTEI_DSP_FLG_0);
			}
		}
		else
		{
			// 表示するオプトインメール情報がない場合
			bean[1].sendMessageString(FUW00110SFConst.MAIL_JUSIN_SETTEI_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE,
					MAIL_JUSIN_SETTEI_DSP_FLG_0);
		}

		return bean;
	}

	/**
	 * 対象外オプトインメール番号リストを取得します。
	 * 
	 * <br>
	 * @return 対象外オプトインメール番号リスト
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private List<String> getTgOutOptinmNoList() throws Exception
	{
		List<String> resultList = new ArrayList();

		// 対象外オプトインメール番号一覧を取得
		Map<String, String> tgOutOptinmNoMap = JFUWebCommon.getDispItemsAsMap(PATH_TG_OUT_OPTINM_NO, QUERY_ATTR_NAME);

		if (tgOutOptinmNoMap == null || tgOutOptinmNoMap.size() == 0)
		{
			// 情報が取得できていない場合
			return resultList;
		}

		String tgOutOptinmNo = tgOutOptinmNoMap.get(ID_OPTINM_NO);

		if (JFUWebCommon.isNull(tgOutOptinmNo))
		{
			// 情報が取得できていない場合
			return resultList;
		}

		if (tgOutOptinmNo.contains(JFUStrConst.COMMA))
		{
			// カンマ区切りの場合
			String[] tgOutOptinmNoList = tgOutOptinmNo.split(JFUStrConst.COMMA);

			for (int i = 0; i < tgOutOptinmNoList.length; i++)
			{
				String no = tgOutOptinmNoList[i];

				if (JFUWebCommon.isNull(no))
				{
					continue;
				}

				resultList.add(no);
			}
		}
		else
		{
			// カンマ区切りでない場合
			resultList.add(tgOutOptinmNo);
		}

		return resultList;
	}

	/**
	 * コード名称管理コード区分一覧照会SCの下りマッピングをします。
	 * <br>
	 * @param bean データBean配列
	 * @param outputMap サービス結果
	 * @return X31SDataBeanAccess データBean
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getFUSV029801SC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		HashMap parentMap = null;
		if (outputMap.containsKey(FUSV029801SC))
		{
			parentMap = (HashMap)outputMap.get(FUSV029801SC);
		}

		long defaultVal = 0;
		String shinkenshaZokugaraCd = bean[1].sendMessageString(FUW00110SFConst.SHINKENSHA_ZOKUGARA_CD, X31CWebConst.DATABEAN_GET_VALUE);

		X31SDataBeanAccessArray beanArray = bean[1].getDataBeanArray(FUW00110SFConst.SHINKENSHA_ZOKUGARA_LIST);
		beanArray.clearArray();
		beanArray.addDataBean();
		X31SDataBeanAccess targetList = beanArray.getDataBean(0);

		// 値
		targetList.sendMessageString(FUW00110SFConst.TRUE_VALUE_04, X31CWebConst.DATABEAN_ADD_VALUE, JFUStrConst.EMPTY);
		// ラベル
		targetList.sendMessageString(FUW00110SFConst.LABEL_VALUE_04, X31CWebConst.DATABEAN_ADD_VALUE, JFUStrConst.EMPTY);

		if (parentMap.containsKey(EZM0171B012CBSMSG1LIST))
		{
			ArrayList childList = (ArrayList)parentMap.get(EZM0171B012CBSMSG1LIST);

			for (int i = 0; i < childList.size(); i++)
			{
				HashMap childMap = (HashMap)childList.get(i);
				String cdDiv = (String)childMap.get(CD_DIV);
				String cdDivNm = (String)childMap.get(CD_DIV_NM);

				if (JFUWebCommon.isNull(cdDiv) || JFUWebCommon.isNull(cdDivNm))
				{
					// 値、または、名称が取得できない場合は飛ばす
					continue;
				}

				if (!JFUWebCommon.isNull(shinkenshaZokugaraCd) && cdDiv.equals(shinkenshaZokugaraCd))
				{
					// 続柄コードが既に選択済の場合
					defaultVal = i + 1;
				}

				// 値
				targetList.sendMessageString(FUW00110SFConst.TRUE_VALUE_04, X31CWebConst.DATABEAN_ADD_VALUE, cdDiv);
				// ラベル
				targetList.sendMessageString(FUW00110SFConst.LABEL_VALUE_04, X31CWebConst.DATABEAN_ADD_VALUE, cdDivNm);
			}
		}

		// 初期選択値を設定
		targetList.sendMessageLong(FUW00110SFConst.SEL_INDEX_04, X31CWebConst.DATABEAN_SET_VALUE, 0, defaultVal);

		return bean;
	}
}
