package com.eactive.eai.common.property;

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

import com.eactive.eai.batch.common.StringUtil;
import com.eactive.eai.common.dao.BaseDAO;
import com.eactive.eai.common.dao.DAOException;
import com.eactive.eai.common.exception.ExceptionUtil;

/**
* 1. 기능 : 프라퍼티 정보에 대한 Data Access Object 클래스
* 2. 처리 개요 : 프라퍼티 Rule 정보에 대한 DB Access 로직을 처리한다.
* *     -
* 3. 주의사항
*
* @author  :
* @version : v 1.0.0
* @see : 관련 기능을 참조
* @since   :
*/
public class PropertyDAO extends BaseDAO implements PropertyQuery
{


    /**
    * 1. 기능 :  프라퍼티 Rule 정보 전체를 메모리에 로딩하기 위해 테이블 전체 내용을 SELECT해서
    *       PropGroupVO 객체 리스트로 생성 반환하는 메서드.
    * 2. 처리 개요 : 프라퍼티Rule정보 전체를 SELECT해서 한 레코드를 PropGroupVO로 생성 HashMap에
    *       저장하여 반환한다.
    * 3. 주의사항
    *
    * @return   HashMap 프라퍼티Rule 정보 전체데이터로 PropGroupVO Collection
    * @exception    DAOExcepiton    DB SELECT 관련 SQLException을 포함한 프라퍼티 Rule정보를 가져오다 발생되는 모든 에러[BECEAIMPT101]
    **/
    public HashMap<String, PropGroupVO> getAllProperties() throws DAOException {

        HashMap<String, PropGroupVO> groups = new HashMap<String, PropGroupVO>();
        ResultSet rs = null;
        try {
            this.connect(GET_ALL_PROPERTIES);

			rs = executeQuery();

            String current = null, previous = "";
            PropGroupVO group = null;

            while (rs.next()) {
                current = rs.getString(1);
                if (!current.equals(previous)) {
                    if (group!=null) logger.debug("  - "+ group.toString());
                    group = new PropGroupVO(current);
                    groups.put(current, group);
                    previous = current;
                }

                group.addProperty(rs.getString(2),rs.getString(3));
            }

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

    /**
    * 1. 기능 : 특정 Property 공통 정보를 가져오는 메소드
    * 2. 처리 개요 : 파라미터의 EAI서버명과 프라퍼티그룹명에 따른 프라퍼티 상세정보를 조회
    * 3. 주의사항
    *
    * @param    svrNm    EAI서버명
    * @param    grpNm    프라퍼티그룹명
    * @return   프라퍼티 Rule 정보를 표현한 PropGroupVO 객체들을 담는 HashMap을 반환
    * @exception    DAOException    DB SELECT 시 발생하는 SQLException을 포함한 프라퍼티 Rule 상세정보 생성 시 발생하는 모든 에러
    **/
    public PropGroupVO getProperties(String grpNm) throws DAOException {

        ResultSet rs = null;
        try {

            this.connect(GET_PROPERTIES_LIST);
            this.preparedStatement.setString(1, grpNm);
            rs  = executeQuery();

            PropGroupVO vo = new PropGroupVO();
            vo.setName(grpNm);
            while(rs.next()) {
                vo.addProperty(rs.getString(1), rs.getString(2));
            }
            return vo;
        } catch(Exception e) {
            String errorText = ExceptionUtil.make("BECEAIMPT103", grpNm);
            if (logger.isError()) logger.error(errorText);
            throw new DAOException(errorText);

        } finally {
            this.disconnect();
        }

    }

	public String getProgertyValue(String propGroupName, String propName) throws DAOException {

		ResultSet rs = null;
		int index    = 0;

        try {
            this.connect(SELECT_PROPERTY_VALUE);

			index = 1;
            this.preparedStatement.setString(index++, propGroupName);
            this.preparedStatement.setString(index++, propName     );

            rs = executeQuery();

            if (rs.next()) {
				return StringUtil.nvlTrim(rs.getString("Prpty2Val"));
            } else {
				return null;
			}

 		} catch (DAOException ex) {
			throw ex;
        } catch(Exception e) {
			String errMsg = ExceptionUtil.getErrorCode(e, "UNDEFINED_CD");
			throw new DAOException(errMsg);
        } finally {
            disconnect();
        }
    }
}