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 java.util.StringTokenizer;

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("snaWcaConnectionListService")
public class SnaWcaConnectionListService extends AgentExecCommand{

	private static final Logger logger = Logger.getLogger(SnaWcaConnectionListService.class);
	
	@Autowired
    @Qualifier("monitoringContext")
    private MonitoringContext monitoringContext;
	
	 /**
     * <pre>
     * 1. 기능 : SNA 정보 수집
     * 2. 처리 개요 : 
     *     - 명령어를 사용하여 정보를 수집 파싱한다.
     *     - 파싱한 정보를 RtsServiceSnaConnectionList 에 저장한다.
     * 3. 주의사항 : 
     * </pre>
     * 
     * @author : 이동철
     * @version : $Revision: 1.7 $
     * @since : rts 1.0
     */
    public List executeWcaStatus(HashMap<String,Object> paramMap) {

        List list = new ArrayList();

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

        /*if ((paramMap.get("snaStatusCmd").toString()).indexOf("grep") > -1) {
            paramMap.put("snaStatusCmd","SnaStatus -tA | grep -E 'DOWN|그룹'");
        }*/

        logger.info("WcaStatus cmdPath : " + cmdPath);
        // 명령어
        String cmd = cmdPath + paramMap.get("WcaStatusCmd");

        //cmd = CharsetDecoderUtil.toKor(cmd);

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

        String result = execCommand(cmd);

        int linePoint = 0;

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

//        ------------------------------------------------------------------------------------------------------------------------------------------------
//        WCA IP          WCA ADAPTER NAME                                   CODE REG DATETIME   WCA APP CODE
//        ------------------------------------------------------------------------------------------------------------------------------------------------
//        127.0.0.1       _DAO_IN_SNA_AsR{DAO_IN_SNA_AsR_i11}                2019.10.10 08:06:20 ACM,ARS,ATS,B2B,BBA,BBG,BBS,BCN,BWB,CAQ,CAV,CBF,CBG,CDB,CDC,CDG,CDF,CDH,CDM,CDS,CFF,CFH,CFK,CFS,CFZ,CGK,CGS,CRS,DAN,EBA,EBE,EBP,EFT,EGI,EIE,EIG,ELB,ESI,ESJ,ESN,FPI,GCM,GMK,HBJ,HGD,HJB,HJJ,HJK,HMY,HPJ,HSH,HSI,HSJ,HST,HTJ,HYD,ICB,IKC,IDC,IVN,IWB,JGS,JJJ,JRO,JWB,JYB,JYK,KAA,KAD,KAE,KBG,KBH,KEC,KED,KEE,KFL,KGA,KIG,KIS,KJI,KJJ,KJW,KKT,KMB,KOK,KVN,KSI,KSJ,KSN,KTN,KWB,LGC,MCI,MFB,NKS,NOV,OTP,PAE,PBS,PDM,PGS,PID,POS,PPC,SBJ,SBK,SDS,SHI,SIA,SIC,SIN,SKW,SUP,SWB,THD,TPP,TXA,UNS,UJR,WHJ,WNS,ZLO
//        127.0.0.1       _DAO_IN_SNA_AsR{DAO_IN_SNA_AsR_i11}                2019.10.10 08:06:20 ACM,ARS,ATS,B2B,BBA,BBG,BBS,BCN,BWB,CAQ,CAV,CBF,CBG,CDB,CDC,CDG,CDF,CDH,CDM,CDS,CFF,CFH,CFK,CFS,CFZ,CGK,CGS,CRS,DAN,EBA,EBE,EBP,EFT,EGI,EIE,EIG,ELB,ESI,ESJ,ESN,FPI,GCM,GMK,HBJ,HGD,HJB,HJJ,HJK,HMY,HPJ,HSH,HSI,HSJ,HST,HTJ,HYD,ICB,IKC,IDC,IVN,IWB,JGS,JJJ,JRO,JWB,JYB,JYK,KAA,KAD,KAE,KBG,KBH,KEC,KED,KEE,KFL,KGA,KIG,KIS,KJI,KJJ,KJW,KKT,KMB,KOK,KVN,KSI,KSJ,KSN,KTN,KWB,LGC,MCI,MFB,NKS,NOV,OTP,PAE,PBS,PDM,PGS,PID,POS,PPC,SBJ,SBK,SDS,SHI,SIA,SIC,SIN,SKW,SUP,SWB,THD,TPP,TXA,UNS,UJR,WHJ,WNS,ZLO
//        127.0.0.1       _DAO_IN_SNA_AsR{DAO_IN_SNA_AsR_i11}                2019.10.10 08:06:20 ACM,ARS,ATS,B2B,BBA,BBG,BBS,BCN,BWB,CAQ,CAV,CBF,CBG,CDB,CDC,CDG,CDF,CDH,CDM,CDS,CFF,CFH,CFK,CFS,CFZ,CGK,CGS,CRS,DAN,EBA,EBE,EBP,EFT,EGI,EIE,EIG,ELB,ESI,ESJ,ESN,FPI,GCM,GMK,HBJ,HGD,HJB,HJJ,HJK,HMY,HPJ,HSH,HSI,HSJ,HST,HTJ,HYD,ICB,IKC,IDC,IVN,IWB,JGS,JJJ,JRO,JWB,JYB,JYK,KAA,KAD,KAE,KBG,KBH,KEC,KED,KEE,KFL,KGA,KIG,KIS,KJI,KJJ,KJW,KKT,KMB,KOK,KVN,KSI,KSJ,KSN,KTN,KWB,LGC,MCI,MFB,NKS,NOV,OTP,PAE,PBS,PDM,PGS,PID,POS,PPC,SBJ,SBK,SDS,SHI,SIA,SIC,SIN,SKW,SUP,SWB,THD,TPP,TXA,UNS,UJR,WHJ,WNS,ZLO
//        127.0.0.1       _DAO_IN_SNA_AsR{DAO_IN_SNA_AsR_i11}                2019.10.10 08:06:20 ACM,ARS,ATS,B2B,BBA,BBG,BBS,BCN,BWB,CAQ,CAV,CBF,CBG,CDB,CDC,CDG,CDF,CDH,CDM,CDS,CFF,CFH,CFK,CFS,CFZ,CGK,CGS,CRS,DAN,EBA,EBE,EBP,EFT,EGI,EIE,EIG,ELB,ESI,ESJ,ESN,FPI,GCM,GMK,HBJ,HGD,HJB,HJJ,HJK,HMY,HPJ,HSH,HSI,HSJ,HST,HTJ,HYD,ICB,IKC,IDC,IVN,IWB,JGS,JJJ,JRO,JWB,JYB,JYK,KAA,KAD,KAE,KBG,KBH,KEC,KED,KEE,KFL,KGA,KIG,KIS,KJI,KJJ,KJW,KKT,KMB,KOK,KVN,KSI,KSJ,KSN,KTN,KWB,LGC,MCI,MFB,NKS,NOV,OTP,PAE,PBS,PDM,PGS,PID,POS,PPC,SBJ,SBK,SDS,SHI,SIA,SIC,SIN,SKW,SUP,SWB,THD,TPP,TXA,UNS,UJR,WHJ,WNS,ZLO
//        127.0.0.1       _DAO_IN_SNA_AsR{DAO_IN_SNA_AsR_i11}                2019.10.10 08:06:20 ACM,ARS,ATS,B2B,BBA,BBG,BBS,BCN,BWB,CAQ,CAV,CBF,CBG,CDB,CDC,CDG,CDF,CDH,CDM,CDS,CFF,CFH,CFK,CFS,CFZ,CGK,CGS,CRS,DAN,EBA,EBE,EBP,EFT,EGI,EIE,EIG,ELB,ESI,ESJ,ESN,FPI,GCM,GMK,HBJ,HGD,HJB,HJJ,HJK,HMY,HPJ,HSH,HSI,HSJ,HST,HTJ,HYD,ICB,IKC,IDC,IVN,IWB,JGS,JJJ,JRO,JWB,JYB,JYK,KAA,KAD,KAE,KBG,KBH,KEC,KED,KEE,KFL,KGA,KIG,KIS,KJI,KJJ,KJW,KKT,KMB,KOK,KVN,KSI,KSJ,KSN,KTN,KWB,LGC,MCI,MFB,NKS,NOV,OTP,PAE,PBS,PDM,PGS,PID,POS,PPC,SBJ,SBK,SDS,SHI,SIA,SIC,SIN,SKW,SUP,SWB,THD,TPP,TXA,UNS,UJR,WHJ,WNS,ZLO

        while (linePoint > -1) {

            Map map = new HashMap();

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

            // 리스트 부분만
            if ((line.indexOf("======") < 0) && (line.indexOf("-----") < 0) && (line.indexOf("WCA") < 0)
                    && (line.indexOf("[") != 0)) {

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

                StringTokenizer st = new StringTokenizer(line);
                int stCount = 0;

                String regTime = "";

                while (st.hasMoreTokens()) {

                    String t = st.nextToken();
                    //System.out.println(t);

                    switch (stCount) {

                    case 0:
                        map.put("wcaIp", t.trim());
                        break;
                    case 1:
                        map.put("adapterName", t.trim());
                        break;
                    case 2:
                    	regTime = t.trim();
                        break;
                    case 3:
                        map.put("codeRegDate", regTime + " " + t.trim());
                        break;
                    case 4:
                        map.put("appCode", t.trim());
                        break;
                    }
                    stCount++;

                } // end of while

                if (map.size() >= 3) {
                    list.add(map);
                }

            }

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

        }

        return list;

    } // end of refresh
    
