package jp.mosp.common.part;

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

import jp.mosp.common.common.BaseDao;
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 abstract class BasePart {

	protected Properties 		cfg;
	protected String 			cmd;
	protected CmAspUserDto 	aspUser;
	protected CmUserDto 		user;
	protected Connection 		conn;

	/**
	 * コンストラクタ
	 */
	public BasePart() {
		super();
	}

	/**
	 * コンストラクタ
	 * @param partInfo
	 */
	public BasePart(PartInfo partInfo) {
		this();
		init(partInfo);
	}

	/**
	 * 初期化
	 * @param partInfo
	 */
	public void init(PartInfo partInfo) {
		init(
				partInfo.getCfg(),
				partInfo.getCmd(),
				partInfo.getAspUser(),
				partInfo.getUser(),
				partInfo.getConn()
		);
	}

	/**
	 * 初期化
	 * @param cfg
	 * @param cmd
	 * @param aspUser
	 * @param user
	 */
	public void init(
			Properties cfg,
			String cmd,
			CmAspUserDto aspUser,
			CmUserDto user,
			Connection conn
	) {
		this.cfg = cfg;
		this.cmd = cmd;
		this.aspUser = aspUser;
		this.user = user;
		this.conn = conn;
	}

	/**
	 * DAOフィールド
	 */
	private BaseDao dao;

	/**
	 * 初期化済みDAO生成
	 * @param className		対象DAOクラス名称
	 * @return				対象初期化済みDAOインスタンス
	 * @throws Exception
	 */
	protected BaseDao getPreparedDao(String className) throws Exception {
		// DAO準備
		if (dao == null || !dao.getClass().getName().equals(className)) {
			Object obj = PartFactory.getInstance(className);
			if (obj instanceof BaseDao) {
				dao = (BaseDao) obj;
				dao.initDao(cfg, cmd, aspUser, user, conn);
			} else {
				throw new MospException(5014,
						className + " is not instanceof BaseDao class."
				);
			}
		}
		return dao;
	}

	/**
	 * PartInfo生成
	 * @return	PartInfoインスタンス
	 */
	protected PartInfo partInfo() {
		return PartManager.createPartInfo(cfg, cmd, aspUser, user, conn);
	}

	/**
	 * MosPCodePartインスタンス取得 
	 * @return	MosPCodePartインスタンス
	 * @throws MospException
	 */
	protected MosPCodePart mospcode() throws MospException {
		return PartManager.mospcode(partInfo());
	}

	/**
	 * CalculatePartインスタンス取得 
	 * @return	CalculatePartインスタンス
	 * @throws MospException
	 */
	protected CalculatePart calculate() throws MospException {
		return PartManager.calculate(partInfo());
	}

	/**
	 * MosPUserPartインスタンス取得 
	 * @return	MosPUserPartインスタンス
	 * @throws MospException
	 */
	protected MosPUserPart mospuser() throws MospException {
		return PartManager.mospuser(partInfo());
	}

	/**
	 * HumanPartインスタンス取得
	 * @return	HumanPartインスタンス
	 * @throws MospException
	 */
	protected HumanPart human() throws MospException {
		return PartManager.human(partInfo());
	}

	/**
	 * AuthorityPartインスタンス取得
	 * @return	AuthorityPartインスタンス
	 * @throws MospException
	 */
	protected AuthorityPart authority() throws MospException {
		return PartManager.authority(partInfo());
	}

	/**
	 * ComponentPartインスタンス取得
	 * @return	ComponentPartインスタンス
	 * @throws MospException
	 */
	protected ComponentPart component() throws MospException {
		return PartManager.component(partInfo());
	}

	/**
	 * SectionPartインスタンス取得
	 * @return	SectionPartインスタンス
	 * @throws MospException
	 */
	protected SectionPart section() throws MospException {
		return PartManager.section(partInfo());
	}

	/**
	 * CmCodePartインスタンス取得
	 * @return	CmCodePartインスタンス
	 * @throws MospException
	 */
	protected CmCodePart cmcode() throws MospException {
		return PartManager.cmcode(partInfo());
	}

	/**
	 * MosPConfPartインスタンス取得
	 * @return	MosPConfPartインスタンス
	 * @throws MospException
	 */
	protected MosPConfPart mospconf() throws MospException {
		return PartManager.mospconf(partInfo());
	}

	/**
	 * KintaiCommonPartインスタンス取得
	 * @return	KintaiCommonPartインスタンス
	 * @throws MospException
	 */
	protected KintaiCommonPart kintai() throws MospException {
		return PartManager.kintai(partInfo());
	}

	/**
	 * OfficePartインスタンス取得
	 * @since 	0.0.2
	 * @return	OfficePartインスタンス
	 * @throws MospException
	 */
	protected OfficePart office() throws MospException {
		return PartManager.office(partInfo());
	}

}
