/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JPCejbSysParam
 *   ソースファイル名：JPCejbSysParam.java
 *   作成者          ：富士通
 *   日付            ：2011年04月14日
 *＜機能概要＞
 *   EJBシステムパラメータ取得部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/04/14   FJ          新規作成
 *
 **********************************************************************/

package eo.ejb.common;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMInterface;
import com.fujitsu.futurity.model.common.check.DatetimeCheck;

import eo.ejb.cbm.entity.ZM0311ETMsg;
import eo.ejb.cbm.entity.ZM0311LE;

/**
 * EJBシステムパラメータ取得部品です。<p>
 * システムパラメータの取得機能を提供します。<p>
 * <BR>
 * @ author 富士通
 */
public class JPCejbSysParam
{
	// システムパラメータ設定値1
	public static final String PARAM1 = ZM0311ETMsg.SYS_PARAM_SETTE_VALUE_1;

	// システムパラメータ設定値2
	public static final String PARAM2 = ZM0311ETMsg.SYS_PARAM_SETTE_VALUE_2;

	// システムパラメータ設定値3
	public static final String PARAM3 = ZM0311ETMsg.SYS_PARAM_SETTE_VALUE_3;

	// 同日包含フラグ(同日含む)
	private static final String INCLUDE_FLG_INCLUDED = "1";

	/**
	 * <p>
	 * 新しいシステムパラメータ取得部品を生成します。
	 * </p>
	 */
	public JPCejbSysParam()
	{
	}

	/**
	 * <p>
	 * システムパラメータの設定値を取得します。
	 * </p>
	 * @param sysParamBunruiCd 取得する対象のシステムパラメータ分類コード。
	 * @param sysParamId 取得する対象のシステムパラメータID。
	 * @param targetSetteiValue システムパラメータ設定値1、2、3のいずれを取得するかを指定するパラメータ。
	 * 								当クラスの定数で指定する。
	 * @return 取得対象のシステムパラメータ設定値
	 */
	public String getParam(String sysParamBunruiCd, String sysParamId, String targetSetteiValue)
	{
		String baseDate = JCMInterface.getServerDate();

		// 当日に有効なシステムパラメータ管理を取得
		String sSetteiValue = getSysParam(sysParamBunruiCd, sysParamId, targetSetteiValue, baseDate);

		return sSetteiValue;
	}

	/**
	 * <p>
	 * システムパラメータの設定値を取得します（例外処理あり）。
	 * </p>
	 * @param sysParamBunruiCd 取得する対象のシステムパラメータ分類コード。
	 * @param sysParamId 取得する対象のシステムパラメータID。
	 * @param targetSetteiValue システムパラメータ設定値1、2、3のいずれを取得するかを指定するパラメータ。
	 * 								当クラスの定数で指定する。
	 * @return 取得対象のシステムパラメータ設定値
	 */
	public String getParamE(String sysParamBunruiCd, String sysParamId, String targetSetteiValue)
	{
		String baseDate = JCMInterface.getServerDate();

		// 当日に有効なシステムパラメータ管理を取得
		String sSetteiValue = getSysParam(sysParamBunruiCd, sysParamId, targetSetteiValue, baseDate);

		if(null == sSetteiValue)
		{
			throw new IllegalArgumentException("引数の値に誤りがあるため、データを取得できませんでした。 sysParamBunruiCd = " + sysParamBunruiCd + " , sysParamId = " + sysParamId);
		}

		return sSetteiValue;
	}

	/**
	 * <p>
	 * 指定日付時点で有効なシステムパラメータの設定値を取得します。
	 * </p>
	 * @param sysParamBunruiCd 取得する対象のシステムパラメータ分類コード。
	 * @param sysParamId 取得する対象のシステムパラメータID。
	 * @param targetSetteiValue システムパラメータ設定値1、2、3のいずれを取得するかを指定するパラメータ。
	 * 								当クラスの定数で指定する。
	 * @param baseDate 基準日付。
	 * @return 取得対象のシステムパラメータ設定値
	 */
	public String getValidParamOnSpecificDate(String sysParamBunruiCd, String sysParamId, String targetSetteiValue, String baseDate)
	{
		// 基準日付時点で有効なシステムパラメータ管理を取得
		String sSetteiValue = getSysParam(sysParamBunruiCd, sysParamId, targetSetteiValue, baseDate);

		return sSetteiValue;
	}

