package jp.mosp.common.part;

import java.sql.Connection;
import java.util.Properties;

import jp.mosp.common.common.MospException;
import jp.mosp.common.dto.CmAspUserDto;
import jp.mosp.common.dto.CmUserDto;

/**
 * Partマネージャー
 * @author yoshida
 *	@version	0.0.2
 */
public class PartManager {

	/**
	 * PartInfo生成
	 * @param cfg
	 * @param cmd
	 * @param aspUser
	 * @param user
	 * @param conn
	 * @return
	 */
	public static PartInfo createPartInfo(
			Properties cfg,
			String cmd,
			CmAspUserDto aspUser,
			CmUserDto user,		
			Connection conn
	) {
		return new PartInfo(cfg, cmd, aspUser, user, conn);
	}

	/**
	 * Partクラスインスタンス生成
	 * @param partClassName		対象Partクラス名称
	 * @param partInfo			初期化情報
	 * @return					Partクラスインスタンス
	 * @throws MospException
	 */
	public static BasePart getPreparedPart(String partClassName, PartInfo partInfo) throws MospException {
		return PartFactory.create(partClassName, partInfo);
	}

	/**
	 * Partクラスインスタンス生成
	 * @param partType			対象Partクラスタイプ
	 * @param partInfo			初期化情報
	 * @return					Partクラスインスタンス
	 * @throws MospException
	 */
	public static BasePart getPreparedPart(PartType partType, PartInfo partInfo) throws MospException {
		return getPreparedPart(partType.toString(), partInfo);
	}

	/**
	 * CmCodePartインスタンス取得
	 * @param partInfo
	 * @return	CmCodePartインスタンス
	 * @throws MospException
	 */
	public static CmCodePart cmcode(PartInfo partInfo) throws MospException {
		return (CmCodePart)getPreparedPart(PartType.cmcode, partInfo);
	}

	/**
	 * MosPConfPartインスタンス取得
	 * @param partInfo
	 * @return	MosPConfPartインスタンス
	 * @throws MospException
	 */
	public static MosPConfPart mospconf(PartInfo partInfo) throws MospException {
		return (MosPConfPart)getPreparedPart(PartType.mospconf, partInfo);
	}

	/**
	 * MosPCodePartインスタンス取得
	 * @param partInfo
	 * @return	MosPCodePartインスタンス
	 * @throws MospException
	 */
	public static MosPCodePart mospcode(PartInfo partInfo) throws MospException {
		return (MosPCodePart)getPreparedPart(PartType.mospcode, partInfo);
	}

	/**
	 * CalculatePartインスタンス取得
	 * @param partInfo
	 * @return	CalculatePartインスタンス
	 * @throws MospException
	 */
	public static CalculatePart calculate(PartInfo partInfo) throws MospException {
		return (CalculatePart)getPreparedPart(PartType.calculate, partInfo);
	}

	/**
	 * MosPUserPartインスタンス取得
	 * @param partInfo
	 * @return	MosPUserPartインスタンス
	 * @throws MospException
	 */
	public static MosPUserPart mospuser(PartInfo partInfo) throws MospException {
		return (MosPUserPart)getPreparedPart(PartType.mospuser, partInfo);
	}

	/**
	 * HumanPartインスタンス取得
	 * @param partInfo
	 * @return	HumanPartインスタンス
	 * @throws MospException
	 */
	public static HumanPart human(PartInfo partInfo) throws MospException {
		return (HumanPart)getPreparedPart(PartType.human, partInfo);
	}

	/**
	 * AuthorityPartインスタンス取得
	 * @param partInfo
	 * @return	AuthorityPartインスタンス
	 * @throws MospException
	 */
	public static AuthorityPart authority(PartInfo partInfo) throws MospException {
		return (AuthorityPart)getPreparedPart(PartType.authority, partInfo);
	}

	/**
	 * ComponentPartインスタンス取得
	 * @param partInfo
	 * @return	ComponentPartインスタンス
	 * @throws MospException
	 */
	public static ComponentPart component(PartInfo partInfo) throws MospException {
		return (ComponentPart)getPreparedPart(PartType.component, partInfo);
	}