    /**
     * <pre>
     * 1. 기능 : Lu 모드에 대한 툴팁정보를 얻는다. 
     * </pre>
     * @author  : 이동철
     * @version : $Revision: 1.7 $
     * @since : rts 1.0
     * @param code
     * @return
     */
//    private String getLuModeToolTip(String code) {
//
//        String result = "";
//
//        if (code.equals("SENDONLY")) {
//
//            result = "전문 타입의 Non-Response 모드로 호스트로 데이터 송신만을 수행";
//
//        } else if (code.equals("RECVONLY")) {
//
//            result = "전문 타입의 Non-Response 모드로 호스트로부터 데이터 수신만을 수행";
//
//        } else if (code.equals("SENDRECV")) {
//
//            result = "전문 타입의 Response 모드로 호스트와 데이터 송수신 수행";
//
//        } else if (code.equals("TERMINAL")) {
//
//            result = "단말 타입의 Response 모드로 호스트와 데이터 송수신 수행";
//
//        }
//
//        return result;
//
//    }
    
    /**
     * <pre>
     * 1. 기능 : Tran 상태에 대한 툴팁정보를 얻는다. 
     * </pre>
     * @author  : 이동철
     * @version : $Revision: 1.7 $
     * @since : rts 1.0
     * @param code
     * @return
     */
//    private String getTranStateToolTip(String code) {
//
//        String result = "";
//
//        if (code.equals("NOTREADY")) {
//
//            result = "Transaction을 수행할 수 없는 상태";
//
//        } else if (code.equals("READY")) {
//
//            result = "Transaction을 수행할 수 있는 상태";
//
//        } else if (code.equals("SEND")) {
//
//            result = "호스트로부터 데이터를 송신하고 있는 상태";
//
//        } else if (code.equals("RECV")) {
//
//            result = "호스트로부터 데이터를 수신 대기하고 있는 상태";
//
//        }
//
//        return result;
//
//    }
    
