/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JCHPulldownUtil
 *	ソースファイル名：JCHPulldownUtil.java
 *	作成者			：富士通
 *	日付			：2011年09月21日
 *＜機能概要＞
 *	共通で使用するプルダウンユーティリティクラスです。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/09/21	富士通		新規作成
 *
 **********************************************************************/
package eo.web.webview.common;

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.common.constant.JACStrConst;

/**
 * 画面のプルダウン情報を設定・取得する共通部品です。 <br>
 * 
 * @author 富士通
 */
public class JCHPulldownUtil
{
	/** 選択インデックスデフォルト値 */
	private static final String DEFAULT_SEL_INDEX = "0";

	/** コードリストの定数 */
	private static final String CD_DIV_LIST = "コードリスト";

	/** コード名リストの定数 */
	private static final String CD_DIV_NM_LIST = "コード名リスト";

	/**
	 * 格納位置(index値)を指定したリストから算出します。 Replaceする文字がない場合は空文字("")を設定して下さい。 <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param keyValue 取得する項目
	 * @param keyInfoMei 取得するinfo名称
	 * @param keyListMei 値リストを示すキー名称
	 * @param strReplace 除去文字
	 * @return 格納位置
	 */
	public static String getSelectedIndex(X31SDataBeanAccess[] bean, String keyValue, String keyInfoMei, String keyListMei, String strReplace)
	{

		String idxSel = DEFAULT_SEL_INDEX;
		String getValue = bean[0].sendMessageString(keyValue, X31CWebConst.DATABEAN_GET_VALUE);

		if (JCHWebCommon.isNotNullOrEmpty(getValue))
		{
			X31SDataBeanAccess infoBean = bean[0].getDataBeanArray(keyInfoMei).getDataBean(0);

			idxSel = String.valueOf(countSelIndex(infoBean, keyListMei, getValue, strReplace));
		}

		return idxSel;
	}

	/**
	 * 格納位置(index値)を指定したリストから算出します。 Replaceする文字がない場合は空文字("")を設定して下さい。 <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param keyValue 取得する項目
	 * @param keyInfoMei 取得するinfo名称
	 * @param keyListMei 値リストを示すキー名称
	 * @param strReplace 除去文字
	 * @param staIdx 開始インデックス
	 * @param endIdx 終了インデックス
	 * @return 格納位置
	 */
	public static String getSelectedIndex(X31SDataBeanAccess[] bean, String keyValue, String keyInfoMei, String keyListMei, String strReplace, int staIdx, int endIdx)
	{

		String idxSel = DEFAULT_SEL_INDEX;
		String getValue = bean[0].sendMessageString(keyValue, X31CWebConst.DATABEAN_GET_VALUE);

		if (JCHWebCommon.isNotNullOrEmpty(getValue))
		{
			X31SDataBeanAccess infoBean = bean[0].getDataBeanArray(keyInfoMei).getDataBean(0);

			idxSel = String.valueOf(countSelIndex(infoBean, keyListMei, getValue, strReplace, staIdx, endIdx));
		}

		return idxSel;
	}

	/**
	 * 指定したリストより選択位置の指定した名称を取得します。 <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param keyInfoMei 取得するinfo名称
	 * @param keyListMei 値リストを示すキー名称
	 * @param keySelMei 選択位置を示すキー名称
	 * @return 名称
	 */
	public static String getSelectedValue(X31SDataBeanAccess[] bean, String keyInfoMei, String keyListMei, String keySelMei)
	{

		X31SDataBeanAccess infoBean = bean[0].getDataBeanArray(keyInfoMei).getDataBean(0);

		int listInfoCnt = ((Integer) infoBean.sendMessage(keyListMei, X31CWebConst.DATABEAN_GET_COUNT)).intValue();

		String rtnVal = JACStrConst.KARA_MOJI;
		if (listInfoCnt > 0)
		{
			rtnVal = getValueFromListBySelIndex(infoBean, keyListMei, keySelMei);
		}

		return rtnVal;
	}

