package com.eactive.eai.adapter;

import com.eactive.eai.common.dao.BaseDAO;
import com.eactive.eai.common.dao.DAOException;
import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.util.NullControl;

import java.sql.ResultSet;
import java.util.HashMap;

/**
 * 1. 기능 : 어댑터 유형 별 프라퍼키 정보를 추출하기 위한 Data Access Object
 * 2. 처리 개요 : 어댑터유형, 어댑터프라퍼티정보 테이블에 대한 Create, Read, Update, Delete 를 처리한다.
 * *     -
 * 3. 주의사항
 *
 * @author  :
 * @version : v 1.0.0
 * @see : 관련 기능을 참조
 * @since   :
 */
public class AdapterPropDAO extends BaseDAO implements AdapterPropQuery
{
    /**
     * EAI FRAMEWORK DEFAULT FILE LOGGER
     */
    //private static Logger logger = LoggerFactory.getLogger(ElinkLogger.LOGGER_ADAPTER);

    /**
     * 1. 기능 : 어댑터 유형 별 모든 프라퍼티 정보 조회하여 AdapterTypeVO Collection으로 반환
     * 2. 처리 개요 : 어댑터 유형 별 모든 프라퍼티 정보를 SELECT해서 AdapterTypeVO로 생성 HashMap에
     *       저장하여 반환한다.
     * 3. 주의사항
     *
     * @return Returns AdapterTypeVO Collection
     * @exception    DAOExcepiton    DB SELECT 관련 SQLException을 포함한 어댑터 유형 별 모든 프라퍼티 정보를 가져오다 발생되는 모든 에러
     */
    public HashMap<String, AdapterTypeVO> getAllAdapterPropInfo() throws DAOException {

        HashMap<String, AdapterTypeVO> adptPropInfo = new HashMap<String, AdapterTypeVO>();
        ResultSet rs = null;

        try {

            this.connect(GET_ALL_ADPT_PROP_INFO);
            rs = executeQuery();

            String current = null, previous = null;
            AdapterTypeVO adptTp = null;

            while(rs.next()) {
                current = rs.getString(1);

                if(!current.equals(previous)) {
                    adptTp = new AdapterTypeVO(current, rs.getString(2));
                    adptPropInfo.put(current, adptTp);
                    previous = current;
                }

                adptTp.addAdapterPropInfo(current, rs.getString(3), rs.getString(4), NullControl.trimSpace(rs.getString(5)));
            }

            return adptPropInfo;
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e,"BECEAIMAD041"));
        } finally {
            this.disconnect();
        }

    }

    /**
     * 1. 기능 : 특정 어댑터 유형의 프라퍼티 정보 조회하여 AdapterTypeVO로 반환
     * 2. 처리 개요 : 특정 어댑터 유형의 프라퍼티 정보를 SELECT해서 AdapterTypeVO로 생성, 반환한다.
     * 3. 주의사항
     *
     * @return Returns AdapterTypeVO
     * @exception    DAOExcepiton    DB SELECT 관련 SQLException을 포함한 프라퍼티 정보를 가져오다 발생되는 모든 에러
     */
    public AdapterTypeVO getAdapterPropInfo(String adptrCd) throws DAOException {

        ResultSet rs = null;

        try {

            this.connect(GET_ADPT_PROP_INFO);
            this.preparedStatement.setString(1, adptrCd);
            rs = executeQuery();

            String current = null, previous = null;
            AdapterTypeVO adptTp = null;

            while(rs.next()) {
                current = rs.getString(1);

                if(!current.equals(previous)) {
                    adptTp = new AdapterTypeVO(current, rs.getString(2));
                    previous = current;
                }

                adptTp.addAdapterPropInfo(current, rs.getString(3), rs.getString(4), NullControl.trimSpace(rs.getString(5)));
            }

            return adptTp;
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e,"BECEAIMAD042"));
        } finally {
            this.disconnect();
        }

    }

    /**
     * 1. 기능 : 어댑터유형 정보를 등록하는 메서드
     * 2. 처리 개요 : 어댑터유형 정보를 DB 테이블에 INSERT한다.
     * 3. 주의사항
     *
     * @param adptrCd 어댑터코드
     * @param adptrName 어댑터명
     * @exception DAOException DB INSERT 시 발생하는 SQLException을 포함한 추출정보 저장시 발생되는 모든 에러
     */
    public void addAdapterType(String adptrCd, String adptrName) throws DAOException {

        try {
            this.connect(ADD_ADPT_TP);

            this.preparedStatement.setString(1,adptrCd);
            this.preparedStatement.setString(2,adptrName);

            executeUpdate();

        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e,"BECEAIMAD043"));
        } finally {
            this.disconnect();
        }
    }

    /**
     * 1. 기능 : 어댑터프라퍼티정보를 등록하는 메서드
     * 2. 처리 개요 : 어댑터프라퍼티정보를 DB 테이블에 INSERT한다.
     * 3. 주의사항
     *
     * @param adptrCd 어댑터코드
     * @param adptrIODstcd 어댑터입출력구분코드
     * @param adptrPrptyName 어댑터프라퍼티명
     * @param adptrPrptyDesc 어댑터프라퍼티설명
     * @exception DAOException DB INSERT 시 발생하는 SQLException을 포함한 추출정보 저장시 발생되는 모든 에러
     */
    public void addAdapterPropInfo(String adptrCd, String adptrIODstcd, String adptrPrptyName, String adptrPrptyDesc)
            throws DAOException {

        try {
            this.connect(ADD_ADPT_PROP_INFO);

            this.preparedStatement.setString(1,adptrCd);
            this.preparedStatement.setString(2,adptrIODstcd);
            this.preparedStatement.setString(3,adptrPrptyName);
            this.preparedStatement.setString(4,NullControl.addSpace(adptrPrptyDesc));

            executeUpdate();

        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e,"BECEAIMAD044"));
        } finally {
            this.disconnect();
        }
    }
}