    /**
     * <pre>
     * 1. 기능 : Lu 세부 상태에 대한 툴팁정보를 얻는다. 
     * </pre>
     * @author  : 이동철
     * @version : $Revision: 1.7 $
     * @since : rts 1.0
     * @param code
     * @return
     */
//    private String getLuDetailStateToolTip(String code) {
//
//        String result = "";
//
//        if (code.equals("API_ERROR")) {
//
//            result = "SNA Gateway 내부 장애가 발생한 상태";
//
//        } else if (code.equals("NOT_DEF")) {
//
//            result = "LU가 정의되지 않은 상태";
//
//        } else if (code.equals("LINK_DOWN")) {
//
//            result = "호스트와의 SNA Link가 Down된 상태";
//
//        } else if (code.equals("NET_DOWN")) {
//
//            result = "호스트와의 Network가 Down된 상태";
//
//        } else if (code.equals("DISCONN")) {
//
//            result = "호스트와의 LU 세션이 해제된 상태";
//
//        }
//
//        return result;
//
//    }

    /**
     * <pre>
     * 1. 기능 : Lu 상태에 대한 툴팁정보를 얻는다. 
     * </pre>
     * @author  : 이동철
     * @version : $Revision: 1.7 $
     * @since : rts 1.0
     * @param code
     * @return
     */
//    private String getLuStateToolTip(String code) {
//
//        String result = "";
//
//        if (code.equals("DOWN")) {
//
//            result = "호스트와 세션이 해제된 상태";
//
//        } else if (code.equals("TRY_INIT")) {
//
//            result = "호스트와 세션을 연결하기 위한 자원 초기화 상태";
//
//        } else if (code.equals("TRY_INITSELF")) {
//
//            result = "호스트로 INIT-SELF 데이터를 송신하는 상태";
//
//        } else if (code.equals("WAIT_BIND")) {
//
//            result = "호스트로부터 BIND 데이터를 수신 대기하는 상태";
//
//        } else if (code.equals("WAIT_SDT")) {
//
//            result = "호스트로부터 SDT 데이터를 수신 대기하는 상태";
//
//        } else if (code.equals("UP")) {
//
//            result = "호스트와 LU-LU 세션이 연결된 상태";
//
//        } else if (code.equals("TRY_TERMSELF")) {
//
//            result = "호스트로 TERM-SELF 데이터를 송신하는 상태";
//
//        } else if (code.equals("WAIT_UNBIND")) {
//
//            result = "호스트로부터 UNBIND 데이터를 수신 대기하는 상태";
//
//        } else if (code.equals("TRY_TERM")) {
//
//            result = "호스트와 세션을 해제하기 위한 자원 해제 상태";
//
//        } else if (code.equals("RECV_UNBIND")) {
//
//            result = "호스트로부터 UNBIND를 수신한 상태";
//
//        }
//
//        return result;
//
//    }
    
    /**
     * <pre>
     * 1. 기능 : Sna 명령어 실행
     * 2. 처리 개요 :
     *     - SnaStart, SnaStop 명령어 실행
     * 3. 주의사항 :
     * </pre>
     * @author  : 이동철
     * @version : $Revision: 1.8 $
     * @since : rts 1.0
     * @param form
     * @return
     */
    public List executeStartStop(HashMap<String,Object> paramMap) {

        // 명령어
        String cmd = paramMap.get("snaStatusCmd").toString();

        logger.info("SnaStartStop Cmd : " + cmd);

        return executeCmd(cmd);

    } // end of refresh
    

    /**
     * <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;

    }

}