	/**
	 * <p>
	 * システムパラメータの設定値を取得します（例外処理あり）。
	 * </p>
	 * @param sysParamBunruiCd 取得する対象のシステムパラメータ分類コード。
	 * @param sysParamId 取得する対象のシステムパラメータID。
	 * @param targetSetteiValue システムパラメータ設定値1、2、3のいずれを取得するかを指定するパラメータ。
	 * 								当クラスの定数で指定する。
	 * @param baseDate 基準日付。
	 * @return 取得対象のシステムパラメータ設定値
	 */
	public String getValidParamOnSpecificDateE(String sysParamBunruiCd, String sysParamId, String targetSetteiValue, String baseDate)
	{
		// 基準日付時点で有効なシステムパラメータ管理を取得
		String sSetteiValue = getSysParam(sysParamBunruiCd, sysParamId, targetSetteiValue, baseDate);

		if(null == sSetteiValue)
		{
			throw new IllegalArgumentException("引数の値に誤りがあるため、データを取得できませんでした。 sysParamBunruiCd = " + sysParamBunruiCd + " , sysParamId = " + sysParamId);
		}

		return sSetteiValue;
	}

	/**
	 * <p>
	 * システムパラメータ管理にアクセスし、一意照会をします。
	 * </p>
	 * @param sysParamBunruiCd 取得する対象のシステムパラメータ分類コード。
	 * @param sysParamId 取得する対象のシステムパラメータID。
	 * @param targetSetteiValue システムパラメータ設定値1、2、3のいずれを取得するかを指定するパラメータ。
	 * 								当クラスの定数で指定する。
	 * @param baseDate システムパラメータ管理の適用基準日付。
	 * @return 取得対象のシステムパラメータ設定値
	 */
	private String getSysParam(String sysParamBunruiCd, String sysParamId, String targetSetteiValue, String baseDate)
	{
		// 適用基準日付に日付以外の値が設定された場合
		// 例外をスロー
		if (!(DatetimeCheck.isDateCheck(baseDate)))
		{
			throw new IllegalArgumentException("適用基準日には日付形式の値を設定してください。 baseDate = " + baseDate);
		}

		CAANMsg inMsg = new CAANMsg(ZM0311ETMsg.class.getName());
		inMsg.set(ZM0311ETMsg.SYS_PARAM_BUNRUI_CD, sysParamBunruiCd);
		inMsg.set(ZM0311ETMsg.SYS_PARAM_ID, sysParamId);
		ZM0311LE le = new ZM0311LE();

		// PK指定で検索
		CAANMsg outMsg = le.findByPrimaryKey(inMsg);

		if (null == outMsg)
		{
			// 該当するレコードが存在しない場合はnullを返却
			return null;
		}

		String sFirstAppliedDate = outMsg.getString(ZM0311ETMsg.SYS_PARAM_TSTAYMD);
		String sLastAppliedDate = outMsg.getString(ZM0311ETMsg.SYS_PARAM_TENDYMD);

		// 基準日が適用期間中（適用開始年月日以降で適用終了年月日以前）の日でなければnullを返却
		if (!(JPCModelCommon.isFutureDate(baseDate, sFirstAppliedDate, INCLUDE_FLG_INCLUDED)
				&& JPCModelCommon.isPastDate(baseDate, sLastAppliedDate, INCLUDE_FLG_INCLUDED)))
		{
			return null;
		}

		// 指定されたシステムパラメータ設定値を返却
		return outMsg.getString(targetSetteiValue);
	}
}
