package com.eactive.eai.rms.onl.adapter.sna;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.eactive.eai.rms.common.context.MonitoringContext;
import com.eactive.eai.rms.onl.adapter.AgentExecCommand;

@Service("snaProcessStatusService")
public class SnaProcessStatusService  extends AgentExecCommand {
	
	private static final Logger logger = Logger.getLogger(SnaProcessStatusService.class);
	
	@Autowired
    @Qualifier("monitoringContext")
    private MonitoringContext monitoringContext;

	 public List executeSnaStatus(String snaStatusCmd) {

	        List list = new ArrayList();

	        // 명령어의 경로를 얻는다.
	        String cmdPath = monitoringContext.getStringProperty(
	                                MonitoringContext.SNA_STATUS_PATH,
	                                "/fsapp/eai/SNAAdapter/bin/");

	        // 명령어
	        String cmd = cmdPath + snaStatusCmd;

	        //cmd = CharsetDecoderUtil.toKor(cmd);

	        logger.info("SnaStatus Command Exec : " + cmd);

	        String result = execCommand(cmd);
	        
	        // YUN_DEBUG
	        logger.info("executeSnaStatus() ret size=" + result.length() );
	        logger.info("executeSnaStatus() result  =[" + result + "]" );
	        

	        logger.info("SnaStatus Command Result : \n" + result);

	        int linePoint = 0;

	        // 정보를 라인단위로 파싱하여
	        linePoint = result.indexOf("\n");

	        // ================================================================================================================================================
	        // 어댑터 그룹(OUT_SNA_KESAPOOL_001) LU 그룹명 (OUT_SNA_KESAPOOL_001_001) LU 그룹 상태 (정상)
	        // 총 LU수 (28) 총 백업 LU 수 (2) UP LU수 (28) 사용 가능 LU수 (28) 수신 대기 LU수 (0) 송신 대기 LU수 (0) WCA 세션 수 (5)
	        // 송신 건수 (0) 수신 건수 (0) TIMEOUT 건수 (0) 송신 실패 건수 (0) 수신 실패 건수 (0) 큐 대기 건수 (0) 큐 대기 최대 건수 (0)
	        // ================================================================================================================================================
	        // 어댑터 그룹(SNAAdapter_HOST_IN) LU 그룹명 (SNAAdapter_HOST_IN_001) LU 그룹 상태 (정상)
	        // 총 LU수 (50) 총 백업 LU 수 (0) UP LU수 (50) 사용 가능 LU수 (50) 수신 대기 LU수 (0) 송신 대기 LU수 (0) WCA 세션 수 (5)
	        // 송신 건수 (0) 수신 건수 (0) TIMEOUT 건수 (0) 송신 실패 건수 (0) 수신 실패 건수 (0) 큐 대기 건수 (0) 큐 대기 최대 건수 (0)
	        // ================================================================================================================================================
	        // 어댑터 그룹(SNAAdapter_HOST_OUT) LU 그룹명 (SNAAdapter_HOST_OUT_001) LU 그룹 상태 (정상)
	        // 총 LU수 (175) 총 백업 LU 수 (0) UP LU수 (175) 사용 가능 LU수 (175) 수신 대기 LU수 (0) 송신 대기 LU수 (0) WCA 세션 수 (5)
	        // 송신 건수 (0) 수신 건수 (0) TIMEOUT 건수 (0) 송신 실패 건수 (0) 수신 실패 건수 (0) 큐 대기 건수 (0) 큐 대기 최대 건수 (0)
	        // ================================================================================================================================================

	        String taskCode = "";
	        String luGroup = "";
	        String luGroupState = "";
	        String numLu = "";
	        String backupLu = "";
	        String upLu = "";
	        String usefulLu = "";
	        String resLu = "";
	        String sendLu = "";
	        String wcaSession = "";
	        String sendCnt = "";
	        String resCnt = "";
	        String timeOut = "";
	        String sendFailCnt = "";
	        String resFailCnt = "";
	        String queueWaitCnt = "";
	        String queueWaitMaxCnt = "";

	        while (linePoint > -1) {

	            // 한 라인만을 읽어 온다.
	            String line = result.substring(0, linePoint);
	            result = result.substring(linePoint + 1);

	            //logger.info("Line : " + line);

	            // 필요한 데이터가 있는 부분만 
	            if ((line.indexOf("======") < 0) && (line.indexOf("-----") < 0)) {

	                int point1 = 0;
	                int point2 = 0;

	                // 업무코드(서비스코드)와 LU그룹을 얻는부분
	                if (line.indexOf("LU 그룹 상태") > -1) {

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    // 서비스코드
	                    taskCode = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    // LU그룹
	                    luGroup = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //LU그룹 상태
	                    luGroupState = line.substring(point1 + 1, point2);

	                    //총 LU수, UP LU수, 사용 가능 LU수, 수신 대기 LU수, 송신 대기 LU수
	                } else if (line.indexOf("총 LU수") > -1) {

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //총 LU수
	                    numLu = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //백업LU수
	                    backupLu = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //UP LU수
	                    upLu = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //사용가능 LU수
	                    usefulLu = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //수신대기 LU수
	                    resLu = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //송신대기 LU수
	                    sendLu = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //WCA 세션 수
	                    wcaSession = line.substring(point1 + 1, point2);

	                } else if (line.indexOf("송신 건수") > -1) {

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //송신 건수
	                    sendCnt = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //수신 건수
	                    resCnt = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //타임아웃건수
	                    timeOut = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //송신실패건수
	                    sendFailCnt = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //수신실패건수
	                    resFailCnt = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //큐대기건수
	                    queueWaitCnt = line.substring(point1 + 1, point2);
	                    line = line.substring(point2 + 1);

	                    point1 = line.indexOf("(");
	                    point2 = line.indexOf(")");

	                    //큐 대기 최대 건수
	                    queueWaitMaxCnt = line.substring(point1 + 1, point2);

	                    Map map = new HashMap();
	                    map.put("taskCode", taskCode);
	                    map.put("luGroup", luGroup);
	                    map.put("luGroupState", luGroupState);
	                    map.put("numLu", numLu);
	                    map.put("backupLu", backupLu);
	                    map.put("upLu", upLu);
	                    map.put("usefulLu", usefulLu);
	                    map.put("resLu", resLu);
	                    map.put("sendLu", sendLu);
	                    map.put("wcaSession", wcaSession);
	                    map.put("sendCnt", sendCnt);
	                    map.put("resCnt", resCnt);
	                    map.put("timeOut", timeOut);
	                    map.put("sendFailCnt", sendFailCnt);
	                    map.put("resFailCnt", resFailCnt);
	                    map.put("queueWaitCnt", queueWaitCnt);
	                    map.put("queueWaitMaxCnt", queueWaitMaxCnt);

	                    list.add(map);

	                }

	            }

	            linePoint = result.indexOf("\n");

	        }

	        return list;

	    } // end of refresh
	 