	/**
	 * 指定したリストの件数を取得します。 <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param keyInfoMei 取得するinfo名称
	 * @param keyListMei 値リストを示すキー名称
	 * @return 名称
	 */
	public static int getListCount(X31SDataBeanAccess[] bean, String keyInfoMei, String keyListMei)
	{

		X31SDataBeanAccess infoBean = bean[0].getDataBeanArray(keyInfoMei).getDataBean(0);

		int listInfoCnt = ((Integer) infoBean.sendMessage(keyListMei, X31CWebConst.DATABEAN_GET_COUNT)).intValue();

		return listInfoCnt;
	}

	/**
	 * 初期表示コードリストから初期選択値番号を取得します。 <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param keyInfoMei 取得するinfo名称
	 * @param keyListMei 値リストを示すキー名称
	 * @param isKaraRow 空行がある場合:true、ない場合:false
	 * @return 初期表示コード番号
	 */
	public static String getShkDspCd(X31SDataBeanAccess[] bean, String keyInfoMei, String keyListMei, boolean isKaraRow)
	{

		String rtnVal = JACStrConst.SHK_DSP_CD_OFF;

		X31SDataBeanAccess infoBean = bean[0].getDataBeanArray(keyInfoMei).getDataBean(0);
		int listCnt = ((Integer) infoBean.sendMessage(keyListMei, X31CWebConst.DATABEAN_GET_COUNT)).intValue();

		for (int i = 0; i < listCnt; i++)
		{

			String shkDspCd = infoBean.sendMessageString(keyListMei, X31CWebConst.DATABEAN_GET_VALUE, i);

			if (JCHWebCommon.isNotNullOrEmpty(shkDspCd) && JACStrConst.SHK_DSP_CD_ON.equals(shkDspCd))
			{
				if (isKaraRow)
				{
					rtnVal = String.valueOf(i + 1);
				}
				else
				{
					rtnVal = String.valueOf(i);
				}
			}
		}

		return rtnVal;
	}

	/**
	 * 指定したリストの選択行が先頭行かを判断します。 <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param keyInfoMei 取得するinfo名称
	 * @param keyListMei 値リストを示すキー名称
	 * @param keySelMei 選択位置を示すキー名称
	 * @return 先頭行が選択された場合True
	 */
	public static boolean isFrstSelIndex(X31SDataBeanAccess[] bean, String keyInfoMei, String keyListMei, String keySelMei)
	{

		X31SDataBeanAccess infoBean = bean[0].getDataBeanArray(keyInfoMei).getDataBean(0);

		boolean rtnVal = false;
		int listInfoCnt = ((Integer) infoBean.sendMessage(keyListMei, X31CWebConst.DATABEAN_GET_COUNT)).intValue();

		if (listInfoCnt > 0)
		{
			int selIdx = Integer.parseInt(infoBean.sendMessageString(keySelMei, X31CWebConst.DATABEAN_GET_VALUE));

			if (selIdx == 0)
			{
				rtnVal = true;
			}
		}
		else
		{
			// リストがない場合もtrueを返却
			rtnVal = true;
		}

		return rtnVal;
	}

	/**
	 * 指定したリストの選択行が最終行かを判断します。 <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param keyInfoMei 取得するinfo名称
	 * @param keyListMei 値リストを示すキー名称
	 * @param keySelMei 選択位置を示すキー名称
	 * @return 最終行が選択された場合True
	 */
	public static boolean isLastSelIndex(X31SDataBeanAccess[] bean, String keyInfoMei, String keyListMei, String keySelMei)
	{

		X31SDataBeanAccess infoBean = bean[0].getDataBeanArray(keyInfoMei).getDataBean(0);

		boolean rtnVal = false;
		int listInfoCnt = ((Integer) infoBean.sendMessage(keyListMei, X31CWebConst.DATABEAN_GET_COUNT)).intValue();

		if (listInfoCnt > 0)
		{
			int selIdx = Integer.parseInt(infoBean.sendMessageString(keySelMei, X31CWebConst.DATABEAN_GET_VALUE));

			if (selIdx == listInfoCnt - 1)
			{
				rtnVal = true;
			}
		}
		else
		{
			// リストがない場合もtrueを返却
			rtnVal = true;
		}

		return rtnVal;
	}

