package jp.mosp.payroll.base;

import java.util.Calendar;
import java.util.Date;

import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.common.common.MospUtility;

/**
 * MosP給与計算を開発する上で有用なメソッドを提供する。<br><br>
 */
public class PayrollUtility {
	
	/**
	 * 日付を取得する。
	 * @param strDate 日付(yyyymmdd)
	 * @return 日付
	 * @throws MospException 
	 */
	public static Date getDate(String strDate) throws MospException {
		if (strDate == null || strDate.length() != 8) {
			throw new MospException(MospConst.EX_DATE_INVALID);
		}
		return MospUtility.getDate(
				strDate.substring(0, 4) + PayrollConst.SEPARATOR_DATE +
				strDate.substring(4, 6) + PayrollConst.SEPARATOR_DATE +
				strDate.substring(6, 8));
	}
	
	/**
	 * 年齢を取得する。
	 * @param birthDate 生年月日
	 * @param toDate    年齢起算日
	 * @return 年齢
	 */
	public static int getAge(Date birthDate, Date toDate) {
		// 取得準備
		int age = 0;
		// 年齢取得
		age = MospUtility.getYear(toDate) - MospUtility.getYear(birthDate);
		// 年齢起算日が誕生年よりなら0
		if (age < 0) {
			age = 0;
			return age;
		}
		// 対象月が誕生月以降
		if (MospUtility.getMonth(toDate) - MospUtility.getMonth(birthDate) > 0) {
			return age;
		} else if (MospUtility.getMonth(toDate) - MospUtility.getMonth(birthDate) == 0) {
			// 対象日が誕生日以降
			if (MospUtility.getDay(toDate) - MospUtility.getDay(birthDate) > 0) {
				return age;
			} else if (MospUtility.getDay(toDate) - MospUtility.getDay(birthDate) == 0) {
				// 対象日が誕生日
				return age;
			} else {
				// 対象日が誕生日以前
				return age - 1;
			}
		} else {
			// 対象月が誕生月以前
			return age - 1;
		}
	}
	
	/**
	 * 日を操作する。
	 * @param date   操作日付
	 * @param amount 増減日数
	 * @return 操作後日付
	 */
	public static Date addDay(Date date, int amount) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.add(Calendar.DAY_OF_MONTH, amount);
		return cal.getTime();
	}
	
}
