/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：JKKAgentScreenUtil
 *   モジュール名    ：JKKAgentScreenUtil
 *   ソースファイル名：JKKAgentScreenUtil.java
 *   作成者          ：富士通
 *   日付            ：2012年08月26日
 *＜機能概要＞
 *   取扱コードマスタメンテナンス関連画面の共通機能です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v4.00.00    2012/08/26   FJ          新規作成
 *
 **********************************************************************/

package eo.web.webview.common;

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.JKKStrConst;
import eo.common.util.JPCDateChecker;
import eo.common.util.JPCFomatString;

/**
 * 取扱コードマスタメンテナンス関連画面の共通機能です。
 * <br>
 * @author 富士通
 */
public class JKKAgntScreenUtil
{
	/** コードリストの定数 */
	private static final String CD_DIV_LIST = "コードリスト";

	/** コード名リストの定数 */
	private static final String CD_DIV_NM_LIST = "コード名リスト";

	/** 名称リストの定数 */
	private static final String NM_LIST = "名称リスト";

	/** 添え字とコード名の区切り文字 */
	private static final String IDX_SEP = ".";

	/** 郵便番号(XXX-XXXX) */
	private static final int LEN_PCD = 7;

	/** 半角空白 */
	private static final String SPACE = " ";

	/** ハイフン */
	private static final String HYHUN = "-";

	/** 郵便マーク */
	private static final String PMARK = "〒";

	/**
	 * プルダウン形式のリストに、指定された親リストのコード値で始まる項目のみを設定します。<br>
	 * 
	 * @param bean データBeanアクセスクラス
	 * @param allListComponentID 全リスト項目を保持するコンポーネントID
	 * @param pulldownListComponentID 設定対象のプルダウンのコンポーネントID
	 * @param parentCd 親リストのコード値
	 * @exception Exception
	 */
	public static void setChildPullDownList(X31SDataBeanAccess bean, String allListComponentID, String pulldownListComponentID, String parentCd) throws Exception
	{
		X31SDataBeanAccessArray all_list = bean.getDataBeanArray(allListComponentID);
		X31SDataBeanAccess all_subbean = all_list.getDataBean(0);

		X31SDataBeanAccessArray pulldown_list = bean.getDataBeanArray(pulldownListComponentID);
		X31SDataBeanAccess pulldown_subbean = pulldown_list.getDataBean(0);

		//プルダウン情報Beanをクリア
		pulldown_subbean.sendMessage(CD_DIV_LIST, X31CWebConst.DATABEAN_CLEAR);
		pulldown_subbean.sendMessage(CD_DIV_NM_LIST, X31CWebConst.DATABEAN_CLEAR);
		pulldown_subbean.sendMessage(NM_LIST, X31CWebConst.DATABEAN_CLEAR);

		// 先頭に空文字を設定
		pulldown_subbean.sendMessageString(CD_DIV_LIST, X31CWebConst.DATABEAN_ADD_VALUE, "");
		pulldown_subbean.sendMessageString(CD_DIV_NM_LIST, X31CWebConst.DATABEAN_ADD_VALUE, "");
		pulldown_subbean.sendMessageString(NM_LIST, X31CWebConst.DATABEAN_ADD_VALUE, "");

		if (null != parentCd && !"".equals(parentCd))
		{
			// 添え字
			int index = 1;
			int cnt = (Integer)all_subbean.sendMessage(CD_DIV_LIST, X31CWebConst.DATABEAN_GET_COUNT);
			// コードリストの要素数分繰り返す
			for (int i = 0; i < cnt; i++)
			{
				String code = all_subbean.sendMessageString(CD_DIV_LIST, X31CWebConst.DATABEAN_GET_VALUE, i);
				// 親リストのコードで始まる場合
				if (code.startsWith(parentCd))
				{
					// 添え字なしの名称を取得
					String codeNm = all_subbean.sendMessageString(NM_LIST, X31CWebConst.DATABEAN_GET_VALUE, i);
					pulldown_subbean.sendMessageString(CD_DIV_LIST, X31CWebConst.DATABEAN_ADD_VALUE, code);
					pulldown_subbean.sendMessageString(CD_DIV_NM_LIST, X31CWebConst.DATABEAN_ADD_VALUE, (index) + IDX_SEP + codeNm);
					pulldown_subbean.sendMessageString(NM_LIST, X31CWebConst.DATABEAN_ADD_VALUE, codeNm);
					index++;
				}
			}
		}
	}

	/**
	 * 予約適用年月日と代理店適用開始年月日をもとに代理店情報が適用中かどうかを判定します。<br>
	 * 
	 * @param rsvAplyYmd 予約適用年月日
	 * @param agntTstaymd 代理店適用開始年月日
	 * @param opeDate 運用日
	 * @return 適用中の場合はtrue、そうでない場合はfalse
	 */
	public static boolean isAplyAgnt(String rsvAplyYmd, String agntTstaymd, String opeDate)
	{
		boolean isAply = false;

		// 予約適用年月日≦運用日で最大かつ、適用開始年月日≦運用日≦適用終了年月日の場合
// TODO 終了日はみてない
		if (!isNull(rsvAplyYmd) && !isNull(agntTstaymd) && !isNull(opeDate)
			&& JPCDateChecker.isPastDate(rsvAplyYmd, opeDate, "1") && JPCDateChecker.isPastDate(agntTstaymd, opeDate, "1"))
		{
			// 適用中
			isAply = true;
		}

		return isAply;
	}

