package jp.mosp.payroll.bonus.vo;

import java.util.Date;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import jp.mosp.payroll.base.Bonus;
import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.payroll.base.Employee;
import jp.mosp.payroll.base.PayrollConst;
import jp.mosp.payroll.base.PayrollVo;
import jp.mosp.payroll.bonus.BonusConst;


public class BonusCardVo extends PayrollVo {
	
	private static final long serialVersionUID = 3281945937471826907L;
	
	// URL、CSS
	private static final String RETURN_URL = "/jsp/payroll/bonus/bonusCard.jsp";
	private static final String EXTRA_JS   = "/pub/payroll/bonus/js/bonusCard.js";
	private static final String EXTRA_CSS  = "/pub/payroll/bonus/css/bonusCard.css";
	
	
	// 画面サブタイトル
	public final String SUB_TITLE = BonusConst.TTL_BONUS_CARD;

	public static final String PRM_PLT_YEAR        = "pltYear"    ;
	public static final String PRM_PLT_MONTH       = "pltMonth"   ;
	public static final String PRM_PLT_DAY         = "pltDay"     ;

	public static final String PRM_HID_K_CODE             = "hidKCode";
	public static final String PRM_HID_TARGET_YEAR        = "hidTargetYear";
	public static final String PRM_HID_TARGET_MONTH       = "hidTargetMonth";
	public static final String PRM_HID_TARGET_DAY         = "hidTargetDay";
	public static final String PRM_HID_CALC_STATUS        = "hidCalcStatus";
	public static final String PRM_HID_SELECT_LIST_CMD    = "hidSelectListCmd";	
	public static final String PRM_TXT_CHANGE_K_CODE      = "txtChangeKCode";
	
	// プルダウンリスト
	public String[][] aryPltYear ;
	public String[][] aryPltMonth;
	public String[][] aryPltDay;

	
	// 事業所名称取得用配列
	public String[][] aryStation;
	public String[][] aryPltCalcStatus;
	public  Date     payDay        ;

	private String   pltYear       = "";
	private String   pltMonth      = "";
	private String   pltDay        = "";

	public  Date     targetMonth   ;

	private String hidTargetYear	= "";
	private String hidTargetMonth	= "";
	private String hidTargetDay	= "";

	private String txtChangeKCode	= "";
	private String lblCalcStatus	= "";
	private String lblStationCode	= "";
	private String hidKCode		= "";
	
	
/****************  Mosp ***************************/	
	// フィールド
	private String lblKName		= "";
	private String lblSection		= "";
	private String lblCalcMonth	= "";
	private String kCode    = "";;
	private Date   calcMonth;
	
	// 画面モード
	private int mode;

	private String[][] aryTime;
	public String[][] aryAllowance  = {
		                               {"BA001"," ","0"},
	                                   {"BA002"," ","0"},
	                                   {"BA003"," ","0"},
	                                   {"BA004"," ","0"},
	                                   {"BA005"," ","0"},
	                                   {"BA006"," ","0"},
	                                   {"BA007"," ","0"},
	                                   {"BA008"," ","0"},
	                                   {"BA009"," ","0"},
	                                   {"BA010"," ","0"},
	                                   {"BA011"," ","0"},
	                                   {"BA012"," ","0"},
	                                   {"BA013"," ","0"},
	                                   {"BA014"," ","0"},
	                                   {"BA015"," ","0"},
	                                   {"BA016"," ","0"},
	                                   {"BA017"," ","0"},
	                                   {"BA018"," ","0"},
	                                   {"BA019"," ","0"},
	                                   {"BA020"," ","0"} };

			public String[][] aryDeduction	= {
                                       {"BD001"," ","0"},
	                                   {"BD002"," ","0"},
	                                   {"BD003"," ","0"},
	                                   {"BD004"," ","0"},
	                                   {"BD005"," ","0"},
	                                   {"BD006"," ","0"},
	                                   {"BD007"," ","0"},
	                                   {"BD008"," ","0"},
	                                   {"BD009"," ","0"},
	                                   {"BD010"," ","0"},
	                                   {"BD011"," ","0"},
	                                   {"BD012"," ","0"},
	                                   {"BD013"," ","0"},
	                                   {"BD014"," ","0"},
	                                   {"BD015"," ","0"},
	                                   {"BD016"," ","0"},
	                                   {"BD017"," ","0"},
	                                   {"BD018"," ","0"},
	                                   {"BD019"," ","0"},
	                                   {"BD020"," ","0"} };

