/*
 * MosP - Mind Open Source Project    http://www.mosp.jp/
 * Copyright (C) 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 Affero General Public License
 * as published by the Free Software Foundation, either version 3
 * 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 Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package jp.mosp.platform.bean.human.base;

import java.sql.Connection;
import java.util.Date;

import jp.mosp.framework.base.MospException;
import jp.mosp.framework.base.MospParams;
import jp.mosp.framework.utils.MospUtility;
import jp.mosp.platform.base.PlatformBean;
import jp.mosp.platform.bean.file.PlatformFileBean;
import jp.mosp.platform.constant.PlatformMessageConst;
import jp.mosp.platform.dao.human.EntranceDaoInterface;
import jp.mosp.platform.dao.human.RetirementDaoInterface;
import jp.mosp.platform.dao.system.PositionDaoInterface;
import jp.mosp.platform.dao.system.SectionDaoInterface;
import jp.mosp.platform.dto.human.EntranceDtoInterface;
import jp.mosp.platform.dto.human.HumanDtoInterface;
import jp.mosp.platform.dto.human.RetirementDtoInterface;
import jp.mosp.platform.dto.system.PositionDtoInterface;
import jp.mosp.platform.dto.system.SectionDtoInterface;

/**
 * MosPプラットフォーム人事管理におけるBeanの基本機能を提供する。<br>
 */
public abstract class PlatformHumanBean extends PlatformFileBean {
	
	/**
	 * {@link PlatformHumanBean}を生成する。<br>
	 */
	public PlatformHumanBean() {
		// 処理無し
	}
	
	/**
	 * {@link PlatformBean#PlatformBean()}を実行する。<br>
	 * @param mospParams 設定するMosP処理情報
	 * @param connection 設定するデータベースコネクション
	 */
	protected PlatformHumanBean(MospParams mospParams, Connection connection) {
		super(mospParams, connection);
	}
	
	/**
	 * 社員名を取得する。<br>
	 * @param dto 人事マスタDTO。
	 * @return 社員名
	 */
	protected String getHumanName(HumanDtoInterface dto) {
		if (dto == null) {
			return "";
		}
		return MospUtility.getHumansName(dto.getFirstName(), dto.getLastName());
	}
	
	/**
	 * 入社日を取得する。<br>
	 * 入社情報が存在しない場合はnullを返す。<br>
	 * @param personalId 個人ID
	 * @return 入社日
	 * @throws MospException インスタンスの取得、或いはSQL実行に失敗した場合
	 */
	protected Date getEntranceDate(String personalId) throws MospException {
		// 人事入社情報DAO準備
		EntranceDaoInterface entranceDao = (EntranceDaoInterface)createDao(EntranceDaoInterface.class);
		EntranceDtoInterface dto = entranceDao.findForInfo(personalId);
		if (dto != null) {
			return dto.getEntranceDate();
		}
		return null;
	}
	
	/**
	 * 退職日を取得する。<br>
	 * 退職情報が存在しない場合はnullを返す。<br>
	 * @param personalId 個人ID
	 * @return 退職日
	 * @throws MospException インスタンスの取得、或いはSQL実行に失敗した場合
	 */
	protected Date getRetirementDate(String personalId) throws MospException {
		// 人事退職情報DAO準備
		RetirementDaoInterface retirementDao = (RetirementDaoInterface)createDao(RetirementDaoInterface.class);
		RetirementDtoInterface dto = retirementDao.findForInfo(personalId);
		if (dto != null) {
			return dto.getRetirementDate();
		}
		return null;
	}
	
	/**
	 * 所属存在確認を行う。<br>
	 * @param sectionCode 所属コード
	 * @param targetDate  対象日
	 * @param row         行インデックス
	 * @throws MospException インスタンスの取得、或いはSQL実行に失敗した場合
	 */
	protected void checkSection(String sectionCode, Date targetDate, Integer row) throws MospException {
		// 所属確認
		if (sectionCode.isEmpty()) {
			return;
		}
		// 所属マスタDAO取得
		SectionDaoInterface sectionDao = (SectionDaoInterface)createDao(SectionDaoInterface.class);
		// 所属情報取得
		SectionDtoInterface dto = sectionDao.findForInfo(sectionCode, targetDate);
		// 所属情報確認
		if (dto == null) {
			// 所属が存在しない場合のメッセージを追加
			addSectionNotExistMessage(sectionCode, row);
			return;
		}
		if (isDtoActivate(dto) == false) {
			// 所属が無効な場合のメッセージを追加
			addSectionInactiveMessage(sectionCode, row);
		}
	}
	
	/**
	 * 職位存在確認を行う。<br>
	 * @param positionCode 職位コード
	 * @param targetDate   対象日
	 * @param row          行インデックス
	 * @throws MospException インスタンスの取得、或いはSQL実行に失敗した場合
	 */
	protected void checkPosition(String positionCode, Date targetDate, Integer row) throws MospException {
		// 職位確認
		if (positionCode.isEmpty()) {
			return;
		}
		// 職位マスタDAO取得
		PositionDaoInterface positionDao = (PositionDaoInterface)createDao(PositionDaoInterface.class);
		// 職位情報取得
		PositionDtoInterface dto = positionDao.findForInfo(positionCode, targetDate);
		// 職位情報確認
		if (dto == null) {
			// 職位が存在しない場合のメッセージを追加
			addPositionNotExistMessage(positionCode, row);
			return;
		}
		if (isDtoActivate(dto) == false) {
			// 職位が無効な場合のメッセージを追加
			addPositionInactiveMessage(positionCode, row);
		}
	}
	
