#!/bin/bash

#define requirements
ARCHREQ="64"
JAVAREQ_VERSION=21
GPPREQ_VERSION="11.4.0"
GLIBCREQ_VERSION="2.34"
GLIBCXXREQ_VERSION="3.4.30"

#app version
APP_VERSION=v2.5.3

#check architecture
ARCH=`uname -m`
if [[ $ARCH != *$ARCHREQ* ]]
then
  echo "$ARCH architecture is not supported. Aborting."
  exit 1
fi

#check if realpath and dirname commands are present
command -v realpath >/dev/null 2>&1 || { echo >&2 "'realpath' command is required.  Aborting."; exit 1; }
command -v dirname >/dev/null 2>&1 || { echo >&2 "'dirname' command is required.  Aborting."; exit 1; }
#get script dir
SCRIPT=`realpath $0`
SCRIPTPATH=`dirname $SCRIPT`

#variables
JAVACMD=/usr/bin/java
JAVA_OPTS="-Djna.debug_load=true -Djna.debug_load.jna=true -Djava.util.logging.config.file=logs/logging.properties -Ddpp.server.launch=true -Ddpp.server.address=127.0.0.1 -Ddpp.server.port=56342 -Ddpp.server.data.port=56343"
COMPASS_JAR=compass-$APP_VERSION.jar

#check if java exists
command -v $JAVACMD >/dev/null 2>&1 || { echo >&2 "Java is required (version $JAVAREQ_VERSION or higher), download at https://jdk.java.net "; exit 1; }
#check that java version is >= 21
version=$($JAVACMD -version 2>&1 | awk -F '"' '/version/ {print $2}')
if [[ $version == "1."* ]]
then
  result=$(echo $version | sed -e 's/1\.\([0-9]*\)\(.*\)/\1/; 1q')
else
  result=$(echo $version | sed -e 's/\([0-9]*\)\(.*\)/\1/; 1q')
fi
if [[ $result -lt $JAVAREQ_VERSION ]]
then
  echo "Java version $JAVAREQ_VERSION or higher is required. Found $version. Download at https://jdk.java.net"
  exit 1
fi

#check if g++ exists
command -v g++ >/dev/null 2>&1 || { echo >&2 "g++ is required (version $GPPREQ_VERSION or higher)"; exit 1; }
#check g++ version
version=`g++ -dumpfullversion`
major=$(echo $version | awk -F "." '{print $1}')
minor=$(echo $version | awk -F "." '{print $2}')
patch=$(echo $version | awk -F "." '{print $3}')
majorreq=$(echo $GPPREQ_VERSION | awk -F "." '{print $1}')
minorreq=$(echo $GPPREQ_VERSION | awk -F "." '{print $2}')
patchreq=$(echo $GPPREQ_VERSION | awk -F "." '{print $3}')
if [[ $major -lt $majorreq ]]
then
  echo "g++ version $GPPREQ_VERSION or higher is required. Found $version"
  exit 1
fi
if [[ $major -eq $majorreq ]]
then
  if [[ $minor -lt $minorreq ]]
  then
    echo "g++ version $GPPREQ_VERSION or higher is required. Found $version"
    exit 1
  fi
  if [[ $minor -eq $minorreq ]]
  then
    if [[ $patch -lt $patchreq ]]
    then
      echo "g++ version $GPPREQ_VERSION or higher is required. Found $version"
      exit 1
    fi
  fi
fi

# Other SNAP settings *****
# Not good, needed for fontconfig
export XDG_DATA_HOME=$SNAP/usr/share
# Font Config
export FONTCONFIG_PATH=$SNAP/etc/fonts/config.d
export FONTCONFIG_FILE=$SNAP/etc/fonts/fonts.conf

if [[ ! -z "${SNAP}" ]]; then
  if [ ! -e $HOME/../common/compass.ins ]; then
    touch $HOME/../common/compass.ins
    region=$(locale | grep LC_NUMERIC | awk -F= '{print $2}')
    timezone=$(timedatectl show --property=Timezone --value)
    echo "$region" | grep -q "_IN"
    regioncheck=$?
    if [ $regioncheck -eq 0 ] || [ "$timezone" = "Asia/Kolkata" ]; then
      touch $HOME/../common/compass.laf
    fi
  fi
  if [ -e $HOME/../common/compass.laf ]; then
    COMPASS_JAR=Icompass.jar
  fi
fi
# *************************

#check CAENDPPServer dependencies
cd $SCRIPTPATH/server/linux
PREV_LIBRARY_PATH="$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="$PWD:$LD_LIBRARY_PATH"
SERVER_NOTFOUND=`ldd CAENDPPServer | grep "not found" | wc -l`
if [[ $SERVER_NOTFOUND -gt 0 ]]
then
  ldd CAENDPPServer | grep "not found"
  export LD_LIBRARY_PATH="$PREV_LIBRARY_PATH"
  exit 1
fi
#check CAENDPPServer related GLIBC version
clibrary=`ldd CAENDPPServer | grep "libc" | awk '{print $3}'`
GLIBC_FOUND=`strings $clibrary | grep "GLIBC_$GLIBCREQ_VERSION" | wc -l`
if [[ $GLIBC_FOUND -eq 0 ]]
then
  echo "GLIBC_$GLIBCREQ_VERSION not found in $clibrary library. Aborting."
  export LD_LIBRARY_PATH="$PREV_LIBRARY_PATH"
  exit 1
fi
export LD_LIBRARY_PATH="$PREV_LIBRARY_PATH"

#check CoMPASSPlot dependencies
cd $SCRIPTPATH/plot/linux/bin
PREV_LIBRARY_PATH="$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="$PWD:$PWD/../lib:$PWD/Qt:$PWD/system:$LD_LIBRARY_PATH"
PLOT_NOTFOUND=`ldd CoMPASSPlot | grep "not found" | wc -l`
if [[ $PLOT_NOTFOUND -gt 0 ]]
then
  ldd CoMPASSPlot | grep "not found"
  export LD_LIBRARY_PATH="$PREV_LIBRARY_PATH"
  exit 1
fi
PLOT_NOTFOUND=`ldd platforms/* | grep "not found" | wc -l`
if [[ $PLOT_NOTFOUND -gt 0 ]]
then
  ldd platforms/* | grep "not found"
  export LD_LIBRARY_PATH="$PREV_LIBRARY_PATH"
  exit 1
fi
#check CoMPASSPlot related GLIBCXX version
cxxlibrary=`ldd CoMPASSPlot | grep "libstdc++" | awk '{print $3}'`
GLIBCXX_FOUND=`strings $cxxlibrary | grep "GLIBCXX_$GLIBCXXREQ_VERSION" | wc -l`
if [[ $GLIBCXX_FOUND -eq 0 ]]
then
  echo "GLIBCXX_$GLIBCXXREQ_VERSION not found in $cxxlibrary library. Aborting."
  export LD_LIBRARY_PATH="$PREV_LIBRARY_PATH"
  exit 1
fi
export LD_LIBRARY_PATH="$PREV_LIBRARY_PATH"

#start CoMPASS
cd $SCRIPTPATH
$JAVACMD $JAVA_OPTS -jar $COMPASS_JAR -Dapp.name="compass" -Dapp.home=$SCRIPTPATH -Dbasedir=$SCRIPTPATH it.caen.compass.CompassApp 1>&- 2>&-
