package jp.terasoluna.batch.functionsample.b003;

import java.sql.Date;
import java.sql.SQLException;
import java.sql.Timestamp;

import jp.terasoluna.fw.dao.QueryDAO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 共通のDBアクセスBean
 * 
 */
public class CommonBeanImpl implements CommonBean {

    /**
     * シーケンスの接尾文字
     */
    private final String SEQ_SUFIX = "_SEQ_001";

    /**
     * Log。
     */
    private static Log log = LogFactory.getLog(CommonBeanImpl.class);

    /**
     * 参照系DAO。
     */
    private QueryDAO queryDAO = null;

    /**
     * 参照系DAOを設定する。
     * 
     * @param queryDAO 参照系DAO
     */
    public void setQueryDAOwhithoutLogging(QueryDAO queryDAOwhithoutLogging) {
        this.queryDAO = queryDAOwhithoutLogging;
    }

    /**
     * シーケンスコードの払い出しを行う
     * 
     * @param seqName シーケンス名
     * @return String 最大のシーケンス数
     */
    public String executeGetSeqCode(String seqName) {
        String ret = null;

        ret = this.queryDAO.executeForObject("cmnsvc.sysCodeReader", seqName,
                String.class);

        if (log.isDebugEnabled()) {
            log.debug("取得したシーケンスコードは：" + ret);
        }

        return ret;
    }

    /**
     * シーケンスコードの払い出しを行う（可変桁数）
     * 
     * @param seqName シーケンス名
     * @param accuracy 桁数
     * @return String 最大のシーケンス数
     */
    public String executeGetSeqCodeVariablePrecision(String seqName,
            int accuracy) {
        SysCodeReaderVariablePrecisionParam param = new SysCodeReaderVariablePrecisionParam();
        String ret = null;

        StringBuilder sb = new StringBuilder();
        sb.append("FM");
        for (int i = 0; i < accuracy; i++) {
            sb.append("0");
        }

        param.setSeqName(seqName);
        param.setAccuracy(sb.toString());

        ret = this.queryDAO.executeForObject(
                "cmnsvc.sysCodeReaderVariablePrecision", param, String.class);

        if (log.isDebugEnabled()) {
            log.debug("取得したシーケンスコードは：" + ret);
        }

        return ret;
    }

    /**
     * システムコードを取得する。
     * 
     * @param tblName テーブル名
     * @return String システムコード
     */
    public String executeGetSysCode(String tblName) {
        String ret = null;

        String seqName = tblName + SEQ_SUFIX;

        if (log.isDebugEnabled()) {
            log.debug("システムコードの取得");
            log.debug("シーケンス名：" + seqName);
        }

        if (tblName == null) {
            return null;
        }

        ret = this.queryDAO.executeForObject("cmnsvc.sysCodeReader", seqName,
                String.class);

        if (log.isDebugEnabled()) {
            log.debug("取得したシステムコードは：" + ret);
        }

        return ret;
    }

    /**
     * システムコードを取得する（可変桁数）。
     * 
     * @param tblName テーブル名
     * @param accuracy 桁数
     * @return String システムコード
     */
    public String executeGetSysCodeVariablePrecision(String tblName,
            int accuracy) {
        SysCodeReaderVariablePrecisionParam param = new SysCodeReaderVariablePrecisionParam();
        String ret = null;

        String seqName = tblName + SEQ_SUFIX;

        if (log.isDebugEnabled()) {
            log.debug("システムコードの取得");
            log.debug("シーケンス名：" + seqName);
        }

        if (tblName == null) {
            return null;
        }

        StringBuilder sb = new StringBuilder();
        sb.append("FM");
        for (int i = 0; i < accuracy; i++) {
            sb.append("0");
        }

        param.setSeqName(seqName);
        param.setAccuracy(sb.toString());

        log.info(param.getSeqName());
        log.info(param.getAccuracy());
        
        
        ret = this.queryDAO.executeForObject(
                "B003002.sysCodeReaderVariablePrecision", param, String.class);

        if (log.isDebugEnabled()) {
            log.debug("取得したシステムコードは：" + ret);
        }

        return ret;
    }

    /**
     * システム時刻取得処理
     * 
     * @return Timestamp システム時刻
     */
    public Timestamp executeGetCurrentTime() {
        Timestamp result = null;

        Object resultObj = this.queryDAO.executeForObject(
                "B003002.currentTimeReader", null, Object.class);

        if (resultObj instanceof Timestamp) {
            result = (Timestamp) resultObj;
        } else if (resultObj instanceof oracle.sql.TIMESTAMP) {
            // Oracle対応
            try {
                result = ((oracle.sql.TIMESTAMP) resultObj).timestampValue();
            } catch (SQLException e) {
                log.warn("oracle.sql.TIMESTAMP convert error.", e);
            }
        }

        if (log.isDebugEnabled()) {
            log.debug("取得したシステム時刻は：" + result);
        }

        return result;

    }

    /**
     * システム日付取得処理
     * 
     * @return Date システム日付
     */
    public Date executeGetCurrentDate() {
        Date ret = null;

        ret = this.queryDAO.executeForObject("B003002.currentDateReader", null,
                Date.class);

        if (log.isDebugEnabled()) {
            log.debug("取得したシステム日付は：" + ret);
        }
        return ret;

    }

}
