/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUWrisvcAutoAplyInfoSave
*   ソースファイル名：JFUWrisvcAutoAplyInfoSave.java
*   作成者          ：富士通
*   日付            ：2012年09月03日
*＜機能概要＞
*   割引サービス自動適用CCの登録情報の保存を行う共通部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/09/03   FJ          新規作成
*
**********************************************************************/
package eo.web.webview.common;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
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.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 * 割引サービス自動適用CCの登録情報の保存を行う
 * <br>
 * @author 富士通
 */
public class JFUWrisvcAutoAplyInfoSave
{

	/** 割引サービス自動適用マップ.サービス契約グループリスト */
	private static final String SVC_KEI_GRP_LIST = "svc_kei_grp_list";

	/** 割引サービス自動適用マップ.サービス契約リスト */
	private static final String SVC_KEI_LIST = "svc_kei_list";

	/** 割引サービス自動適用マップ.サービス契約グループリスト.グループ区分 */
	private static final String GRP_DIV = "grp_div";

	/** グループ区分：00 */
	private static final String GRP_DIV_00 = "00";

	/** 空文字 */
	private static final String STRING_BLANK = "";

	/**
	 * 割引サービス自動適用情報を共有フォームBeanに保存します
	 * <br>
	 * @param bl
	 * @param inMap
	 * @return 
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	public static boolean saveWrisvcAutoAplyInfo(X31BWebBusinessLogic bl, HashMap inMap) throws Exception
	{
		// 戻り値
		boolean ret = true;
		// 共有フォームBean取得
		X31SDataBeanAccess common_info_bean = bl.getCommonInfoBean();
		// WEB新規情報の取得
		X31SDataBeanAccess web_new_infobean = getWebInfo(common_info_bean);
		// 割引サービス自動適用引継ぎ情報取得
		X31SDataBeanAccess wrisvc_auto_aply_hktg_info = getWrisvcAutoAplyHktgInfo(web_new_infobean);
		// 割引サービス自動適用引継ぎ情報をクリアします
		wrisvcAutoAplyInfoBeanInit(wrisvc_auto_aply_hktg_info);

		Iterator it = inMap.entrySet().iterator();

		while (it.hasNext())
		{
			Map.Entry entry = (Map.Entry)it.next();

			String key = (String)entry.getKey();
			Object obj = entry.getValue();
			if (SVC_KEI_GRP_LIST.equals(key) && obj instanceof ArrayList)
			{
				// サービス契約グループリストの場合
				setList(wrisvc_auto_aply_hktg_info, (ArrayList)obj, SVC_KEI_GRP_LIST);
			}
			else
			{
				if (obj instanceof String)
				{
					// 割引サービス自動適用引継ぎ情報.マップキー設定
					wrisvc_auto_aply_hktg_info.sendMessageString(CommonInfoCFConst.MAP_KEY_51, X31CWebConst.DATABEAN_ADD_VALUE, key);
					// 割引サービス自動適用引継ぎ情報.マップ値設定
					wrisvc_auto_aply_hktg_info.sendMessageString(CommonInfoCFConst.MAP_VALUE_51, X31CWebConst.DATABEAN_ADD_VALUE, (String)obj);
				}
				else
				{
					DEBUG_LOG.info(key + "：想定しない型が設定されています");
					ret = false;
					break;
				}

			}
		}

		return ret;
	}

	/**
	 * 割引サービス自動適用引継ぎ情報Beanを初期化します
	 * <br>
	 * @param bean
	 * @return bean
	 */
	private static X31SDataBeanAccess wrisvcAutoAplyInfoBeanInit(X31SDataBeanAccess bean)
	{
		// 割引サービス自動適用引継ぎ情報.マップキークリア
		bean.sendMessage(CommonInfoCFConst.MAP_KEY_51, X31CWebConst.DATABEAN_CLEAR);
		// 割引サービス自動適用引継ぎ情報.マップ値クリア
		bean.sendMessage(CommonInfoCFConst.MAP_VALUE_51, X31CWebConst.DATABEAN_CLEAR);

		// サービス契約グループ情報（割引サービス自動適用）取得
		X31SDataBeanAccessArray svcKeiGrpArray = bean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_GRP_INFO_WRIB);
		if (svcKeiGrpArray != null)
		{
			for (int indexA = 0; indexA < svcKeiGrpArray.getCount(); indexA++)
			{
				X31SDataBeanAccess svcKeiGrpBean = svcKeiGrpArray.getDataBean(indexA);
				if (svcKeiGrpBean != null)
				{
					// サービス契約情報（割引サービス自動適用）取得（割引サービス自動適用）クリア
					bean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_GRP_INFO_WRIB).clearArray();
				}
			}
		}

		// 割引サービス自動適用引継ぎ情報.サービス契約グループ情報（割引サービス自動適用）クリア
		bean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_GRP_INFO_WRIB).clearArray();
		return bean;
	}

	/**
	 * 下位のリストに値を設定する
	 * <br>
	 * @param wrisvc_auto_aply_hktg_info
	 * @param list
	 * @param listName
	 * @return wrisvc_auto_aply_hktg_info
	 */
	@SuppressWarnings("unchecked")
	private static boolean setList(X31SDataBeanAccess inBean, ArrayList list, String listName)
	{

		// グループ区分のチェック結果
		boolean chkRet = true;

		Iterator itList = list.iterator();

		// Beanの要素値
		int beanIndex = 0;

		while (itList.hasNext())
		{
			// 子要素のBean
			X31SDataBeanAccess sub_bean = null;
			// Bean用のマップキー
			String mapKey = "";
			// Bean用のマップ値
			String mapValue = "";

			if (SVC_KEI_GRP_LIST.equals(listName))
			{
				mapKey = CommonInfoCFConst.MAP_KEY_52;
				mapValue = CommonInfoCFConst.MAP_VALUE_52;
			}
			else if (SVC_KEI_LIST.equals(listName))
			{
				// サービス契約リストを取得する
				sub_bean = getSubList(inBean, CommonInfoCFConst.SVC_KEI_INFO_WRIB, beanIndex);
				mapKey = CommonInfoCFConst.MAP_KEY_53;
				mapValue = CommonInfoCFConst.MAP_VALUE_53;
			}

			// イテレーターリストからマップ取得
			HashMap subMap = (HashMap)itList.next();

			if (SVC_KEI_GRP_LIST.equals(listName))
			{
				// サービス契約グループリストの場合サービス契約リストのチェック処理を行う。
				String grpDiv = (String)subMap.get(GRP_DIV);
				if (grpDiv == null || STRING_BLANK.equals(grpDiv) || !GRP_DIV_00.equals(grpDiv))
				{
					continue;
				}
				else
				{
					// サービス契約グループリストを取得する
					sub_bean = getSubList(inBean, CommonInfoCFConst.SVC_KEI_GRP_INFO_WRIB, beanIndex);
				}
			}

			// イテレーター取得
			Iterator itMap = subMap.entrySet().iterator();

			boolean ret = true;

			while (itMap.hasNext())
			{
				Map.Entry entry = (Map.Entry)itMap.next();

				String key = (String)entry.getKey();
				Object obj = entry.getValue();
				if (SVC_KEI_LIST.equals(key) && obj instanceof ArrayList)
				{
					// サービス契約リストの場合（※再起処理で更に下層のListをBeanに入れる）
					setList(sub_bean, (ArrayList)obj, SVC_KEI_LIST);
				}
				else if (obj instanceof String)
				{
					// objの中身がStringの場合

					// 子マップ.マップキー設定
					sub_bean.sendMessageString(mapKey, X31CWebConst.DATABEAN_ADD_VALUE, key);
					// 子マップ.マップ値設定
					sub_bean.sendMessageString(mapValue, X31CWebConst.DATABEAN_ADD_VALUE, (String)obj);
					// 配列+1

				}
				else
				{
					DEBUG_LOG.info(key + "：子階層に想定しない型が設定されています");
					ret = false;
					break;
				}
			}

			if (!ret)
			{
				// 下位ループで設定がされなかった場合は処理抜け
				break;
			}
			// beanIndexを+1
			beanIndex++;
		}

		return chkRet;
	}

	/**
	 * 割引サービス自動適用情報を共有フォームBeanからマップで取得します
	 * <br>
	 * @param bl
	 * @return wrisvcAutoAplyMap
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	public static HashMap getWrisvcAutoAplyInfoAsMap(X31BWebBusinessLogic bl) throws Exception
	{
		// 共有フォームBean取得
		X31SDataBeanAccess common_info_bean = bl.getCommonInfoBean();
		// WEB新規情報の取得
		X31SDataBeanAccess web_new_infobean = getWebInfo(common_info_bean);
		// 割引サービス自動適用引継ぎ情報取得
		X31SDataBeanAccess wrisvc_auto_aply_hktg_info = getWrisvcAutoAplyHktgInfo(web_new_infobean);

		if (wrisvc_auto_aply_hktg_info == null)
		{
			// 設定不備の場合Null返却
			return new HashMap();
		}

		// 割引サービス自動適用引継ぎ情報のマップキー配列のカウントを取得します
		int count = (Integer)wrisvc_auto_aply_hktg_info.sendMessage(CommonInfoCFConst.MAP_KEY_51, X31CWebConst.DATABEAN_GET_COUNT);

		// ハッシュマップ生成
		HashMap wrisvcAutoAplyMap = new HashMap();

		// 割引サービス自動適用マップ生成
		for (int index = 0; index < count; index++)
		{
			// 
			String key = wrisvc_auto_aply_hktg_info.sendMessageString(CommonInfoCFConst.MAP_KEY_51, X31CWebConst.DATABEAN_GET_VALUE, index);
			String value = wrisvc_auto_aply_hktg_info.sendMessageString(CommonInfoCFConst.MAP_VALUE_51, X31CWebConst.DATABEAN_GET_VALUE, index);
			wrisvcAutoAplyMap.put(key, value);
		}

		// サービス契約グループ情報Beanリスト取得
		X31SDataBeanAccessArray svcKeiGrpBeanList = wrisvc_auto_aply_hktg_info.getDataBeanArray(CommonInfoCFConst.SVC_KEI_GRP_INFO_WRIB);

		// サービス契約グループ情報Beanリストからサービス契約グループリストを取得
		ArrayList svcKeiGrpList = getListFromBean(svcKeiGrpBeanList, SVC_KEI_GRP_LIST);

		// サービス契約グループリスト設定
		wrisvcAutoAplyMap.put(SVC_KEI_GRP_LIST, svcKeiGrpList);

		return wrisvcAutoAplyMap;
	}

	/**
	 * 下位階層の情報取得処理
	 * <br>
	 * @param inBeanArray
	 * @param listName
	 * @return retList
	 */
	@SuppressWarnings("unchecked")
	private static ArrayList getListFromBean(X31SDataBeanAccessArray inBeanArray, String listName)
	{
		ArrayList retList = new ArrayList();
		String mapKey = "";
		String mapValue = "";
		if (SVC_KEI_GRP_LIST.equals(listName))
		{
			// サービス契約グループリストを取得する
			mapKey = CommonInfoCFConst.MAP_KEY_52;
			mapValue = CommonInfoCFConst.MAP_VALUE_52;
		}
		else if (SVC_KEI_LIST.equals(listName))
		{
			// サービス契約リストを取得する
			mapKey = CommonInfoCFConst.MAP_KEY_53;
			mapValue = CommonInfoCFConst.MAP_VALUE_53;
		}

		// BeanListのループ
		for (int arrayIndex = 0; arrayIndex < inBeanArray.getCount(); arrayIndex++)
		{
			HashMap retMap = new HashMap();
			X31SDataBeanAccess inBean = inBeanArray.getDataBean(arrayIndex);
			int beanCount = (Integer)inBean.sendMessage(mapKey, X31CWebConst.DATABEAN_GET_COUNT);

			// BeanのString配列のループ
			for (int beanIndex = 0; beanIndex < beanCount; beanIndex++)
			{
				// マップのKEY取得
				String key = inBean.sendMessageString(mapKey, X31CWebConst.DATABEAN_GET_VALUE, beanIndex);
				// マップのVALUE取得
				String value = inBean.sendMessageString(mapValue, X31CWebConst.DATABEAN_GET_VALUE, beanIndex);
				// マップに設定
				retMap.put(key, value);
			}

			if (SVC_KEI_GRP_LIST.equals(listName))
			{
				// サービス契約グループリストの場合
				X31SDataBeanAccessArray svcKeiArray = inBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO_WRIB);
				// サービス契約リストを取得（※再起処理で更に下層のBeanをArrayList化して取得する）
				ArrayList svcKeiList = getListFromBean(svcKeiArray, SVC_KEI_LIST);
				// マップにリストを設定する
				retMap.put(SVC_KEI_LIST, svcKeiList);
			}

			// 生成したハッシュマップをリストに詰める
			retList.add(retMap);
		}

		return retList;
	}

	/**
	 * WEB新規情報を取得する
	 * 
	 * @param bean
	 * @return bn
	 */
	private static X31SDataBeanAccess getWebInfo(X31SDataBeanAccess bean)
	{

		X31SDataBeanAccessArray arr = bean.getDataBeanArray(CommonInfoCFConst.WEB_NEW_INFO);
		if (arr.getCount() == 0)
		{
			arr.addDataBean();
		}
		X31SDataBeanAccess bn = arr.getDataBean(0);

		return bn;
	}

	/**
	 * 割引サービス自動適用引継ぎ情報を取得する
	 * 
	 * @param bean
	 * @return bn
	 */
	private static X31SDataBeanAccess getWrisvcAutoAplyHktgInfo(X31SDataBeanAccess bean)
	{

		X31SDataBeanAccessArray arr = bean.getDataBeanArray(CommonInfoCFConst.WRISVC_AUTO_APLY_HKTG_INFO);
		if (arr.getCount() == 0)
		{
			arr.addDataBean();
		}
		X31SDataBeanAccess bn = arr.getDataBean(0);

		return bn;
	}

	/**
	 * 対象のBeanの子要素を取得する
	 * 
	 * @param bean
	 * @param beanName
	 * @param index
	 * @return bn
	 */
	private static X31SDataBeanAccess getSubList(X31SDataBeanAccess bean, String beanName, int index)
	{

		// 指定のBean名でBeanArrayを取得
		X31SDataBeanAccessArray arr = bean.getDataBeanArray(beanName);

		// 指定のIndexに要素が無ければ追加する
		if (arr.getCount() < index + 1)
		{
			arr.addDataBean();
		}
		// 指定のIndexのBeanを返却する
		X31SDataBeanAccess bn = arr.getDataBean(index);

		return bn;
	}
}