	/**
	 * 取得したいKEYリストの対象値を取得します。 1.元となるKEYリスト(画面選択値)からインデックスを取得。 2.インデックスをキーに取得したいKEYリストの対象値を取得。 <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param keyInfoMei 取得するinfo名称
	 * @param keyListMeiSelIndex 値リストを示すキー名称
	 * @param keyListMeigetValue 値リストを示すキー名称（取得したいリスト名）
	 * @param value 指定された値
	 * @param strReplace 除去文字
	 * @return 格納位置
	 */
	public static String getKeyListValue(X31SDataBeanAccess[] bean, String keyInfoMei, String keyListMeiSelIndex, String keyListMeigetValue, String value,
			String strReplace)
	{

		X31SDataBeanAccess infoBean = bean[0].getDataBeanArray(keyInfoMei).getDataBean(0);

		// KEYリストに紐づくセルのインデックスを取得
		int idxSel = countSelIndex(infoBean, keyListMeiSelIndex, value, strReplace);

		String getValue = null;
		if (idxSel >= 0)
		{
			// KEYリストから指定されたインデックスの値を取得
			getValue = infoBean.sendMessageString(keyListMeigetValue, X31CWebConst.DATABEAN_GET_VALUE, idxSel);
		}

		return getValue;
	}

	/**
	 * コードが一致する格納位置をコードリストから算出します。 <br>
	 * 
	 * @param bean コードリストが格納された親Bean
	 * @param keyCodeList コードリストを示すキー
	 * @param codeValue 格納位置を算出するコード値
	 * @return 格納位置
	 */
	public static String countSelIndex(X31SDataBeanAccess bean, String keyCodeList, String codeValue)
	{

		int selIndex = -1;
		int listCnt;

		try
		{
			listCnt = ((Integer) bean.sendMessage(keyCodeList, X31CWebConst.DATABEAN_GET_COUNT)).intValue();
		}
		catch (Exception ex)
		{
			listCnt = 0;
		}

		for (int idx = 0; idx < listCnt; idx++)
		{
			if (codeValue.equals(bean.sendMessageString(keyCodeList, X31CWebConst.DATABEAN_GET_VALUE, idx)))
			{
				selIndex = idx;
				break;
			}
		}

		return String.valueOf(selIndex);
	}

	/**
	 * コードが一致する格納位置をコードリストから算出します。 <br>
	 * 
	 * @param bean コードリストが格納された親Bean
	 * @param keyCodeList コードリストを示すキー
	 * @param codeValue 格納位置を算出するコード値
	 * @param strReplace 除去文字
	 * @return 格納位置
	 */
	private static int countSelIndex(X31SDataBeanAccess bean, String keyCodeList, String codeValue, String strReplace)
	{

		int selIndex = -1;
		int listCnt;

		try
		{
			listCnt = ((Integer) bean.sendMessage(keyCodeList, X31CWebConst.DATABEAN_GET_COUNT)).intValue();
		}
		catch (Exception ex)
		{
			listCnt = 0;
		}

		for (int idx = 0; idx < listCnt; idx++)
		{
			if (codeValue.equals(bean.sendMessageString(keyCodeList, X31CWebConst.DATABEAN_GET_VALUE, idx).replace(strReplace, "")))
			{
				selIndex = idx;
				break;
			}
		}

		return selIndex;
	}

