#!/bin/sh
# this start the xpra instance and invoke jxbrowser in it.
# args - 1) profile-name (which holds script recording settings) 2) productKey - (for unique user)
PROFILE_NAME=$1
USER_NAME=$2
XPRA_LISTEN_PORT=$3
APPLICATION=$4
UUID=$5
KEY=$6
ELE_REPO_MODE=2

XPRA_DISP_LOG_PATH=$NS_WDIR/.tmp/xpra/${USER_NAME}
JX_ARGS="${PROFILE_NAME} ${USER_NAME} ${ELE_REPO_MODE}"
NS_LIB=$NS_WDIR/webapps/netstorm/lib
DASH_LIB=$NS_WDIR/webapps/DashboardServer/WEB-INF/lib
JXBrowserVer=7.33.2
JX_CLASSPATH=":$NS_LIB/engine-gecko.jar:$NS_LIB/engine-webkit.jar:$NS_LIB/MozillaGlue.jar:$NS_LIB/xulrunner-windows.jar:$NS_LIB/MozillaInterfaces.jar:$NS_LIB/tuxpack-0.2.jar:$NS_LIB/winpack-3.8.2.jar:$NS_LIB/netstorm_bean.jar:$NS_LIB/netstorm_servletClient.jar:$NS_LIB/amf.jar:$NS_LIB/commonClient.jar:$NS_LIB/commons-io-2.2.jar:$NS_LIB/jxbrowser-2.9.1.jar:$NS_LIB/jxbrowser-$JXBrowserVer.jar:$NS_LIB/xercesImpl-2.11.0.1.jar:$NS_LIB/xml-apis-1.4.01.jar:$NS_LIB/jxbrowser-swing-$JXBrowserVer.jar:$NS_LIB/html_recorder7.jar:$NS_LIB/jxbrowser-linux64-$JXBrowserVer.jar:$NS_LIB/runlogic.jar:$NS_LIB/json_simple-1.1.jar:$NS_LIB/gson-2.2.2.jar:$NS_LIB/recorderUtils.jar:$NS_LIB/jmimemagic-0.1.0.jar:$NS_LIB/commons-logging-1.1.1.jar:$NS_LIB/apache-jakarta-oro.jar:$NS_LIB/swingx-all-1.6.4.jar:$NS_LIB/commons-codec-1.6.jar:$DASH_LIB/script-dto.jar"
JX_CMD=""
DEFAULT_TIMEOUT_ARGS=""
RBU=0
RESOLUTION_SIZE=""
pid_count=0
USERID=`id -u cavisson`
mkdir -p $NS_WDIR/webapps/netstorm/temp/${UUID}
mkdir -p $NS_WDIR/.tmp/
Lockfile=$NS_WDIR/.tmp/.appium_lockfile

#RDP variables
RDP=0

#take global pid counter at Netstorm end.