	/**
	 * SectionPartインスタンス取得
	 * @param partInfo
	 * @return	SectionPartインスタンス
	 * @throws MospException
	 */
	public static SectionPart section(PartInfo partInfo) throws MospException {
		return (SectionPart)getPreparedPart(PartType.section, partInfo);
	}

	/**
	 * OfficePartインスタンス取得
	 * @param partInfo
	 * @return	OfficePartインスタンス
	 * @throws MospException
	 */
	public static OfficePart office(PartInfo partInfo) throws MospException {
		return (OfficePart)getPreparedPart(PartType.office, partInfo);
	}

	/**
	 * WorkTypePartインスタンス取得
	 * @param partInfo
	 * @return	WorkTypePartインスタンス
	 * @throws MospException
	 */
	public static WorkTypePart worktype(PartInfo partInfo) throws MospException {
		return (WorkTypePart)getPreparedPart(PartType.worktype, partInfo);
	}

	/**
	 * PositionPartインスタンス取得
	 * @param partInfo
	 * @return	PositionPartインスタンス
	 * @throws MospException
	 */
	public static PositionPart position(PartInfo partInfo) throws MospException {
		return (PositionPart)getPreparedPart(PartType.position, partInfo);
	}

	/**
	 * JPDatePartインスタンス取得
	 * @param partInfo
	 * @return	JPDatePartインスタンス
	 * @throws MospException
	 */
	public static JPDatePart jpdate(PartInfo partInfo) throws MospException {
		return (JPDatePart)getPreparedPart(PartType.jpdate, partInfo);
	}

	/**
	 * RotationPartインスタンス取得
	 * @param partInfo
	 * @return	RotationPartインスタンス
	 * @throws MospException
	 */
	public static RotationPart rotation(PartInfo partInfo) throws MospException {
		return (RotationPart) getPreparedPart(PartType.rotation, partInfo);
	}

	/**
	 * KintaiApprovalPartインスタンス取得
	 * @param partInfo
	 * @return	KintaiApprovalPartインスタンス
	 * @throws MospException
	 */
	public static KintaiApprovalPart kintaiapproval(PartInfo partInfo) throws MospException {
		return (KintaiApprovalPart) getPreparedPart(PartType.kintaiapproval, partInfo);
	}

	/**
	 * ApprovalPartインスタンス取得
	 * @param partInfo
	 * @return	ApprovalPartインスタンス
	 * @throws MospException
	 */
	public static ApprovalPart approval(PartInfo partInfo) throws MospException {
		return (ApprovalPart) getPreparedPart(PartType.approval, partInfo);
	}

	/**
	 * KintaiCommonPartインスタンス取得
	 * @param partInfo
	 * @return	KintaiCommonPartインスタンス
	 * @throws MospException
	 */
	public static KintaiCommonPart kintai(PartInfo partInfo) throws MospException {
		return (KintaiCommonPart) getPreparedPart(PartType.kintai, partInfo);
	}

	/**
	 * KintaiCompilePartインスタンス取得
	 * @param partInfo
	 * @return	KintaiCompilePartインスタンス
	 * @throws MospException
	 */
	public static KintaiCompilePart kintaicompile(PartInfo partInfo) throws MospException {
		return (KintaiCompilePart) getPreparedPart(PartType.kintaicompile, partInfo);
	}

	/**
	 * HolidayPartインスタンス取得
	 * @param partInfo
	 * @return	HolidayPartインスタンス
	 * @throws MospException
	 */
	public static HolidayPart holiday(PartInfo partInfo) throws MospException {
		return (HolidayPart) getPreparedPart(PartType.holiday, partInfo);
	}

	/**
	 * OverTimePartインスタンス取得
	 * @since	0.0.2
	 * @param partInfo
	 * @return	OverTimePartインスタンス
	 * @throws MospException
	 */
	public static OverTimePart overtime(PartInfo partInfo) throws MospException {
		return (OverTimePart) getPreparedPart(PartType.overtime, partInfo);
	}

	/**
	 * WorkflowPartインスタンス取得
	 * @since	0.0.2
	 * @param partInfo
	 * @return	OverTimePartインスタンス
	 * @throws MospException
	 */
	public static WorkflowPart workflow(PartInfo partInfo) throws MospException {
		return (WorkflowPart) getPreparedPart(PartType.workflow, partInfo);
	}

}
