/**
 * 변수 초기화
 */
var showLog = true;
var serverIp = WEBRTCURL;
var serverPort = 8880;
var sourceIp = '';
var resolution = '';
var bitrate = '';
var testCount = 12;
var autoTestMax = 8;
var autoTestCount = 1;
var transportType = 'udp';
var vid = new Array(testCount);
var autoTestStarted = false;
var playTime = 30;
var idleTime = 60;
var amsServer = null;
var masterServer = null;
var sessionList = null;
var activeList = {};
var cctvWindows = [];
var curTestIndex = 0;
var curVideoNum = 0;
var startFrom = 0;
var endTo = 0;
var nextWaitTerm = 0;
var maxWindows = 0;
var curWindow = 1;
var sysTargetServer = "192.168.201.200";
var sysProxyServer = "cctv.utic.go.kr:443";
var sysUseSecureConnection = true;
var sysNameMap = [];

sysNameMap['192.168.201.200'] = '0';
sysNameMap['192.168.201.231'] = '1';
sysNameMap['192.168.201.232'] = '2';
sysNameMap['192.168.201.233'] = '3';
sysNameMap['192.168.201.236'] = '4';
sysNameMap['192.168.201.241'] = '5';
sysNameMap['192.168.201.242'] = '6';
sysNameMap['192.168.201.243'] = '7';
sysNameMap['192.168.201.244'] = '8';
sysNameMap['192.168.202.221'] = '9';
sysNameMap['192.168.202.222'] = '10';
sysNameMap['192.168.202.223'] = '11';
sysNameMap['192.168.202.246'] = '12';
sysNameMap['192.168.202.247'] = '13';
sysNameMap['192.168.202.248'] = '14';
sysNameMap['192.168.202.250'] = '15';
sysNameMap['192.168.202.251'] = '16';
sysNameMap['192.168.202.252'] = '17';

function open_video(item, targetId) {
	var vid = targetId;
	var videoTimer = null;
	
  var clearVideoTimer = function() {
      if (videoTimer != null) {
          clearTimeout(videoTimer);
          videoTimer = null;
      }
  }
  
  var setVideoTimer = function() {
      clearVideoTimer();
      videoTimer = setTimeout(function() {
          open_video(item, vid);
          videoTimer = null;
      }, 10000);
  }
  
  var callback_video_ok = function(videoObj) {
      /* clear all timer */
      clearVideoTimer();
  }

	var callback_server_message = function(server, evt) {
		if(evt.code === undefined || evt.code === AcesVideo.msgMediaReady){
			if(document.getElementById(targetId)){
				document.getElementById(targetId).addEventListener('loadeddata', (e) => {
					var elm = e.currentTarget;
					if(elm.readyState >= 2){
						$(elm.parentElement).find('div.video-placeholder').hide();
					}
				})
			}			
		}
		if (evt.code !== undefined
			&& (evt.code == AcesVideo.msgMediaConnectionFail
				|| evt.code == AcesVideo.msgMediaError)
			&& this.target.SessionNameLong == evt.key) {
			if(document.getElementById(targetId)){
				$(document.getElementById(targetId).parentElement).find('div.video-placeholder p span').html('영상에 접속할 수 없습니다. 잠시 후 다시 시도해 주시기 바랍니다.');
			}
		}
		if (this.target.SessionNameLong == evt.key)
			set_status(evt.key + ': ' + evt.message, this.videoTag);
	}
	var callback_video_error = function(evt) {
      var result = null;

      if (evt !== undefined)
          result = evt.Result !== undefined ?
                      evt.Result
                      : (evt.result !== undefined ? evt.result : null);
      if (result == null) {
          var msg = evt != undefined && evt.message != undefined ?
                      `${evt.message}` : '장애 발생';

          /*
           * 단순 ws 접속 실패일 경우 AcesVideo에서 계속 처리하도록 함
           */
          if (msg == AcesVideo.msgConnectionError) {
              /* sock.onerror에서 호출되므로 굳이 영상을 닫지 않아도 됨 */
              return false;
          }

          /* 기존 영상은 닫음 */
          activeList[vid].shutdown();

          /* 재접속하도록 함 */
          amsServer.logOut(`${this.SessionNameLong}: 장애 발생. 20초 후 재접속함`, true);
          set_status(item.f0 + ': 재접속 예정', vid);
      } else {
          alert(`${this.sessionNameLong}: 현재 가용한 채널이 없어서 영상을 표시할 수 없음.`);
      }
  }
	var callback_video_shutdown = function(videoObj) {
		var vid = videoObj.targetVideo;

		activeList[vid] = null;
	}

	/*
	 * ================= 현장 구현 시 주의 ===================
	 *
	 *  같은 위치에서 이미 재생되고 있는 영상이 있다면 닫아 줌.
	 *
	 *  독립 창에서 영상을 표출할 경우 영상 재생이 끝나서 닫기를
	 *  할 경우 반드시 shutdown() 을 호출해야 함.
	 */
	if (activeList[vid] !== undefined && activeList[vid] != null) {
      activeList[vid].shutdown();
      activeList[vid] = null;
  }

	activeList[vid] = amsServer.openVideo(vid, item,
		callback_server_message,
		callback_video_ok,
		callback_video_error,
		callback_video_shutdown);
		
	setVideoTimer();
}

function set_status(value, where = null) {
	// console.log('WebRtc status: ' + value);
}

function findMinActiveKey(){
	let keys = Object.keys(activeList)
	let minKey = keys[0];
	let minReqId = null;
	
	for(let i = 0; i < keys.length; i++){
		let key = keys[i];
		let elem = activeList[key];
		
		if(elem != null){
			if(minReqId == null){
				minReqId = elem.requestID;
				minKey = key;
			} else if(elem.requestID < minReqId){
				minReqId = elem;
				minKey = key;
			}
		}
	}
	
	return minKey;
}

function closeCctvInfoByStreamSession(streamSession){
	if('undefined' !== typeof(cctvInfo)){
		for(let i = 0; i < cctvInfo.length; i++){
			if(cctvInfo[i].streamSession == streamSession){
				cctvInfo[i].close();
			}
		}
	}
	
	if('undefined' !== typeof(roadCctvInfo)){
		for(let i = 0; i < roadCctvInfo.length; i++){
			if(roadCctvInfo[i].streamSession == streamSession){
				roadCctvInfo[i].close();
			}
		}
	}
	
	if('undefined' !== typeof(roadCctvE05Info)){
		for(let i = 0; i < roadCctvE05Info.length; i++){
			if(roadCctvE05Info[i].streamSession == streamSession){
				roadCctvE05Info[i].close();
			}
		}
	}
}

function getActiveListCount(){
	let keys = Object.keys(activeList);
	let count = 0;
	
	for(let i = 0; i < keys.length; i++){
		if(activeList[keys[i]] != null){
			count++;
		}
	}
	
	return count;
}

function getKoRoadName(name, ip) {
	if (name == 'serverInterface')
		return 'si' + sysNameMap[ip];
	else if (name == 'streaming')
		return 'st' + sysNameMap[ip];
	return "notFound";
}

function setServerDefaultSettings(server){
    server.setUserGetTypeName(getKoRoadName);
    server.setAuthInfo('master-console', 'X1234uNx8@g1H');
    if (sysUseSecureConnection != undefined)
        server.setSecureConnection(sysUseSecureConnection);
    if (sysProxyServer != undefined)
        server.setProxyServer(sysProxyServer);
}

function closeVideoElement(videoRequest){
  videoRequest.shutdown();
  videoRequest.target.onVideoOK();
}