package com.eactive.eai.agent.flowController;

import com.eactive.eai.agent.command.Command;
import com.eactive.eai.agent.command.CommandException;
import com.eactive.eai.batch.flowController.BatchTargetVO;
import com.eactive.eai.batch.flowController.DemandTargetVO;
import com.eactive.eai.batch.flowController.FlowControllerDAO;
import com.eactive.eai.batch.flowController.FlowControllerManager;
import com.eactive.eai.common.dao.DAOFactory;
import com.eactive.eai.common.util.Logger;

public class UpdateBatchTargetCommand extends Command
{
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
    * 1. 기능 : UpdateBatchTargetCommand 생성자
    * 2. 처리 개요 :
    * 3. 주의사항
    *
    * @param
    * @return
    * @exception
    **/
    public UpdateBatchTargetCommand() {
        super("UpdateBatchTargetCommand");
    }

    /**
    * 1. 기능 :  UpdateBatchTargetCommand BatchTargetVO 변경
    * 2. 처리 개요 : UpdateBatchTargetCommand BatchTargetVO 변경
    * 3. 주의사항
    *
    * @param
    * @return
    * @exception    CommandException
    **/
    public Object execute() throws CommandException
    {
        Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
        logger.info(this.name + " Agent 가 호출되었습니다.");

        if ( args == null || !(args instanceof String[]) ) {
            String msg = makeException("BECEAICAG001", null);
            logger.error(msg);
            throw new CommandException(msg);
        }

        try {
			String[] argArray = (String[]) args;
			String processCode = argArray[0];
			String organCode   = argArray[1];
            String organStatus = (argArray.length > 2)? argArray[2] : "";
            
            //Framework 에서 장애(회복)통보 전문 수신시 대외기관 상태를 변경하는 경우
            //테이블 update 가 commit이 안된 상태이므로 메모리의 정보를 직접 변경해야 한다.
            if (!organStatus.equals("")) {
                logger.debug("  - 대외기관 요구송수신 연결 정보 Memory update ("+ processCode +", "+ organCode +", "+ (organStatus.equals(DemandTargetVO.ORGAN_SOCKET_STATUS_ERROR)? "장애" : "정상") +")");
                DemandTargetVO[] demandTargetList = FlowControllerManager.getInstance().getRemoteHostInfo(processCode, organCode);
                for (int i=0; i<demandTargetList.length; i++) {
                    demandTargetList[i].setOrganSocketStatus(organStatus);
                    logger.debug("    > 대외기관 요구송수신 연결 정보 ☞ (IP: "+ demandTargetList[i].getIpAddress() +", Port: "+ demandTargetList[i].getPortNumber() +", ID: "+ demandTargetList[i].getSocketID() +", PW: "+ demandTargetList[i].getSocketPwd() +", Timeout: "+ demandTargetList[i].getTimeoutInterval() +", OrganStatus: "+ demandTargetList[i].getOrganSocketStatus() +")");
                }
            
            //관리 UI에서 대외기관 정보를 수정한 경우
            } else {
                FlowControllerDAO dao = (FlowControllerDAO)DAOFactory.newInstance().create(FlowControllerDAO.class);
                BatchTargetVO vo = dao.getBatchTargetVO(processCode, organCode);
    
                FlowControllerManager.getInstance().getTargets().put(processCode + organCode, vo);
            }

			logger.info(this.name + " Agent 가 성공적으로 완료되었습니다.");
            
            return "success";

        } catch (Exception e) {
            String msg = makeException("BECEAICAG002", e);
            logger.error(msg, e);
            throw new CommandException(msg);
        }
	}
}