	/**
	 * 予約適用年月日と代理店適用開始年月日と代理店適用終了年月日をもとに代理店情報が予約（適用開始後）かどうかを判定します。<br>
	 * 
	 * @param rsvAplyYmd 予約適用年月日
	 * @param agntTstaymd 代理店適用開始年月日
	 * @param agntTendymd 代理店適用終了年月日
	 * @param opeDate 運用日
	 * @return 予約の場合はtrue、そうでない場合はfalse
	 */
	public static boolean isRsvAgntTstaAf(String rsvAplyYmd, String agntTstaymd, String agntTendymd, String opeDate)
	{
		boolean isRsv = false;

		if (!isNull(rsvAplyYmd) && !isNull(agntTstaymd) && !isNull(agntTendymd) && !isNull(opeDate))
		{
			// 予約適用年月日＞運用日かつ、適用開始年月日≦運用日≦適用終了年月日の場合
			if (JPCDateChecker.isPastDate(opeDate, rsvAplyYmd, "0") && JPCDateChecker.isPastDate(agntTstaymd, opeDate, "1")
					&& JPCDateChecker.isPastDate(opeDate, agntTendymd, "1"))
			{
				// 予約（適用開始後）
				isRsv = true;
			}
		}

		return isRsv;
	}

	/**
	 * 予約適用年月日と代理店適用開始年月日と代理店適用終了年月日をもとに代理店情報が予約（適用開始前）かどうかを判定します。<br>
	 * 
	 * @param rsvAplyYmd 予約適用年月日
	 * @param agntTstaymd 代理店適用開始年月日
	 * @param opeDate 運用日
	 * @return 予約の場合はtrue、そうでない場合はfalse
	 */
	public static boolean isRsvAgntTstaBf(String rsvAplyYmd, String agntTstaymd, String opeDate)
	{
		boolean isRsv = false;

		if (!isNull(rsvAplyYmd) && !isNull(agntTstaymd) && !isNull(opeDate))
		{
			// 予約適用年月日≦運用日かつ、運用日＜適用開始年月日の場合
			if (JPCDateChecker.isPastDate(rsvAplyYmd, opeDate, "1") && JPCDateChecker.isPastDate(opeDate, agntTstaymd, "0"))
			{
				// 予約（適用開始前）
				isRsv = true;
			}
		}

		return isRsv;
	}

	/**
	 * 予約適用年月日と代理店適用開始年月日と代理店適用終了年月日をもとに代理店情報が予約かどうかを判定します。<br>
	 * 
	 * @param rsvAplyYmd 予約適用年月日
	 * @param agntTstaymd 代理店適用開始年月日
	 * @param agntTendymd 代理店適用終了年月日
	 * @param opeDate 運用日
	 * @return 予約の場合はtrue、そうでない場合はfalse
	 */
	public static boolean isRsvAgnt(String rsvAplyYmd, String agntTstaymd, String agntTendymd, String opeDate)
	{
		boolean isRsv = false;

		if (!isNull(rsvAplyYmd) && !isNull(agntTstaymd) && !isNull(agntTendymd) && !isNull(opeDate))
		{
			// 予約（適用開始後）、または予約（適用開始前）の場合
			if (isRsvAgntTstaAf(rsvAplyYmd, agntTstaymd, agntTendymd, opeDate)
					|| isRsvAgntTstaBf(rsvAplyYmd, agntTstaymd, opeDate))
			{
				// 予約
				isRsv = true;
			}
		}

		return isRsv;
	}

	/**
	 * 日付形式がYYYYMMDDの文字列を、表示用形式のYYYY/MM/DDに変換します。<br>
	 * ただし、初期値(20991231)の場合は空文字を返します。<br>
	 * 
	 * @param yyyymmdd 日付文字列
	 * @return 変換後の日付文字列
	 */
	public static String getDispDate(String yyyymmdd)
	{
		String dispDate = "";

		if (!JKKStrConst.END_YMD_DEFAULT.equals(yyyymmdd))
		{
			dispDate = JPCFomatString.formatDate(yyyymmdd);
		}

		return dispDate;
	}

	/**
	 * 郵便番号を表示用に編集します。<br>
	 * 
	 * @param pcd 編集対象の郵便番号
	 * @return 書式編集された郵便番号
	 */
	public static String editPcd(String pcd) 
	{
		// nullチェックを行う
		if (isNull(pcd))
		{
			return pcd;
		}

		// 桁数チェックを行う
		if(!isValidParameter(pcd, LEN_PCD)) 
		{
			return pcd;
		}

		return PMARK + SPACE + pcd.substring(0, 3) + SPACE + HYHUN + SPACE + pcd.substring(3, 7);
	}

	/**
	 * 引数に値が設定されているか判定します。
	 * <br>
	 * @param str 判定する引数
	 * @return 引数に値が設定されていない場合はtrue
	 */
	public static boolean isNull(String str) 
	{
		if (str == null) 
		{
			return true;
		}

		return 0 == str.toString().trim().length();
	}

	/**
	 * 有効なパラメータか判定します。
	 * 文字列に値が設定されていない場合、及び指定された桁数と
	 * 一致しない場合はエラーとします。
	 * <br>
	 * @param arg0 判定する文字列
	 * @param arg1 文字列として有効な桁数
	 * @return パラメータが不正な場合はfalse
	 */
	private static boolean isValidParameter(String arg0, int arg1) 
	{
		if (isNull(arg0)) 
		{
			return false;
		}

		return arg1 == arg0.length();
	}
}