	 /**
	 * <pre>
	 * 1. 기능 : Sna 명령어 실행
	 * 2. 처리 개요 :
	 *     - SnaRestart 명령어 실행
	 * 3. 주의사항 :
	 * </pre>
	 * @author  : 이동철
	 * @version : $Revision: 1.8 $
	 * @since : rts 1.0
	 * @param form
	 * @return
	 */
	public List executeInit(String cmd) {
	
	    logger.debug("SnaRestat Cmd : " + cmd);
	
	    return executeCmd(cmd);
	
	}
	
	  /**
     * <pre>
     * 1. 기능 : Sna 명령어 실행
     * 2. 처리 개요 :
     *     - BackupLUStart, BackupLUStop 명령어 실행
     * </pre>
     * @author  : 이동철
     * @version : $Revision: 1.8 $
     * @since : rts 1.0
     * @param form
     * @return
     */
    public List executeBackupLu(String cmd) {

        logger.debug("SnaBackupLuStartStop Cmd : " + cmd);

        return executeCmd(cmd);

    }
    
    /**
     * <pre>
     * 1. 기능 : 명령을 실행후 결과를 반환한다.
     * 2. 처리 개요 :
     *     - 명령어를 실행후 결과를 반환한다.
     * </pre>
     * @author  : 이동철
     * @version : $Revision: 1.8 $
     * @since : rts 1.0
     * @param cmd
     * @return
     */
    private List executeCmd(String cmd) {

        List list = new ArrayList();

        // 명령어의 경로를 얻는다.
        String cmdPath = monitoringContext.getStringProperty(
                         MonitoringContext.SNA_STATUS_PATH,
                         "/fsapp/eai/SNAAdapter/bin/");

        String command = cmdPath + cmd;

        String result = execCommand(command);

        Map map = new HashMap();
        if ((result.trim()).length() > 0) {
            map.put("msg", result.trim());
        } else {
            map.put("msg", "명령처리에 실패 하였습니다.");
        }

        list.add(map);

        return list;

    }
}
