package com.eactive.eai.batch.rule.ruleinfo;

import java.util.HashMap;

import com.eactive.eai.common.dao.DAOException;
import com.eactive.eai.common.dao.DAOFactory;
import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.lifecycle.Lifecycle;
import com.eactive.eai.common.lifecycle.LifecycleException;
import com.eactive.eai.common.lifecycle.LifecycleListener;
import com.eactive.eai.common.lifecycle.LifecycleSupport;
import com.eactive.eai.common.util.Logger;

public class RuleInfoManager  implements Lifecycle
{

	//파일로거
	private static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);

   /**
     * TelegramInfoManager Single Instance
     */
    private static RuleInfoManager instance = new RuleInfoManager();

    /**
     * LifeccyleSupport object
     */
    private LifecycleSupport lifecycle = new LifecycleSupport(this);

    /**
     * 기동 여부
     */
    private boolean started;

    /**
     * 전문 정보를 저장하는 collection
     */
    private HashMap<String, RuleInfoVO> ruleInfos;

    /**
    * 1. 기능 :  Default Constructor
    * 2. 처리 개요 : 전문(Telegram) 정보를 저장하기 위한 HashMap을 초기화한다.
    * 3. 주의사항
    *
    **/
    private RuleInfoManager() {
    	ruleInfos = new HashMap<String, RuleInfoVO>();

    }

    /**
    * 1. 기능 :  TelegramManager Singleton Object를 반환하는 getter method
    * 2. 처리 개요 : TelegramManager Singleton Object를 반환한다.
    * 3. 주의사항
    *
    * @return   TelegramManager Singleton object
    **/
    public static RuleInfoManager getInstance() {

        return instance;
    }


    /* ****************************************************************** */
    /*                  Web Agent 호출을 위한  메소드 정의                */
    /* ****************************************************************** */

    /**
     * 1.기능: 전문 Key에 해당하는 전문 객체를 삭제한다.
     */
    public boolean removeRuleInfo(RuleInfoVO telegramInfoVO)  throws Exception
    {
        return false;
    }

    /**
     * 1.기능: 전문 Key에 해당하는 전문 객체를 다시 읽어온다.
     */
    public boolean updateRuleInfo(RuleInfoVO telegramInfoVO)  throws Exception
    {
        return false;
    }

    /**
     * 1.기능: 전문 Key에 해당하는 전문 객체를 전체 HashMap에 추가한다.
     */
    public boolean addRuleInfo(RuleInfoVO telegramInfoVO)  throws Exception
    {
        return false;
    }

    public synchronized void setRuleCodeArray(String strRuleCode, RuleInfoVO vo) throws Exception
    {
        this.ruleInfos.put(strRuleCode, vo);
    }

    public synchronized void removeRuleCodeArray(String strRuleCode) throws Exception
    {
        this.ruleInfos.remove(strRuleCode);
    }

    /**
     * Telegram Mapping 정보 조회 : --> 텔레그램 클래스, 메시지 메타코드
     */

    public RuleInfoVO getRuleInfo(String strRuleCode)
    {
        RuleInfoVO vo = this.ruleInfos.get(strRuleCode);
        if (vo != null) {
            return vo;
        }
        return new RuleInfoVO();
    }

    public HashMap<String, RuleInfoVO> getAllData() throws Exception
    {
        return this.ruleInfos;
    }

    /* ****************************************************************** */
    /*                  Lifecycle 인터페이스에 정의된 메소드              */
    /* ****************************************************************** */

    /**
    * 1. 기능 :  Lifecycle의 start 메서드로 TelegramManager를 초기화하는 메서드
    * 2. 처리 개요 : TelegramDAO를 이용해 추출 전문 정보 모두를 가져와 초기화한다.
    * 3. 주의사항
    *
    * @exception    LifecycleException  이미 시작되었거나,
    *               EAIServerDAO를 통해 Rule 정보를 가져온다.
    *               DAOExcepiton이 발생될 경우
    **/
    public void start() throws LifecycleException
    {
        if (started)
            throw new LifecycleException("BECEAIMFR030");

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STARTING_EVENT, this);

        DAOFactory daoFactory = DAOFactory.newInstance();
        RuleInfoDAO dao = null;
        try {
            dao = (RuleInfoDAO)daoFactory.create(RuleInfoDAO.class);
            this.ruleInfos = dao.getAllRuleInfo();
            logger.info("RuleInfoManager: phase information loaded >> " + this.ruleInfos.size());
        } catch(DAOException e) {
            throw new LifecycleException(ExceptionUtil.getErrorCode(e,"BECEAIMFR031"));
        }

        started = true;

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STARTED_EVENT, this);
    }

    /**
    * 1. 기능 :  Lifecycle의 stop 메서드로 EAIServerManager를 종료하는 메서드
    * 2. 처리 개요 : 멤버에 캐싱항 EAIServer Rule 정보를 clear한다.
    * 3. 주의사항
    *
    * @exception    LifecycleException  이미 종료된 경우 발생
    **/
    public void stop() throws LifecycleException {
        // Validate and update our current component state
        if (!started)
            throw new LifecycleException("BECEAIMFR032");

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STOPING_EVENT, this);

        this.ruleInfos.clear();

        started = false;
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STOPPED_EVENT, this);
    }

    /**
    * 1. 기능 :  LifecycleListener를 등록하는 메서드
    * 2. 처리 개요 : LifecycleListener를 등록한다.
    * 3. 주의사항
    *
    * @param    listener    LifecycleEvent를 수신한 LifecycleListener
    **/
    public void addLifecycleListener(LifecycleListener listener)
    {
        lifecycle.addLifecycleListener(listener);
    }

    /**
    * 1. 기능 :  등록된 LifecycleListener 리스트를 반환하는 메서드
    * 2. 처리 개요 : 등록된 LifecycleListener 리스트를 반환하다.
    * 3. 주의사항
    *
    * @return   등록된 LifecycleListener 리스트
    **/
    public LifecycleListener[] findLifecycleListeners()
    {
        return lifecycle.findLifecycleListeners();
    }

    /**
    * 1. 기능 :  등록된 LifecycleListener를 삭제하는 메서드
    * 2. 처리 개요 : 파라미터의 LifecycleListener를 삭제한다.
    * 3. 주의사항
    *
    * @param    listener    삭제할 LifecycleListener
    **/
    public void removeLifecycleListener(LifecycleListener listener)
    {
        lifecycle.removeLifecycleListener(listener);
    }

    /**
    * 1. 기능 :  FlowRuleManager의 초기화 여부를 반환하는 getter 메서드
    * 2. 처리 개요 : FlowRuleManager의 초기화 여부를 반환한다.
    * 3. 주의사항
    *
    * @return   초기화 여부
    **/
    public boolean isStarted() {
        return this.started;
    }

}