	public String[][] aryBreakdown	= { {"PB001"," ",""}};
			



	public String[][] arySum       = { 
                                       {"BS001"," ","0"},
	                                   {"BS002"," ","0"},
	                                   {"BS003"," ","0"},
	                                   {"BS011"," ","0"},
	                                   {"BS012"," ","0"},
	                                   {"BS013"," ","0"} };

			// 文字列長
	public static final int LEN_MONEY    = PayrollConst.LEN_MONEY   ;
	public static final int LEN_TIME_INT = PayrollConst.LEN_TIME_INT;
	public static final int LEN_TIME_DEC = PayrollConst.LEN_TIME_DEC;

	/**
	 * {@link PayrollVo#PayrollVo()}を実行する。
	 */
	public BonusCardVo() {
		super();
		setRetUrl(RETURN_URL);
		setExtraJs(EXTRA_JS);
		setExtraCss(EXTRA_CSS);
	}
	
	/**
	 * リクエストからパラメータを取得、設定する。
	 * @param request リクエスト
	 */
	public void setParams(HttpServletRequest request) {
		txtChangeKCode       = request.getParameter(PRM_TXT_CHANGE_K_CODE     );
		hidKCode             = request.getParameter(PRM_HID_K_CODE            );
		hidTargetYear        = request.getParameter(PRM_PLT_YEAR       );
		hidTargetMonth       = request.getParameter(PRM_PLT_MONTH      );
		hidTargetDay         = request.getParameter(PRM_PLT_DAY         );
		
		for (Enumeration<?> en = request.getParameterNames(); en.hasMoreElements();) {
			String detailCode = (String)en.nextElement();
			setDetailAmount(detailCode, request.getParameter(detailCode));
		}
	}
	
	/**
	 * フィールドを設定する。
	 * @param employee 社員
	 * @param payment  賞与明細
	 */
	public void setFields(Employee employee, Bonus bonus) {
		// 人事情報設定
		this.lblKName     = employee.getKName      ();
		this.lblSection   = employee.getSectionName();
		this.kCode        = employee.getKCode		();
		if(bonus != null){
			this.lblCalcMonth = bonus.getCalcMonthStr();
			this.calcMonth    = bonus.getCalcMonth   ();
			// 賞与情報設定
			aryAllowance = bonus.getAllowanceArray(false);
			aryDeduction = bonus.getDeductionArray(false);
			arySum       = bonus.getSumArray      (false);
		}else{
			clearPayData();
		}
			
	}
	
	/**
	 * フィールドの妥当性確認
	 * @throws MospException
	 */
	public void validate() throws MospException {
		// 妥当性確認開始時処理
		startValidation();
		// 妥当性確認終了時処理
		endValidation();
	}
	
	/**
	 * フィールドを設定する(DTOに対するVO情報のセット)。
	 * @param payment 賞与明細
	 */
	public void setDtoFields(Bonus bonus) {
		bonus.setDetails(aryTime,aryAllowance, aryDeduction, aryBreakdown, arySum);
	}
	
	/**
	 * フィールドを設定する(DTOに対するVO情報のセット)。
	 * @param payment 賞与明細
	 */
	public void setDtoFields2(Employee employee, Bonus bonus, Date targetMonth) {
		bonus.setDetails2(aryTime,aryAllowance, aryDeduction, aryBreakdown, arySum, employee, targetMonth);
	}
	
