package com.eactive.eai.agent.adapter.socket;

import com.eactive.eai.adapter.socket.config.SocketAdapterManager;
import com.eactive.eai.agent.command.Command;
import com.eactive.eai.agent.command.CommandException;
import com.eactive.eai.batch.running.BatchRunningJobManager;
import com.eactive.eai.common.util.Logger;

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

	public static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);

	public static final String START_SOCKET_SERVER  = "START_SOCKET_SERVER";
	public static final String STOP_SOCKET_SERVER   = "STOP_SOCKET_SERVER";
	public static final String START_SOCKET_SESSION = "START_SOCKET_SESSION";
	public static final String STOP_SOCKET_SESSION  = "STOP_SOCKET_SESSION";


    public SocketStartStopCommand(String name) {
        super(name);
    }

    public Object execute() throws CommandException
    {
        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 startStopType    = argArray[0];  //기동중지 구분
			String adapterGroupName = argArray[1];  //어댑터그룹명
			String adapterName      = argArray[2];  //어댑터명
			String uuid             = argArray.length<4? "":argArray[3];  //UUID (세션종료시만 사용)
			logger.info("※ 기동/종료구분 : "+ startStopType);
			logger.info("※ 어댑터그룹    : "+ adapterGroupName);
			logger.info("※ 어댑터        : "+ adapterName);
			logger.info("※ UUID          : "+ uuid);

			String retValue = "";
			if (startStopType.equals(START_SOCKET_SERVER)) {
				retValue = SocketAdapterManager.getInstance().start(adapterGroupName, adapterName);

			} else if (startStopType.equals(STOP_SOCKET_SERVER)) {
				retValue = SocketAdapterManager.getInstance().stop(adapterGroupName, adapterName);

			} else if (startStopType.equals(STOP_SOCKET_SESSION)) {
                logger.debug("★★★★★★★★★★★★★★★★ SocketStartStopCommand : 사용자에 의한 Socket Session 강제 종료가 요청되었습니다. ★★★★★★★★★★★★★★★★");
				BatchRunningJobManager.getInstance().closeRunningSocket(uuid);
				retValue = "Socket Session 강제 종료가 완료 되었습니다.";

			} else  {
				throw new Exception("Start/Stop 구분 파라미터 오류");
			}

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

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

//	private void stopSession(String adapterGroupName, String adapterName, String remoteIpPort) throws Exception {
//
//		String[] TempIpPort = remoteIpPort.split(":");
//		String remoteIp   = TempIpPort[0];
//		String remotePort = TempIpPort[1];
//
//		//소켓서버에 연결된 전체 Session 정보를 메모리에서 조회
//		//(연결된 Session 이 없어도 각 AdapterGroup 별 LinkedList 정보가 존재함)
//		HashMap allSessions = SocketAdapterManager.getInstance().getAllSessions();
//		if (allSessions == null || allSessions.size() == 0) throw new Exception("모든 어댑터그룹의 세션 정보가 비어있습니다.");
//
//		//AdapterGroup 명 조회
//		Object[] adapterGroupNames = allSessions.keySet().toArray();
//		//Arrays.sort(adapterGroupNames);
//
//		//===================================================================================
//		//AdapterGroup 별 LOOP
//		for (int i=0; i<allSessions.size(); i++) {
//
//			logger.debug("> "+ adapterGroupNames[i]);
//			if (!adapterGroupName.equals(adapterGroupNames[i])) continue;
//
//			//해당 AdapterGroup의 현재 연결된 Session 정보 조회
//			//(Adapter 별로 분리하지 않고 연결 순서대로 들어가있다)
//			LinkedList serviceList = (LinkedList) allSessions.get(adapterGroupNames[i]);
//			if (serviceList == null || serviceList.size() == 0) break;
//
//			//-------------------------------------------------------------------
//			//Adapter 별 LOOP
//			for (int k=0; k<serviceList.size(); k++) {
//				InboundServer session = (InboundServer) serviceList.get(k);
//				AdapterVO avo = session.getContext().getAdapterVO();
//				logger.debug("    > "+ avo.getName() +" / "+ session.getRemoteIPAddress() +" / "+ session.getRemotePort());
//
//				if (adapterName.equals(avo.getName()) &&
//				    remoteIp.equals(session.getRemoteIPAddress()) &&
//					remotePort.equals(session.getRemotePort()) ) {
//
//					session.disconnect();
//					SocketAdapterManager.getInstance().removeConnection(session);
//					return;
//				}
//			}
//			//-------------------------------------------------------------------
//		}
//		//===================================================================================
//
//		throw new Exception("해당 세션이 이미 종료 되었습니다.");
//	}

}