if [ $# == 0 ];then
  echo "Aruments missing"
  exit 1
elif [ $# != 1 -a "X$2" != "XR" ];then
  XPRA_PID_FILE=$NS_WDIR/.pidfiles/.Xpra_$USER_NAME.pid
  #Handling for APPLICATION
  if [ "X$APPLICATION" == "Xappium" ];then
    if [ ! -f /home/cavisson/thirdparty/appium/appium.AppImage ]; then
        echo "Error: Upgrade Appium Installer build"
	exit -1
    fi
    DEFAULT_TIMEOUT_ARGS="--idle-timeout=300 --server-idle-timeout=120"
  else
    JX_CMD="java -cp ${JX_CLASSPATH} com.netstorm.chromium.browser.NSChromeBrowser ${JX_ARGS}"
    DEFAULT_TIMEOUT_ARGS="--idle-timeout=300 --server-idle-timeout=120"
    #RBU xpra integration mode TR2001_uid+nvmid_sesison_ins 
    XPRA_DISP_LOG_FP=$XPRA_DISP_LOG_PATH/xpra.disp
  fi
else
  #split $1 and get TR
  USER_NAME=$1
  if [ "X$2" == "XR" ];then
    RDP=1
    USER=$3
    PASSWORD=$4
    DOMAIN=$5
    HOST=$6
  else
     RBU=1
     RESOLUTION_SIZE="--resize-display=1536x864" 
  fi
  TR=`echo $1 | awk -F'_' '{printf $1}'`

  #Assuming logs/TRNUM/.pidfiles direcory will be available and make sure that pid file name should be unique.
  pid_count=`ls -ltra $NS_WDIR/logs/$TR/.pidfiles/ | grep Xpra_ | tail -1 | awk -F'.' '{printf $2}' | awk -F'_' '{printf $3}'`

  if [ "X$pid_count" != "X" ];then
    pid_count=`expr $pid_count + 1`
    XPRA_PID_FILE=$NS_WDIR/logs/$TR/.pidfiles/.Xpra_${USER_NAME}_$pid_count.pid
  else
    XPRA_PID_FILE=$NS_WDIR/logs/$TR/.pidfiles/.Xpra_${USER_NAME}_0.pid
  fi
  # Edit will be disabled default from Live XPRA GUI, user can take control of the live session
  #DEFAULT_TIMEOUT_ARGS="--readonly=yes"
  XPRA_DISP_LOG_PATH=$NS_WDIR/logs/$TR/ns_logs
  XPRA_DISP_LOG_FP=$XPRA_DISP_LOG_PATH/xpra_display.txt
fi

XPRA_ERR_FP=$XPRA_DISP_LOG_PATH/xpra_error.txt
mkdir -p $XPRA_DISP_LOG_PATH
#xpra_output=`xpra start --start="${JX_CMD}" --bind-tcp=0.0.0.0:${XPRA_LISTEN_PORT} --html=on --ssl-cert=/home/cavisson/work/cert/cav-test-server.pem 2>&1`
xpra_output=`xpra start ${RESOLUTION_SIZE} --start="${JX_CMD}" --html=on --ssl-cert=/home/cavisson/work/cert/cav-test.pem --notifications=no ${DEFAULT_TIMEOUT_ARGS} --mousewheel=on --pidfile=$XPRA_PID_FILE 2>&1`

#while XPRA_PID_FILE does not exist,wait for 200ms each time/iteration 
#Max 50 iteration means 10 seconds 
counter=0
while [ $counter -lt 50 ]
do
  if [ -f $XPRA_PID_FILE ];then
    break 
  fi
  
  counter=`expr $counter + 1`
  sleep .2
done  

appium_get_lock(){
  max_retries=60
  retry_count=0

  while true; 
  do
    if [ ! -f "$Lockfile" ]; then
      touch "$Lockfile"
      return 0
    else
      if [ "$retry_count" -eq "$max_retries" ]; then
        return 1
      else
        ((retry_count++))
        sleep 1
      fi
    fi
 done
}

appium_release_lock(){
  local ap_log=$1

  if [ -f "$ap_log" ]; then
    rm "$Lockfile"
  fi
}

check_start_BrowserStack() {
  local max_retries=60
  local retry_count=0
  local log_file=$1
  local target_message="You can now access your local server(s) in our remote browser."

  while true; 
  do
    if grep -q "$target_message" "$log_file"; then
      rm "$log_file"
      return 0
    else
      if [ "$retry_count" -eq "$max_retries" ]; then
          return 1
      else
          ((retry_count++))
          sleep 1
      fi
    fi
  done
}

display_used=`echo $xpra_output | awk -F 'Actual display used: :' '{print $2}' | cut -d ' ' -f 1`

if [ "X$APPLICATION" == "Xappium" ];then
  export DISPLAY=:$display_used
  export CAV_APPIUM_AUTOSTART=1;
  export CAV_APPIUM_PROFILE=$UUID
  echo "$display_used"

  #handling for BrowserStack
  BSL_LOG_FILE=$NS_WDIR/webapps/netstorm/temp/${UUID}/BrowserStack.log
  APM_LOG_FILE=$NS_WDIR/webapps/netstorm/temp/${UUID}/appium.log
  nsu_connect_with_BS_RDT -k $KEY -i $UUID -d $display_used -o start 1>${BSL_LOG_FILE} 2>&1 
  check_start_BrowserStack ${BSL_LOG_FILE}

  #acquire lock for appium
  if [ $? -eq 0 ]; then
    appium_get_lock
    get_lock_status=$?
    if [ $get_lock_status -eq 0 ]; then
      if [ ! -f /home/cavisson/thirdparty/appium/appium.AppImage ]; then
        echo "Error: Upgrade Appium Installer build"
        appium_release_lock ${APM_LOG_FILE}
        exit -1
      else  	    
        nohup /home/cavisson/thirdparty/appium/appium.AppImage 1>${APM_LOG_FILE} 2>&1 &
        sleep 2 # Putting sleep to wait for Appium to get started.
        appium_release_lock ${APM_LOG_FILE}
      fi
    fi
  fi

  exit 0 
fi

if [ $display_used -ge 0  2>/dev/null ];then
  echo "$display_used"
  #make file inside display_used - ControllerName_TR (for the cleaning purpose at the time of initialization of nsu_auto_gen_prof_and_vnc)
  CONTROLLER=`echo $NS_WDIR | cut -d'/' -f4`
  if [ -n "$TR" ]; then
    touch /run/user/${USERID}/xpra/$display_used/${CONTROLLER}_$TR
  fi
  PID=`cat /run/user/${USERID}/xpra/$display_used/xvfb.pid`
  if [ $RBU == 1 ];then
    echo $display_used,$PID >>$XPRA_DISP_LOG_FP
      elif [ $RDP == 1 ];then
    export DISPLAY=:$display_used
    echo "display_used for RDP = $display_used"
    xfreerdp +clipboard /cert:ignore /grab-keyboard /u:$USER /p:"$PASSWORD" /d:$DOMAIN /v:$HOST
  else
    echo $display_used >>$XPRA_DISP_LOG_FP
  fi
else
  echo $xpra_output >>$XPRA_ERR_FP
  if [[ $xpra_output == *"xpra: command not found"* ]]; then
    echo "Error: required package is not available. Please upgrade Cavbin. "
  else 
    echo "Error: recorder instance not started"	  
  fi
fi 