	/* (non-Javadoc)
	 * @see jp.mosp.payroll.base.PayrollVo#getDirectJs(Class)
	 */
	@Override
	public String getDirectJs(Class<?> cls) throws IllegalAccessException {
		StringBuffer sb = new StringBuffer();
		sb.append(super.getDirectJs(cls));
		sb.append("var MODE = " + mode + ";");
	
		// 支給項目パラメータリスト作成
		sb.append("var ARY_ALLOWANCE = new Array(");
		for (int i = 0; i < aryAllowance.length; i++) {
			sb.append("\"" + aryAllowance[i][0] + "\", ");
		}
		if (aryAllowance.length > 0) {
			sb.delete(sb.length() - 2, sb.length());
		}
		sb.append(");");
		// 控除項目パラメータリスト作成
		sb.append("var ARY_DEDUCTION = new Array(");
		for (int i = 0; i < aryDeduction.length; i++) {
			sb.append("\"" + aryDeduction[i][0] + "\", ");
		}
		if (aryDeduction.length > 0) {
			sb.delete(sb.length() - 2, sb.length());
		}
		sb.append(");");
		// 内訳項目パラメータリスト作成
		sb.append("var ARY_BREAKDOWN = new Array(");
		for (int i = 0; i < aryBreakdown.length; i++) {
			sb.append("\"" + aryBreakdown[i][0] + "\", ");
		}
		if (aryBreakdown.length > 0) {
			sb.delete(sb.length() - 2, sb.length());
		}
		sb.append(");");
		// 合計項目パラメータリスト作成
		sb.append("var ARY_SUM = new Array(");
		for (int i = 0; i < arySum.length; i++) {
			sb.append("\"" + arySum[i][0] + "\", ");
		}
		if (arySum.length > 0) {
			sb.delete(sb.length() - 2, sb.length());
		}
		sb.append(");");
		return sb.toString();
	}
	
	
	/**
	 * 支給明細件数を取得する。<br>
	 * @return 支給明細値
	 */
	public int getAllowanceCount() {
		return aryAllowance.length;
	}
	
	/**
	 * 控除明細件数を取得する。<br>
	 * @return 控除明細値
	 */
	public int getDeductionCount() {
		return aryDeduction.length;
	}
	
	/**
	 * 内訳明細件数を取得する。<br>
	 * @return 内訳明細値
	 */
	public int getBreakdownCount() {
		return aryBreakdown.length;
	}
	
	/**
	 * 合計明細件数を取得する。<br>
	 * @return 合計明細値
	 */
	public int getSumCount() {
		return arySum.length;
	}
	
	/**
	 * 支給明細値を取得する。<br>
	 * @param idx インデックス
	 * @return 支給明細値
	 */
	public String getAllowanceAmount(int idx) {
		return aryAllowance[idx][2];
	}
	
	/**
	 * 控除明細値を取得する。<br>
	 * @param idx インデックス
	 * @return 控除明細値
	 */
	public String getDeductionAmount(int idx) {
		return aryDeduction[idx][2];
	}
	
	/**
	 * 内訳明細値を取得する。<br>
	 * @param idx インデックス
	 * @return 内訳明細値
	 */
	public String getBreakdownAmount(int idx) {
		return aryBreakdown[idx][2];
	}
	
	/**
	 * 控除明細値を取得する。<br>
	 * @param idx インデックス
	 * @return 控除明細値
	 */
	public String getSumAmount(int idx) {
		return arySum[idx][2];
	}

	
	/**
	 * 支給明細コードを取得する。<br>
	 * @param idx インデックス
	 * @return 支給明細コード
	 */
	public String getAllowanceCode(int idx) {
		return aryAllowance[idx][0];
	}
	
	/**
	 * 控除明細コードを取得する。<br>
	 * @param idx インデックス
	 * @return 控除明細コード
	 */
	public String getDeductionCode(int idx) {
		return aryDeduction[idx][0];
	}
	
	/**
	 * 内訳明細コードを取得する。<br>
	 * @param idx インデックス
	 * @return 内訳明細コード
	 */
	public String getBreakdownCode(int idx) {
		return aryBreakdown[idx][0];
	}
	
	/**
	 * 合計明細コードを取得する。<br>
	 * @param idx インデックス
	 * @return 合計明細コード
	 */
	public String getSumCode(int idx) {
		return arySum[idx][0];
	}
	

