package jp.mosp.common.part;

import java.text.NumberFormat;
import java.util.Calendar;
import java.util.Date;

import jp.mosp.common.CommonConst;
import jp.mosp.common.common.BaseDto;
import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;

/**
 * 各種メソッドに関するPartクラス
 * @author yoshida
 *	@version	0.0.1
 */
public class VariousPart {

	/**
	 * 削除フラグリスト取得
	 * @return 削除フラグリスト
	 */
	public static String[][] getDeleteArray() {
		String[][] array = new String[2][2];
		array[0][0] = String.valueOf(MospConst.DELETE_FLAG_OFF);
		array[0][1] = MospConst.DELETE_FLAG_OFF_NAME;
		array[1][0] = String.valueOf(MospConst.DELETE_FLAG_ON);
		array[1][1] = MospConst.DELETE_FLAG_ON_NAME;
		return array;
	}

	/**
	 * 適用フラグリスト取得
	 * @return 削除フラグリスト
	 */
	public static String[][] getApplicableFlagArray() {
		String[][] array = new String[2][2];
		array[0][0] = String.valueOf(CommonConst.APPLICABLE_FLAG_OFF);
		array[0][1] = CommonConst.NAM_APPLICABLE_FLAG_OFF;
		array[1][0] = String.valueOf(CommonConst.APPLICABLE_FLAG_ON);
		array[1][1] = CommonConst.NAM_APPLICABLE_FLAG_ON;
		return array;
	}

	/**
	 * データ存在確認
	 * @param dto 確認対象DTO
	 * @return boolean	対象DTO存在有無
	 * @throws MospException
	 */
	public static boolean chkExistDto(BaseDto dto) {
		if (dto == null) {
			return false;
		}
		return true;
	}

	/**
	 * データ存在確認
	 * @param obj 確認対象Object
	 * @return boolean	対象Object存在有無
	 * @throws MospException
	 */
	public static boolean chkExistObject(Object obj) {
		if (obj == null) {
			return false;
		}
		return true;
	}

	/**
	 * 閲覧権限コード配列取得
	 * @return	閲覧権限コード配列
	 * <p>
	 * [0]…所属部署
	 * [1]…選択部署
	 * [2]…全部署
	 * </p>
	 */
	public static int[] getManageCode() {
		int[] aryCode = new int[3];
		aryCode[0] = Integer.parseInt(CommonConst.NUM_BELONGING_SECTION);
		aryCode[1] = Integer.parseInt(CommonConst.NUM_SELECT_SECTION);
		aryCode[2] = Integer.parseInt(CommonConst.NUM_ALL_SECTION);
		return aryCode;
	}

	/**
	 * キー値取得(複合キー)
	 * @param key2		対象キー
	 * @param keyIndex キーインデックス
	 * @return キー値
	 */
	public static String getKeyValue(String key, int keyIndex) {
		String[] aryKey= key.split(CommonConst.KEY_SEPARATOR);
		return aryKey[keyIndex];
	}


	/**
	 * 曜日設定
	 * @param dayOfWeek 曜日
	 * @return 曜日名
	 */
	public static String getDayOfWeek(int dayOfWeek) {
		switch (dayOfWeek) {
		case Calendar.SUNDAY:
			return CommonConst.NAM_SUNDAY;
		case Calendar.MONDAY:
			return CommonConst.NAM_MONDAY;
		case Calendar.TUESDAY:
			return CommonConst.NAM_TUESDAY;
		case Calendar.WEDNESDAY:
			return CommonConst.NAM_WEDNESDAY;
		case Calendar.THURSDAY:
			return CommonConst.NAM_THURSDAY;
		case Calendar.FRIDAY:
			return CommonConst.NAM_FRIDAY;
		case Calendar.SATURDAY:
			return CommonConst.NAM_SATURDAY;
		default:
			return "";
		}
	}

	/**
	 * 出力範囲プルダウンリスト
	 * @return	String[][]	出力範囲配列
	 */
	public static String[][] getOutputScopeArray() {
		// 範囲プルダウンリスト作成
		String[][] aryScope = new String[3][2];
		aryScope[0][0] = CommonConst.CODE_SCOPE_PERSONAL;
		aryScope[0][1] = CommonConst.NAM_SCOPE_PERSONAL;
		aryScope[1][0] = CommonConst.CODE_SCOPE_SECTION;
		aryScope[1][1] = CommonConst.NAM_SCOPE_SECTION;
		aryScope[2][0] = CommonConst.CODE_SCOPE_ALL;
		aryScope[2][1] = CommonConst.NAM_SCOPE_ALL;
		return aryScope;
	}

	/**
	 * 承認ステータスコードリスト取得
	 * @return 承認ステータスコードリスト配列
	 * <p>
	 * [0]…未承認（申請中）
	 * [1]…一次承認
	 * [2]…一次差戻
	 * [3]…二次承認
	 * [4]…二次差戻
	 * </p>
	 */
	public static String[] getApprovalStatusCodeArray() {
		// 配列の作成
		String[] aryStatus = new String[5];
		aryStatus[0] = CommonConst.NUM_ATTENDANCE_REQUEST;
		aryStatus[1] = CommonConst.NUM_ATTENDANCE_1ST_APPROVED;
		aryStatus[2] = CommonConst.NUM_ATTENDANCE_1ST_RETURNED;
		aryStatus[3] = CommonConst.NUM_ATTENDANCE_2ND_APPROVED;
		aryStatus[4] = CommonConst.NUM_ATTENDANCE_2ND_RETURNED;
		return aryStatus;
	}

