package kr.gmtc.gw.elastic.parser.replayLog;

import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;

import kr.gmtc.gw.elastic.utils.LogMsgParserUtile;
import kr.gmtc.gw.elastic.vo.ElasticMsgHeader;
import kr.gmtc.gw.elastic.vo.ElasticResultMsgVO;
import kr.gmtc.gw.elastic.vo.LogMsgParserVO;
import kr.gmtc.gw.elastic.vo.ReplayLog.AiLocationVO;

public class ParserAILocation {
    
    private List<ElasticResultMsgVO> logMsgs;

    Queue<LogMsgParserVO> parserAiLocQ = new LinkedBlockingQueue<LogMsgParserVO>();

    LogMsgParserUtile pUtile;
    
    public ParserAILocation(){

        pUtile = new LogMsgParserUtile();

    }

    public void logParser(List<ElasticResultMsgVO> recvMsgs){

        this.logMsgs = recvMsgs;
        
        List<AiLocationVO> parserList = new ArrayList<AiLocationVO>();
        AiLocationVO parserVO;

        LogMsgParserVO   logVO;
        ElasticMsgHeader logHeader;

        for( ElasticResultMsgVO mv : logMsgs){

            String sMsg = mv.getMessage();
            
            logVO = new LogMsgParserVO();
            
            /*** 메시지 Pipe(|) 구분 ***/
            String[] split_Div = pUtile.splitString(sMsg, pUtile.DIV_PIPE);

            /*** 메시지 Header 변환 START ***/
            String[] split_Header = pUtile.splitString(split_Div[0], pUtile.DIV_COMMA);

            logHeader = new ElasticMsgHeader();
            logHeader.setLog_dt(split_Header[0]);
            logHeader.setLog_se(split_Header[1]);
            logHeader.setSw_se(split_Header[2]);
            logHeader.setServer_se(split_Header[3]);

            logVO.setHeader(logHeader);
            /*** 메시지 Header 변환 END ***/

            /*** 메시지 data(body) 변환 START ***/
            String sDatas = split_Div[1];

            String[] split_Data = null;

            //Data부 여러줄 인지 확인(^)
            int iDivCnt_Datas = pUtile.countDivInMsg(sDatas, pUtile.DIV_CARET);

            // Data부 여러줄인경우 분리(^)
            if(iDivCnt_Datas > 0){
                split_Data = pUtile.splitString(sDatas, pUtile.DIV_CARET);
            }else{
                split_Data = new String[1];
                split_Data[0] = sDatas;
            }

            /**** Data부 한줄씩 처리 START ****/
            for(String loop1Data : split_Data){

                parserVO = new AiLocationVO();

                // 일반 필드 분리(,)
                String[] split_Field = pUtile.splitString(loop1Data, pUtile.DIV_COMMA);
                
                parserVO.setDtct_tm(split_Field[0]);                                                // 객체 탐지 시간
                parserVO.setDtct_cls(split_Field[1]);                                               // 객체 탐지 결과
                parserVO.setMta_tm(split_Field[2]);                                                 //
                parserVO.setRw_tm(split_Field[3]);                                                  //
                parserVO.setCc_id(pUtile.splitString(split_Field[4], pUtile.DIV_AT));               // 해당 영상 스트림을 전송한 CCTV 정보 
                parserVO.setZn_id(split_Field[5]);                                                  // 주기장 CCTV 담당 구역 정보
                parserVO.setArcrft_tp(split_Field[6]);                                              // 항공기 기종
                parserVO.setArln(split_Field[7]);                                                   // 항공사
                parserVO.setTrck_id(split_Field[8] + ',' + split_Field[9] + ',' + split_Field[10]); // 객체 추적 ID
                parserVO.setBb_tlp(pUtile.splitString(split_Field[11], pUtile.DIV_AT));             // 영상 내 객체 탐지 Bounding Box 좌상단점 좌표(2차원 Pixels // 단위 좌표)
                parserVO.setBb_brp(pUtile.splitString(split_Field[12], pUtile.DIV_AT));             // 영상 내 객체 탐지 Bounding Box 우하단점 좌표(2차원 Pixels // 단위 좌표)
                parserVO.setCrd_frm(pUtile.splitString(split_Field[13], pUtile.DIV_AT));            // 영상 내 객체 위치 좌표(2차원 Pixels 단위 좌표)
                parserVO.setCrd_glbl(pUtile.splitString(split_Field[14], pUtile.DIV_AT));           // 객체 글로벌 좌표(위도, 경도)
                parserVO.setDrctn(split_Field[15]);                                                 // 객체 이동 방향(degree)
                parserVO.setArcrft_stnd(split_Field[16]);                                           // 글로벌 좌표 상에서 주기장(aircraft stand) 영역 내 위치 여부
                parserVO.setSpd(split_Field[17]);                                                   // 객체 이동 속력(km/h)

                parserList.add(parserVO);
            }
            /**** Data부 한줄씩 처리 END ****/

            logVO.setData(parserList);
            /*** 메시지 data(body) 변환 END ***/

            // Que에 파싱 데이터 담기
            parserAiLocQ.offer(logVO) ;

        } // for( ElasticResultMsgVO mv : logMsgs){... END

        

    }




}