	/**
	 * 支給明細名称を取得する。<br>
	 * @param idx インデックス
	 * @return 支給明細名称
	 */
	public String getAllowanceName(int idx) {
		return escapeHTML(aryAllowance[idx][1]);
	}
	
	/**
	 * 控除明細名称を取得する。<br>
	 * @param idx インデックス
	 * @return 控除明細名称
	 */
	public String getDeductionName(int idx) {
		return escapeHTML(aryDeduction[idx][1]);
	}
	
	/**
	 * 内訳明細名称を取得する。<br>
	 * @param idx インデックス
	 * @return 内訳明細名称
	 */
	public String getBreakdownName(int idx) {
		return escapeHTML(aryBreakdown[idx][1]);
	}
	
	/**
	 * 合計明細名称を取得する。<br>
	 * @param idx インデックス
	 * @return 合計明細名称
	 */
	public String getSumName(int idx) {
		return escapeHTML(arySum[idx][1]);
	}
	
	/**
	 * 計算年月を取得する。
	 * @return 計算年月
	 */
	public Date getCalcMonth() {
		return getDateField(calcMonth);
	}
	
	/**
	 * 計算年月を設定する。
	 * @param calcMonth 設定する計算年月
	 */
	public void setCalcMonth(Date calcMonth) {
		this.calcMonth = getDateField(calcMonth);
	}
	
	/**
	 * 計算年月を取得する。
	 * @return 計算年月
	 */
	public String getEscLblCalcMonth() {
		return escapeHTML(lblCalcMonth);
	}
	
	/**
	 * 計算年月を設定する。
	 * @param lblCalcMonth 設定する計算年月
	 */
	public void setLblCalcMonth(String lblCalcMonth) {
		this.lblCalcMonth = lblCalcMonth;
	}
	
	/**
	 * 社員コードを取得する。
	 * @return 社員コード
	 */
	public String getKCode() {
		return kCode;
	}
	
	/**
	 * 社員コードを取得する。
	 * @return 社員コード
	 */
	public String getEscKCode() {
		return escapeHTML(kCode);
	}
	
	/**
	 * 社員コードを設定する。
	 * @param lblKCode 設定する社員コード
	 */
	public void setKCode(String lblKCode) {
		this.kCode = lblKCode;
	}
	
	/**
	 * 社員名を取得する。
	 * @return 社員名
	 */
	public String getLblKName() {
		return lblKName;
	}
	
	/**
	 * 社員名を取得する。
	 * @return 社員名
	 */
	public String getEscLblKName() {
		return escapeHTML(lblKName);
	}
	
	/**
	 * 社員名を設定する。
	 * @param lblKName 設定する社員名
	 */
	public void setLblKName(String lblKName) {
		this.lblKName = lblKName;
	}
	
	/**
	 * 所属を取得する。
	 * @return 所属
	 */
	public String getEscLblSection() {
		return escapeHTML(lblSection);
	}

	/**
	 * 所属を設定する。
	 * @param lblSection 設定する所属
	 */
	public void setLblSection(String lblSection) {
		this.lblSection = lblSection;
	}

	/**
	 * 明細値を設定する。<br>
	 * @param aryDetail  明細配列
	 * @param detailCode 明細コード
	 * @param amount     明細値
	 */
	private void setDetailAmount(String detailCode, String amount) {
		for (int i = 0; i < aryAllowance.length; i++) {
			if (aryAllowance[i][0].equals(detailCode)) {
				aryAllowance[i][2] = amount;
				return;
			}
		}
		for (int i = 0; i < aryDeduction.length; i++) {
			if (aryDeduction[i][0].equals(detailCode)) {
				aryDeduction[i][2] = amount;
				return;
			}
		}
		for (int i = 0; i < aryBreakdown.length; i++) {
			if (aryBreakdown[i][0].equals(detailCode)) {
				aryBreakdown[i][2] = amount;
				return;
			}
		}
		for (int i = 0; i < arySum.length; i++) {
			if (arySum[i][0].equals(detailCode)) {
				arySum[i][2] = amount;
				return;
			}
		}
	}
	