	/**
	 * 閲覧権限プルダウンリスト
	 * @return	String[][]	出力範囲配列
	 */
	public static String[][] getManageArray() {
		// 範囲プルダウンリスト作成
		String[][] aryScope = new String[3][2];
		aryScope[0][0] = String.valueOf(getManageCode()[0]);
		aryScope[0][1] = CommonConst.NAM_BELONGING_SECTION;
		aryScope[1][0] = String.valueOf(getManageCode()[1]);
		aryScope[1][1] = CommonConst.NAM_SELECT_SECTION;
		aryScope[2][0] = String.valueOf(getManageCode()[2]);
		aryScope[2][1] = CommonConst.NAM_ALL_SECTION;
		return aryScope;
	}

	/**
	 * DTO同一性チェック
	 * @param formerDto		元対象DTO
	 * @param currentDto	現対象DTO
	 * @return
	 * <p>
	 * 更新日時が同一の場合true、そうでない場合false
	 * </p>
	 * @throws MospException 
	 */
	public static boolean chkIdentityDto(BaseDto formerDto, BaseDto currentDto) throws MospException {
		if (chkExistDto(currentDto)) {
			if (formerDto.getUpdateDate().compareTo(currentDto.getUpdateDate()) == 0) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 役職手当区分プルダウンリスト（有無＋給与情報単価）
	 * @return 役職手当区分配列
	 */
	public static String[][] getPositionAllowanceType1() {
		String[][] array = {
				{ CommonConst.CODE_ALLOWANCE_NONE, 		CommonConst.NAME_ALLOWANCE_NONE		},
				{ CommonConst.CODE_ALLOWANCE_STATE_1, 	CommonConst.NAME_ALLOWANCE_SALARY	}
		};
		return array.clone();
	}

	/**
	 * 役職手当区分プルダウンリスト（有無＋固定単価）
	 * @return 役職手当区分配列
	 */
	public static String[][] getPositionAllowanceType2() {
		String[][] array = {
				{ CommonConst.CODE_ALLOWANCE_NONE, 		CommonConst.NAME_ALLOWANCE_NONE		},
				{ CommonConst.CODE_ALLOWANCE_STATE_1, 	CommonConst.NAME_ALLOWANCE_FIXED	}
		};
		return array.clone();
	}

	/**
	 * 役職手当区分プルダウンリスト（有無＋給与情報単価＋固定単価）
	 * @return 役職手当区分配列
	 */
	public static String[][] getPositionAllowanceType3() {
		String[][] array = {
				{ CommonConst.CODE_ALLOWANCE_NONE, 		CommonConst.NAME_ALLOWANCE_NONE		},
				{ CommonConst.CODE_ALLOWANCE_STATE_1, 	CommonConst.NAME_ALLOWANCE_SALARY	},
				{ CommonConst.CODE_ALLOWANCE_STATE_2, 	CommonConst.NAME_ALLOWANCE_FIXED	}
		};
		return array.clone();
	}

	/**
	 * 該当フラグ配列
	 * @return 該当フラグ配列
	 */
	public static String[][] getCorrespondFlagArray() {
		String[][] array = {
				{ CommonConst.NAM_COMMON_FLAG_OFF,	CommonConst.NAM_DEFAULT_FLAG_OFF	},
				{ CommonConst.NAM_COMMON_FLAG_ON,	CommonConst.NAM_DEFAULT_FLAG_ON		}				
		};
		return array.clone();
	}

	/**
	 * フィールド名称内のデータ分解取得
	 *  0 : ファイルID
	 *  1 : 管理番号
	 *  2 : フィールドID
	 *  3 : フィールド名称
	 */
	public static String getEFnameItem(String csvString, int i) {
		//　管理番号取得
		if  (!csvString.equals(""))  {
			String[] arl = csvString.split(CommonConst.STR_CSV_SEPARATOR);
			return arl[i];
		}
		return "";
	}

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

	/**
	 * 時間差取得(分)
	 * @param date1 終了日付
	 * @param date2 開始日付
	 * @return 時間差(date1 - date2)
	 * @throws Exception
	 */
	public static long getTimeRemainder(Date date1, Date date2) {
		long timeRemainder = date1.getTime() - date2.getTime();
		return (timeRemainder / (1000 * 60));
	}

	/**
	 * 対象年から対象年度を取得
	 * @param year		対象年
	 * @param month		対象月
	 * @param startmonth	年度開始月
	 * @return	対象年度
	 * @throws Exception
	 */
	public static int getTargetFiscalYear(int year, int month, int startmonth) {
		// 年度開始月より前月の場合対象年の前年を使用する。
		// 年度開始月より後の月の場合は対象年を使用する
		int fiscalyear = year;
		if (month < startmonth) {
			fiscalyear--;
		}
		return fiscalyear;
	}

	/**
	 * 対象年度から対象年を取得
	 * @param fiscalyear		対象年度
	 * @param month				対象月
	 * @param startmonth		年度開始月
	 * @return	対象年
	 */
	public static int getTargetYear(int fiscalyear, int month, int startmonth) {
		// 年度開始月の前月は対象年度の翌年を利用する
		// 年度開始月の後の月は対象年度を使用する
		int year = fiscalyear;
		if (month < startmonth) {
			year++;
		}
		return year;
	}

}
