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

import java.util.HashMap;
import java.util.Iterator;


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 KikwanInfoManager implements Lifecycle
{

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

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

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

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

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

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

    }

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

        return instance;
    }


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


    public synchronized void setKikwanInfo(String kikwanCd)
    {
    	try {
    		DAOFactory daoFactory = DAOFactory.newInstance();
            KikwanInfoDAO dao = (KikwanInfoDAO)daoFactory.create(KikwanInfoDAO.class);
            KikwanInfoVO vo = dao.getKikwanInfo(kikwanCd);            
            this.kikwanInfos.put(kikwanCd, vo);
    	} catch(DAOException e) {
            logger.warn(e.getMessage(), e);
        }
    }

    public synchronized void removeKikwanInfo(String kikwanCd)
    {
        this.kikwanInfos.remove(kikwanCd);
    }

    public KikwanInfoVO getKikwanInfo(String kikwanCd)
    {
        return this.kikwanInfos.get(kikwanCd);
    }
    
    public HashMap<String, KikwanInfoVO> getAllKikwanInfos(){
    	return this.kikwanInfos;
    }

    public String[] getAllKikwanCodes() {
        String[] kikwancodes = new String[kikwanInfos.size()];
        Iterator<String> it = kikwanInfos.keySet().iterator();
        for(int i=0;it.hasNext();i++) {
        	kikwancodes[i] = it.next();
        }
        return kikwancodes;
    }

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

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

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STARTING_EVENT, this);
        DAOFactory daoFactory = DAOFactory.newInstance();
        KikwanInfoDAO dao = null;
        try {
            dao = (KikwanInfoDAO)daoFactory.create(KikwanInfoDAO.class);
            this.kikwanInfos = dao.getAllKikwanInfos();
            logger.info("[kikwanInfoManager]: FTManager 기관 information loaded >> " + this.kikwanInfos.size());
        } catch(DAOException e) {
            throw new LifecycleException(ExceptionUtil.getErrorCode(e,"BECEAIMFR020"));
        }

        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("BECEAIMFR021");

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

        this.kikwanInfos.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;
    }
}