	/**
	 * 画面モードを設定する。<br><br>
	 * 0:登録可、1：登録不可
	 * @param mode 設定する画面モード
	 */
	public void setMode(int mode) {
		this.mode = mode;
	}
	
	
	
	
/*******************************  Unic **************************************/	
	// アクセサメソッド
	public void setHidKCode				(String hidKCode		) { this.hidKCode = hidKCode ; }
	public void setPltYear					(String pltYear			) { this.pltYear  = pltYear     ; }
	public void setPltMonth				(String pltMonth		) { this.pltMonth = pltMonth    ; }
	public void setPltDay					(String pltDay			) { this.pltDay   = pltDay      ; }
	public void setTxtChangeKCode			(String txtChangeKCode	) { this.txtChangeKCode       = txtChangeKCode      ;}

	public String getEscHidTargetYear      () { return escapeHTML(hidTargetYear       ); }
	public String getEscHidTargetMonth     () { return escapeHTML(hidTargetMonth      ); }
	public String getEscHidTargetDay       () { return escapeHTML(hidTargetDay        ); }
	public String getEscTxtChangeKCode		() { return escapeHTML(txtChangeKCode      ); }
	public String getEscLblCalcStatus		() { return escapeHTML(lblCalcStatus       ); }
	public String getEscLblStationCode		() { return escapeHTML(lblStationCode      ); }
	public String getEscLblStationName		() { return escapeHTML(lblSection      ); }
	public String getEscLblKCode			() { return escapeHTML(kCode				); }
	public String getEscHidKCode			() { return escapeHTML(hidKCode            ); }
	public String getHidKCode				() { return kCode							; }
	public String getHidTargetYear			() { return hidTargetYear					; }
	public String getHidTargetMonth			() { return hidTargetMonth					; }
	public String getHidTargetDay			() { return hidTargetDay					; }
	public String getPltYear				() { return pltYear							; }
	public String getPltMonth				() { return pltMonth						; }
	public String getPltDay					() { return pltDay							; }
	public String getTxtChangeKCode			() { return txtChangeKCode					; }


	/**
	 * サブタイトル取得
	 * @param subTitle サブタイトル
	 * @param cmdMenu  メニューコマンド
	 * @return サブタイトルHTML文字列
	 */
	public String getSubTitle(String subTitle, String cmdMenu) {
		StringBuffer sb = new StringBuffer();
		sb.append("<div class=\"Header\">");
		sb.append("<div class=\"MenuButtonBar\">");
		sb.append("<button type=\"button\" ");
		sb.append("onclick=\"doSubmit(document.form, '");
		sb.append(cmdMenu);
		sb.append("')\">メニューへ</button>");
		sb.append("<button type=\"button\" id=\"btnLogout\" ");
		sb.append("onclick=\"doSubmit(document.form, '");
		sb.append(MospConst.CMD_LOGOUT);
		sb.append("')\">ログアウト</button>");
		sb.append("</div>");
		sb.append("<div class=\"SubTitleBar\">");
		sb.append(subTitle);
		sb.append("</div>");
		sb.append("</div>");
		return sb.toString();
	}
	
	/**
	 * 賞与支給日設定
	 * @param year
	 * @param month
	 * @param day
	 * @throws MospException
	 */
	public void setPayDay(
			String year, String month, String day
	) throws MospException {
		payDay = getDate(year, month, day);
	}
	
	/**
	 * 対象年月設定
	 * @param year
	 * @param month
	 * @throws MospException
	 */
	public void setTargetMonth(
			String year, String month
	) throws MospException {
		targetMonth = getDate(year, month, String.valueOf(BonusConst.TIME_DEFAULT_DAY));
	}

	/**
	 * 表示項目の初期化
	 */
	public void clearPayData(){
		// 支払項目名の設定
		for (int i = 0; i < aryAllowance.length ; i++) {
				aryAllowance[i][2] = "0";
		}
		// 控除項目名の設定
		for (int i = 0; i < aryDeduction.length ; i++) {
				aryDeduction[i][2] = "0";
		}

		// 支払総額項目名の設定
		for (int i = 0; i < arySum.length ; i++) {
			arySum[i][2] = "0";
		}
	}
	
}

