/*********************************************************************
 *   All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbEKK3371C010Edit
 *	ソースファイル名：JKKejbEKK3371C010Edit.java
 *	作成者			：富士通
 *	日付			：2022年01月20日
 *＜機能概要＞
 *	他事業者割引契約対象契約適用終了部品クラス
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v57.00.00	2022/01/20	富士通		新規作成
 *
 **********************************************************************/
package eo.ejb.common.edit;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbs.cbsmsg.EKK3371C010CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * キャンペーン適用情報のギフトID有効期限年月日の編集を行う部品クラスです
 * </p>
 * @author 富士通
 */
public class JKKejbEKK3371C010Edit 
{
	/** プロパティ設定値：有効期限年 */
	private static final String GIFT_ID_HAKKO_KIGEN_MONTH = "KK_GIFTID_ISSUE_LIMIT_MONTH";
	/** プロパティ設定値：有効期限月 */
	private static final String GIFT_ID_HAKKO_KIGEN_YEAR = "KK_GIFTID_ISSUE_LIMIT_YEAR";
	/** 数値チェック用正規表現 */
	private static final String NUMBER_CHECK = "[0-9]+";
	
	/**
	 * コンストラクタです
	 */
	public JKKejbEKK3371C010Edit()
	{
	}
	
	/**
	 * ギフトIDの発行期限を計算して返却する。
	 * <br>
	 * @param inMsg
	 * @param inContext
	 * @return ギフト有効期限を返す。
	 */
	public static String getGiftIdHakkoKgn(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		try
		{
			String resultYmd = inMsg.getString(EKK3371C010CBSMsg.PRESENTCD_HAKKO_YMD);
			String year = JCMAPLConstMgr.getString(GIFT_ID_HAKKO_KIGEN_YEAR);
			if (year != null && year.matches(NUMBER_CHECK))
			{
				// 発行日がうるう年かどうかを判断する
				if (isLeapDay(resultYmd))
				{
					// １日だけ進める。
					resultYmd = JKKModelCommon.addDay(resultYmd, 1);
				}
				resultYmd = JKKModelCommon.addYear(resultYmd, Integer.parseInt(year));
			}
			String month = JCMAPLConstMgr.getString(GIFT_ID_HAKKO_KIGEN_MONTH);
			if (month != null && month.matches(NUMBER_CHECK))
			{
				resultYmd = JKKModelCommon.addMonth(resultYmd, Integer.parseInt(month));
			}
			return resultYmd;
		} catch (ParseException e) {
			inMsg.set(EKK3371C010CBSMsg.PRESENTCD_HAKKO_YMD_ERR, "EE");
			inMsg.set(EKK3371C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}
		return null;
	}
	
	/**
	 * うるう日チェック
	 * <br>
	 * @param ymd 
	 * @return
	 * @throws ParseException
	 */
	private static boolean isLeapDay(String ymd) throws ParseException
	{
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
		Calendar c = Calendar.getInstance();
		c.setTime(format.parse(ymd));
		
		// カレンダークラスがうるう年補正してもらえるので
		// 年はうるう年か判定しない
		int month = c.get(Calendar.MONTH);
		int day = c.get(Calendar.DAY_OF_MONTH);
		if (month == Calendar.FEBRUARY && day == 29)
		{
			return true;
		}
		return false;
	}
}