	/**
	 * コードが一致する格納位置をコードリストから算出します。 <br>
	 * 
	 * @param bean コードリストが格納された親Bean
	 * @param keyCodeList コードリストを示すキー
	 * @param codeValue 格納位置を算出するコード値
	 * @param strReplace 除去文字
	 * @param staIdx 開始インデックス
	 * @param endIdx 終了インデックス
	 * @return 格納位置
	 */
	private static int countSelIndex(X31SDataBeanAccess bean, String keyCodeList, String codeValue, String strReplace, int staIdx, int endIdx)
	{

		int selIndex = -1;
		int listCnt;

		try
		{
			listCnt = ((Integer) bean.sendMessage(keyCodeList, X31CWebConst.DATABEAN_GET_COUNT)).intValue();
		}
		catch (Exception ex)
		{
			listCnt = 0;
		}

		for (int idx = 0; idx < listCnt; idx++)
		{
			if (codeValue.equals(bean.sendMessageString(keyCodeList, X31CWebConst.DATABEAN_GET_VALUE, idx).substring(staIdx, endIdx).replace(strReplace, "")))
			{
				selIndex = idx;
				break;
			}
		}

		return selIndex;
	}

	/**
	 * 指定したリストより選択位置の値を取得します。 <br>
	 * 
	 * @param infoBean 値リスト、選択位置が格納されている親Bean
	 * @param keyList 値リストを示すキー
	 * @param keySel 選択位置を示すキー
	 * @return 名称
	 */
	private static String getValueFromListBySelIndex(X31SDataBeanAccess infoBean, String keyList, String keySel)
	{

		String value = null;

		if (infoBean != null)
		{
			int idxSel;

			try
			{
				idxSel = Integer.parseInt(infoBean.sendMessageString(keySel, X31CWebConst.DATABEAN_GET_VALUE));

				if (idxSel >= 0)
				{
					value = infoBean.sendMessageString(keyList, X31CWebConst.DATABEAN_GET_VALUE, idxSel);
				}
			}
			catch (NumberFormatException ex)
			{
				idxSel = -1;
			}

		}

		return value;
	}

