package jp.mosp.common.part;

import java.text.NumberFormat;

import jp.mosp.common.CommonConst;

/**
 * 時間、時刻に関するPartクラス
 * @author yoshida
 *	@version	0.0.3
 */
public class TimePart {

	/**
	 * int時刻の時間をString時に変換
	 * @param time	時刻（0時からの経過分数）
	 * @return	string	時間（時）
	 */
	public static String convIntegerTimeToStringHour(int time) {
		return String.valueOf(convIntegerTimeToIntegerHour(time));
	}

	/**
	 * int時刻の時間をString時に変換
	 * @since	0.0.3
	 * @param time	時刻（0時からの経過分数）
	 * @return	string	時間（時）
	 */
	public static int convIntegerTimeToIntegerHour(int time) {
		return time / 60;
	}

	/**
	 * int時刻の分をString分に変換
	 * @param time	時刻（0時からの経過分数）
	 * @return	string	時間（分）
	 */
	public static String convIntegerTimeToStringMinutes(int time) {
		return String.valueOf(convIntegerTimeToIntegerMinutes(time));
	}

	/**
	 * int時刻の分をString分に変換
	 * @since	0.0.3
	 * @param time	時刻（0時からの経過分数）
	 * @return	string	時間（分）
	 */
	public static int convIntegerTimeToIntegerMinutes(int time) {
		return time % 60;
	}

	/**
	 * String時刻の時間をString時に変換
	 * @param time HH:MM
	 * @return HH
	 */
	public static String convStringTimeToStringHour(String time) {
		if (time.equals("")) {
			return "0";
		} else {
			return convIntegerTimeToStringHour(convStringTimeToIntegerTime(time));
		}
	}

	/**
	 * String時刻の分をString分に変換
	 * @param time HH:MM
	 * @return MM
	 */
	public static String convStringTimeToStringMinutes(String time) {
		if (StringPart.isNull(time)) {
			return "0";
		} else {
			return convIntegerTimeToStringMinutes(convStringTimeToIntegerTime(time));
		}
	}

	/**
	 * 時刻変換（int→String）
	 * @param time 時刻（0時からの経過分数）
	 * @return HH:MM
	 */
	public static String convIntegerTimeToStringTime(int time) {
		StringBuffer sb = new StringBuffer();
		sb.append(StringPart.addZero(convIntegerTimeToIntegerHour(time)));
		sb.append(CommonConst.STR_TIME_SEPARATOR);
		sb.append(StringPart.addZero(convIntegerTimeToIntegerMinutes(time)));
		return sb.toString();
	}

	/**
	 * 時刻変換（int→String）
	 * @param time  時刻（0時からの経過分数）
	 * @return HH時MM分
	 */
	public static String convIntegerTimeToJPTime(int time) {
		StringBuffer sb = new StringBuffer();
		sb.append(StringPart.addZero(convIntegerTimeToIntegerHour(time)));
		sb.append(CommonConst.NAM_HOUR);
		sb.append(StringPart.addZero(convIntegerTimeToIntegerMinutes(time)));
		sb.append(CommonConst.NAM_MINUTES);
		return sb.toString();
	}

	/**
	 * 時刻変換（String→int）
	 * @param time 時刻（HH:MM）
	 * @return int	時刻（0時からの経過分数）
	 */
	public static int convStringTimeToIntegerTime(String time) {
		String targetTime = time;
		if (StringPart.isNull(time)) {
			targetTime = "0:0";
		}
		String[] ar = targetTime.split(CommonConst.STR_TIME_SEPARATOR);
		return convStringTimeToIntegerTime(ar[0], ar[1]);
	}

	/**
	 * 時刻変換（String→int）
	 * @param hour 時
	 * @param min 分
	 * @return int	時刻（0時からの経過分数）
	 */
	public static int convStringTimeToIntegerTime(String hour, String min) {
		return convIntegerTimeToIntegerTime(
				NumberPart.getIntParam(hour),
				NumberPart.getIntParam(min)
		);
	}

	/**
	 * 時刻変換（String→String）
	 * @param hour 時
	 * @param min 分
	 * @return	HH:mm
	 */
	public static String convStringTimeFormatted(String hour, String min) {
		StringBuffer sb = new StringBuffer();
		sb.append(StringPart.addZero(hour));
		sb.append(CommonConst.STR_TIME_SEPARATOR);
		sb.append(StringPart.addZero(min));
		return sb.toString();
	}

	/**
	 * 時間変換（int→double）
	 * @param time 時刻（0時からの経過分数）
	 * @return hh.mm <br>分はそのまま
	 * 				[例] 65分→1.05
	 */
	public static double convIntegerTimeToDoubleTime(int time) {
		double dblhour = Math.floor((double)time / 60);
		double dblmin =(double)time % 60 / 100;
		double dtime = dblhour + dblmin;
		return dtime;
	}

	/**
	 * 時間変換（int→String）
	 * <p>[例] 90分→1.5</p>
	 * <p>15分単位の場合のみ利用してください。</p>
	 * @param time 時刻（0時からの経過分数）
	 * @return hh.mm 
	 */
	public static String convIntegerMinToStringHour(int time) {
		double dblhour = Math.floor((double)time / 60);
		double dblmin = (double)time % 60 / 60;
		double dtime = dblhour + dblmin;
		return String.valueOf(dtime);
	}

	/**
	 * 時間変換（int→String）
	 * @param time 時刻（0時からの経過分数）
	 * @return HH時間MM分
	 */
	public static String convIntegerTimeToJPHours(int time) {
		StringBuffer sb = new StringBuffer();
		sb.append(convIntegerTimeToStringHour(time));
		sb.append(CommonConst.NAM_COMMON_TIME);
		sb.append(StringPart.addZero(convIntegerTimeToStringMinutes(time)));
		sb.append(CommonConst.NAM_MINUTES);
		return sb.toString();
	}

	/**
	 * 時間フォーマット
	 * @param hour 時間
	 * @return 時間(文字列)
	 */
	public static String getHourString(double hour) {
		NumberFormat nf = NumberFormat.getNumberInstance();
		nf.setMaximumFractionDigits(2);
		nf.setMinimumFractionDigits(2);
		return nf.format(hour);
	}

	/**
	 * 時刻変換（int→int）
	 * @since	0.0.2
	 * @param hour 時
	 * @param min 分
	 * @return int	時刻（0時からの経過分数）
	 */
	public static int convIntegerTimeToIntegerTime(int hour, int min) {
		return (hour * 60) + min;
	}

}