	/**
	 * 所属が存在しない場合のメッセージを設定する。<br>
	 * @param sectionCode 所属コード
	 * @param row         行インデックス
	 */
	protected void addSectionNotExistMessage(String sectionCode, Integer row) {
		mospParams.addErrorMessage(PlatformMessageConst.MSG_SELECTED_CODE_NOT_EXIST, getRowedFieldName(
				getNameSection(), row), sectionCode);
	}
	
	/**
	 * 所属が無効である場合のメッセージを設定する。<br>
	 * @param sectionCode 所属コード
	 * @param row         行インデックス
	 */
	protected void addSectionInactiveMessage(String sectionCode, Integer row) {
		mospParams.addErrorMessage(PlatformMessageConst.MSG_SELECTED_CODE_INACTIVE, getRowedFieldName(getNameSection(),
				row), sectionCode);
	}
	
	/**
	 * 職位が存在しない場合のメッセージを設定する。<br>
	 * @param positionCode 職位コード
	 * @param row          行インデックス
	 */
	protected void addPositionNotExistMessage(String positionCode, Integer row) {
		mospParams.addErrorMessage(PlatformMessageConst.MSG_SELECTED_CODE_NOT_EXIST, getRowedFieldName(
				getNamePosition(), row), positionCode);
	}
	
	/**
	 * 職位が無効である場合のメッセージを設定する。<br>
	 * @param positionCode 職位コード
	 * @param row          行インデックス
	 */
	protected void addPositionInactiveMessage(String positionCode, Integer row) {
		mospParams.addErrorMessage(PlatformMessageConst.MSG_SELECTED_CODE_INACTIVE, getRowedFieldName(
				getNamePosition(), row), positionCode);
	}
	
	/**
	 * 社員が入社していない場合のメッセージを設定する。<br>
	 */
	protected void addEmployeeNotEnteredMessage() {
		mospParams.addErrorMessage(PlatformMessageConst.MSG_EMPLOYEE_IS_NOT, getNameEntrance(), null);
	}
	
	/**
	 * 社員の履歴が存在しない場合のメッセージを設定する。<br>
	 * @param employeeCode 社員コード
	 * @param targetDate   対象日
	 */
	protected void addEmployeeHistoryNotExistMessage(String employeeCode, Date targetDate) {
		mospParams.addErrorMessage(PlatformMessageConst.MSG_EMP_HISTORY_NOT_EXIST, getStringDate(targetDate),
				employeeCode);
	}
	
	/**
	 * 期間が重複する場合のメッセージを設定する。<br>
	 * @param duplicated 重複対象
	 */
	protected void addDuplicateTermMessage(String duplicated) {
		mospParams.addErrorMessage(PlatformMessageConst.MSG_TERM_DUPLICATE, duplicated, null);
	}
	
	/**
	 * 入社名称を取得する。<br>
	 * @return 入社名称
	 */
	protected String getNameEntrance() {
		return mospParams.getName("Joined");
	}
	
	/**
	 * 入社日名称を取得する。<br>
	 * @return 入社日名称
	 */
	protected String getNameEntranceDate() {
		return getNameEntrance() + mospParams.getName("Day");
	}
	
	/**
	 * 退職日名称を取得する。<br>
	 * @return 退職日名称
	 */
	protected String getNameRetirementDate() {
		return mospParams.getName("RetirementOn") + mospParams.getName("Day");
	}
	
	/**
	 * 休職名称を取得する。<br>
	 * @return 休職名称
	 */
	protected String getNameSuspension() {
		return mospParams.getName("RetirementLeave");
	}
	
	/**
	 * 休職開始日名称を取得する。<br>
	 * @return 休職開始日名称
	 */
	protected String getNameSuspensionStartDate() {
		return getNameSuspension() + mospParams.getName("Start") + mospParams.getName("Day");
	}
	
	/**
	 * 休職終了日名称を取得する。<br>
	 * @return 休職終了日名称
	 */
	protected String getNameSuspensionEndDate() {
		return getNameSuspension() + mospParams.getName("End") + mospParams.getName("Day");
	}
	
	/**
	 * 休職終了予定日名称を取得する。<br>
	 * @return 休職終了予定日名称
	 */
	protected String getNameSuspensionScheduledEndDate() {
		return getNameSuspension() + mospParams.getName("End") + mospParams.getName("Schedule")
				+ mospParams.getName("Day");
	}
	
	/**
	 * 兼務名称を取得する。<br>
	 * @return 兼務名称
	 */
	protected String getNameConcurrent() {
		return mospParams.getName("Concurrent");
	}
	
	/**
	 * 兼務開始日名称を取得する。<br>
	 * @return 兼務開始日名称
	 */
	protected String getNameConcurrentStartDate() {
		return getNameConcurrent() + mospParams.getName("Start") + mospParams.getName("Day");
	}
	
	/**
	 * 兼務終了日名称を取得する。<br>
	 * @return 兼務終了日名称
	 */
	protected String getNameConcurrentEndDate() {
		return getNameConcurrent() + mospParams.getName("End") + mospParams.getName("Day");
	}
	
}