	/**
	 * <dd>メソッド名 ：setPulldownList <dd>メソッド説明 ：下り情報Mapから取得したコードリスト、コード名リストを プルダウン情報Beanに設定します。
	 * 
	 * @param bean データBeanアクセスクラス
	 * @param outputMap 下り情報Map
	 * @param pulldownKey プルダウン情報取得キー
	 * @param outMapKey 下り情報Map取得キー
	 * @param blankFlag 1行目ブランク付与フラグ true:付与する,false:付与しない
	 * @exception Exceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	public static void setPulldownList(X31SDataBeanAccess bean, HashMap<String, Object> outputMap, String pulldownKey, String outMapKey, boolean blankFlag)
			throws Exception
	{

		//データBeanアクセスクラスがNULLかどうか判定します
		if (bean == null)
		{
			//NULL、空の場合処理を終了します
			return;
		}
		//下り情報MapがNULLか判定する
		if (outputMap == null)
		{
			//NULLの場合処理を終了します
			return;
		}
		//プルダウンキーがNULLか空文字かどうか判定します
		if (pulldownKey == null || JACStrConst.KARA_MOJI.equals(pulldownKey))
		{
			//NULL、空文字の場合処理を終了します
			return;
		}

		//下り情報Map取得キーがNULLか空文字かどうか判定します
		if (outMapKey == null || JACStrConst.KARA_MOJI.equals(outMapKey))
		{
			//NULL、空文字の場合処理を終了します
			return;
		}
		//下り情報マップから対象の情報を取得します
		HashMap<String, Object> parentMap = (HashMap) outputMap.get(outMapKey);

		if (parentMap == null)
		{
			//NULLの場合処理を終了します
			return;
		}
		//Mapにコード名称管理一覧照会明細が含まれているか判定します
		//コード明細情報リストにコード名称管理一意照会明細を設定します
		ArrayList childList = (ArrayList) parentMap.get("EZM0171B010CBSMsg1List");
		//コード明細情報リストがNULLか、空か判定します
		if (childList == null || 0 == childList.size())
		{
			//NULL、空の場合処理を終了します
			return;
		}

		// 対象の発行ステータスDataBeanを取得し、データBeanアクセスクラスリストに設定します
		X31SDataBeanAccessArray pulldown_list = bean.getDataBeanArray(pulldownKey);

		//データBeanアクセスクラスに対象のプルダウン情報Beanを設定します
		X31SDataBeanAccess pulldown_subbean = pulldown_list.getDataBean(0);

		//プルダウン情報Beanのコードリスト領域のクリアを行います
		pulldown_subbean.sendMessage(CD_DIV_LIST, X31CWebConst.DATABEAN_CLEAR);
		//プルダウン情報Beanのコードリスト名領域のクリアを行います
		pulldown_subbean.sendMessage(CD_DIV_NM_LIST, X31CWebConst.DATABEAN_CLEAR);

		//先頭に空文字を設定するか判定します
		if (blankFlag)
		{
			// 先頭に空文字を設定
			pulldown_subbean.sendMessageString(CD_DIV_LIST, X31CWebConst.DATABEAN_ADD_VALUE, JACStrConst.KARA_MOJI);
			pulldown_subbean.sendMessageString(CD_DIV_NM_LIST, X31CWebConst.DATABEAN_ADD_VALUE, JACStrConst.KARA_MOJI);
		}

		//添え字
		int index = 1;

		//コード明細情報リスト分コードリスト、コード名リストを取得します
		for (int i = 0; i < childList.size(); i++)
		{
			//コード明細情報リストをコード明細情報Mapに設定します
			HashMap childMap = (HashMap) childList.get(i);
			//プルダウン情報Beanにコード区分を設定する
			pulldown_subbean.sendMessageString(CD_DIV_LIST, X31CWebConst.DATABEAN_ADD_VALUE, (String) childMap.get("cd_div"));
			//対象のBeanにコード区分名を設定す	る
			String cd_div_nm = (String) childMap.get("cd_div_nm");
			//添え字、"."、コードリスト名の順にプルダウン情報Beanに設定する
			pulldown_subbean.sendMessageString(CD_DIV_NM_LIST, X31CWebConst.DATABEAN_ADD_VALUE, (index) + ". " + cd_div_nm);
			//添え字のカウントアップ
			index++;
		}
	}

	/**
	 * 選択位置取得<br>
	 * 値が設定されていない場合、初期表示コードに従って選択位置を決定します。 初期表示コードが指定されていない場合は、先頭行を選択するため"0"を返却します。 <br>
	 * 
	 * @param infoBean リスト、選択位置が格納されている親Bean
	 * @param keySel 選択位置を示すキー
	 * @param keyShkDspCdList 初期表示コードリストを示すキー
	 * @return 選択位置
	 */
	public static String countSelIndexWithShkDspCd(X31SDataBeanAccess infoBean, String keySel, String keyShkDspCdList)
	{
		int idxSel = 0;

		String selVal = infoBean.sendMessageString(keySel, X31CWebConst.DATABEAN_GET_VALUE);
		if (selVal == null || "".equals(selVal))
		{
			int listCnt;
			try
			{
				listCnt = ((Integer) infoBean.sendMessage(keyShkDspCdList, X31CWebConst.DATABEAN_GET_COUNT)).intValue();
			}
			catch (Exception ex)
			{
				listCnt = 0;
			}
			for (int idx = 0; idx < listCnt; idx++)
			{
				if (JACStrConst.SHK_DSP_CD_ON.equals(infoBean.sendMessageString(keyShkDspCdList, X31CWebConst.DATABEAN_GET_VALUE, idx)))
				{
					idxSel = idx;
					break;
				}
			}
			return String.valueOf(idxSel);
		}
		else
		{
			return selVal;
		}
	}
}
