/*
 * MosP - Mind Open Source Project         http://www.mosp.jp/
 * Copyright (C) 1987-2009 MIND Co., Ltd.  http://www.e-mind.co.jp/
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package jp.mosp.payroll.base;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

import jp.mosp.common.common.BaseVo;
import jp.mosp.common.common.ListVo;
import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.common.common.MospUtility;
import jp.mosp.common.dto.MosPConfDto;

/**
 * 給与システムのVOで用いられる共通機能を提供する。<br><br>
 * 給与システム内の各VOは、当クラスを拡張して実装される。
 */
public abstract class PayrollVo extends ListVo {
	
	private static final long serialVersionUID = -2887585326696702206L;
	
	/**
	 * 給与計算システムVO共通初期化処理を行う。<br><br>
	 * 以下の処理を行う。
	 * <ul><li>
	 * {@link BaseVo#BaseVo()}
	 * </li><li>
	 * {@link #setViewPath(String)}
	 * </li><li>
	 * javascript出力要設定
	 * </li></ul>
	 */
	protected PayrollVo() {
		super();
		setViewPath(getClassName());
		needDirectJs = true;
	}
	
	/**
	 * 給与システムのサブタイトルを設定する。<br>
	 */
	@Override
	protected void setSubTitle() {
		super.setSubTitle();
		subTitle = "　";
		aryMenu = new String[1][2];
		aryMenu[0][0] = "P1910";
		aryMenu[0][1] = getName("C_MENU") + getName("C_TO");
	}
	
	/**
	 * javascriptを取得する。<br>
	 */
	@Override
	public String getDirectJs(Class<?> cls) throws IllegalAccessException {
		return super.getDirectJs(cls);
	}
	
	/**
	 * ボタン配列要素を追加する。<br>
	 * @param cmd   コマンド
	 * @param title ボタンタイトル
	 */
	protected void addAryMenu(String cmd, String title) {
		String[][] aryNew = new String[aryMenu.length + 1][2];
		for (int i = 0; i < aryMenu.length; i++) {
			aryNew[i][0] = aryMenu[i][0];
			aryNew[i][1] = aryMenu[i][1];
		}
		aryNew[aryMenu.length][0] = cmd  ;
		aryNew[aryMenu.length][1] = title;
		aryMenu = aryNew;
	}
	
	/**
	 * 名称取得
	 * @param code  取得対象コード
	 * @return コード名称
	 */
	protected String getCodeName(String code, String[][] array) {
		String codeName = code;
		if (array == null) {
			return codeName;
		}
		for (int i = 0; i < array.length; i++) {
			if (code.equals(array[i][0])) {
				codeName = array[i][1];
				break;
			}
		}
		return codeName;
	}
	
	/**
	 * 削除フラグ名称を取得する。
	 * @param deleteFlag 削除フラグ
	 * @return 削除フラグ名称
	 */
	protected String getDeleteName(byte deleteFlag) {
		if (deleteFlag == MospConst.DELETE_FLAG_OFF) {
			return MospConst.DELETE_FLAG_OFF_NAME;
		} else if (deleteFlag == MospConst.DELETE_FLAG_ON) {
			return MospConst.DELETE_FLAG_ON_NAME;
		}
		return "";
	}
	
	/**
	 * 3桁区切カンマを挿入する。
	 * @param strTarget 対象文字列
	 * @return 3桁区切カンマ付き文字列
	 */
	public String insertComma(String strTarget) {
		if (strTarget == null || strTarget.equals("")) {
			return "";
		}
		return strTarget.replaceAll("(?m)(?<=\\d)(?=(?:\\d{3})+$)",",");
	}
	
	/**
	 * 明細区分配列を取得する。
	 * @return 明細区分配列
	 */
	protected String[][] getDetailTypeArray() {
		String[][] aryType = new String[8][2];
		aryType[0][0] = PayrollConst.DETAIL_TYPE_PT;
		aryType[1][0] = PayrollConst.DETAIL_TYPE_PA;
		aryType[2][0] = PayrollConst.DETAIL_TYPE_PD;
		aryType[3][0] = PayrollConst.DETAIL_TYPE_PB;
		aryType[4][0] = PayrollConst.DETAIL_TYPE_PS;
		aryType[5][0] = PayrollConst.DETAIL_TYPE_BA;
		aryType[6][0] = PayrollConst.DETAIL_TYPE_BD;
		aryType[7][0] = PayrollConst.DETAIL_TYPE_BS;
		aryType[0][1] = getName("P_PAYMENT") + getName("P_TIME");
		aryType[1][1] = getName("P_PAYMENT") + getName("P_ALLOWANCE");
		aryType[2][1] = getName("P_PAYMENT") + getName("P_DEDUCTION");
		aryType[3][1] = getName("P_PAYMENT") + getName("P_BREAKDOWN");
		aryType[4][1] = getName("P_PAYMENT") + getName("P_SUM");
		aryType[5][1] = getName("P_BONUS") + getName("P_ALLOWANCE");
		aryType[6][1] = getName("P_BONUS") + getName("P_DEDUCTION");
		aryType[7][1] = getName("P_BONUS") + getName("P_SUM");
		return aryType;
	}
	
	/**
	 * 和暦取得
	 * @param list 和暦情報リスト
	 * @param date 日付
	 * @return 日付配列
	 * @throws MospException 
	 */
	public String[] getJpImperialCal(List<MosPConfDto> list, Date date) throws MospException {
		String[] aryJpDate = new String[4];
		if (date == null) {
			return aryJpDate;
		}
		for (Iterator<MosPConfDto> it = list.iterator(); it.hasNext();) {
			MosPConfDto dto = it.next();
			Date startDate = getDate(dto.getConfCode ());
			Date endDate   = getDate(dto.getConfValue());
			if (startDate.compareTo(date) <= 0 && endDate.compareTo(date) >= 0) {
				int year = MospUtility.getYear(date) - MospUtility.getYear(startDate) + 1;
				aryJpDate[0] = dto.getConfId();
				aryJpDate[1] = String.valueOf(year);
				aryJpDate[2] = String.valueOf(MospUtility.getMonth(date));
				aryJpDate[3] = String.valueOf(MospUtility.getDay  (date));
				return aryJpDate;
			}
		}
		throw new MospException(MospConst.EX_DATE_INVALID);
	}
	
	/**
	 * 日付取得(/無し文字列用)
	 * @param strDate 日付文字列
	 * @return 日付
	 * @throws MospException 
	 */
	public 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)
		);
	}
	
}
