package com.eactive.eai.batch.scheduler;

import java.util.Timer;

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.property.PropManager;
import com.eactive.eai.common.util.DatetimeUtil;
import com.eactive.eai.common.util.Logger;
import com.eactive.eai.common.util.UCMsgSenderUtil;

public class TransJobMonitor implements Lifecycle{
	
	/** 
     * EAI FRAMEWORK DEFAULT FILE LOGGER
     */
	static Logger logger = Logger.getLogger(Logger.LOGGER_SCHEDULER);
    
    /**
     * TransJobMonitor의 Singleton object
     */
    private static TransJobMonitor instance = new TransJobMonitor();
    
    /**
     * TransJobMonitor의 Lifecycle Event 처리를 위한 LifecycleSupport object
     */
    private LifecycleSupport lifecycle = new LifecycleSupport(this);

    /**
     * 일일, 최근시간별 데이터 저장을 위해 주기적으로 실행 Monitor check를 하는 TimerTask object
     */
    private TransferJobChecker checker;
    
    /**
     * MonitorChecker를 실제 실행하는 Timer object
     */
    private Timer timer;

    
    /**
     * TransJobMonitor starting 여부를 체크하는 flag 변수
     */
    private boolean started;
    
   
    
    /** 
     * 1. 기능 :  Default 생성자
     * 2. 처리 개요 : 
     *     - 
     * 3. 주의사항 
     *
     * @param 
     * @return 
     * @exception
     **/
    private TransJobMonitor() {
      
    }
    
    /**
     * 1. 기능 : TransJobMonitor Singleton object를 반환하는 메서드
     * 2. 처리 개요 : 
     *    - TransJobMonitor Singleton object의 reference 반환
     * 3. 주의사항
     *
     *@return    TransJobMonitor Singleton object
     **/
    public static TransJobMonitor getInstance() {
        if(instance==null) {
            synchronized(TransJobMonitor.class) {
                if(instance==null) {
                    instance = new TransJobMonitor();
                }
            }
        }
        
        return instance;
    }

 
    /**
     * 1. 기능 : TransJobMonitor의 초기화 작업을 실행하는 메서드
     * 2. 처리 개요 : 
     *    - MonitorChecker객체를 생성해 Timer에 등록 실행한다.
     * 3. 주의사항
     *
     *@exception    LifecycleException  TransJobMonitor 초기화 실패 시 발생
     **/
    public void start() throws LifecycleException {
        if (started) {
        	throw new LifecycleException("BECEAIMEH201");
        }
        
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STARTING_EVENT, this);
        
        long period = 1000*60*60*1; //밀리 * 초 * 분 * 시간 ( 1000*60*60*1 = 1시간 )
        try {
            period =  60 * 1000 * Long.parseLong(PropManager.getInstance().getProperty(UCMsgSenderUtil.UCINFO, UCMsgSenderUtil.CHECK_PERIOD ));
           
        } catch(Exception e) {}

        
        this.checker = new TransferJobChecker();
        
        this.timer = new Timer();
        
        String currentTime = DatetimeUtil.getCurrentTimeMillis();
        
        long delay = ( 60 * 60 * 1000 - ( 60 * 1000 * Long.parseLong(currentTime.substring(10,12))) - Long.parseLong(currentTime.substring(12,17)));
//        try {
//        	delay +=  60 * 1000 * Long.parseLong(PropManager.getInstance().getProperty(ItmsSmsUtil.SMSINFO, ItmsSmsUtil.CHECK_DELAY ));
//           
//        } catch(Exception e) {}
        
        delay %= period; // delay 가 한주기를 넘지않도록 한다.

        this.timer.schedule(this.checker, delay, period);
  
        started = true;
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STARTED_EVENT, this);
    }
    
    /**
     * 1. 기능 : TransJobMonitor의 종료시 undo 작업을 실행하는 메서드
     * 2. 처리 개요 : 
     *    - 초기화 작업 시 생성한 MonitorChecker객체를 종료한다.
     * 3. 주의사항
     *
     *@exception    LifecycleException  TransJobMonitor undo 작업 실패 시 발생
     **/
    public void stop() throws LifecycleException {
    	if(!started){
            throw new LifecycleException("BECEAIMEH203");
        } else {
            lifecycle.fireLifecycleEvent("stoping", this);
            
            started = false;
            this.timer.cancel();
            this.timer = null;
            this.checker = null;
            
            lifecycle.fireLifecycleEvent("stopped", this);

            return;
        }

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

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

    /**
     * 1. 기능 : 등록된 LifecycleListener 중 특정 LifecyleListener를 삭제하는 메서드
     * 2. 처리 개요 : 
     *    - 등록된 특정 LifecycleListener를 삭제한다.
     * 3. 주의사항
     *
     *@param    listener    삭제할 LifecycleListener
     **/
    public void removeLifecycleListener(LifecycleListener listener)
    {
        lifecycle.removeLifecycleListener(listener);
    }
    
   /**
     * 1. 기능 : TransJobMonitor의 start 여부를 반환하는 getter method
     * 2. 처리 개요 : 
     *    - TransJobMonitor의 start 여부를 반환한다.
     * 3. 주의사항
     *
     *@return   TransJobMonitor의 start 여부
     **/
    public boolean isStarted() {
        return this.started;   
    }
   

}
