#!/bin/bash


################################################################################
# Variables                                                                    #
################################################################################
DATA_PATH=""
DEFAULT_MODE="default"
DISPLAYS="default cm 1024x768"
FALLBACK_REASON="no or wrong -t option given, fallback to default display type"
MAIN_ARG=""
declare -a ECP_WORK_DIR_PATH_SUBFOLDERS=("config data debug log media certificates profiling")

SRC_HTML="/opt/ECP/ui/uiandcharge/resources/bootstrap.html"
TOUCH_SRC_HTML="/opt/ECP/ui/uicm/resources/bootstrap.html"
COG_DATA_DIR="/run/cog"
TARGET_HTML="${COG_DATA_DIR}/bootstrap.html"

################################################################################
# Functions                                                                    #
################################################################################
HandleEvtecWorkDir()
{
    # Check if a path in ECP_WORK_FILES_DIR is given
    if [[ -z "$ECP_WORK_FILES_DIR" ]]; then

      # Check if a custom path is given
      if [[ -n "$DATA_PATH" ]]; then
        ECP_WORK_FILES_DIR=$DATA_PATH
      else
        # Fallback, current location
        ECP_WORK_FILES_DIR=$PWD/evtec-ecp-data
      fi

      export ECP_WORK_FILES_DIR
   fi
}

CheckApplicationMode()
{
  eval defaultMode="$1"
  eval fallbackReason="$2"
  eval types="$3"

  # Check Main arg, if not set fallback to default ChargeboxControl  
  for POS in ${types[@]}; do
    if [[ $POS == "$TYPE" ]]; then
      MAIN_ARG=$TYPE
    fi
  done
  
  if [[ -z "$MAIN_ARG" ]]; then
    echo $fallbackReason
    MAIN_ARG=$defaultMode
  fi
}

CreateEvtecFolderStructure()
{
  for subfolder in $ECP_WORK_DIR_PATH_SUBFOLDERS; do
    newpath="${1}"/$subfolder

    if [ ! -d "$newpath" ]; then
      mkdir $newpath -p
      chown xfc:xfc $newpath
    fi

  done
}

PrepareBootstrapHtml()
{
  # Prepare data dir
  export XDG_DATA_HOME=${COG_DATA_DIR}
  export XDG_CACHE_HOME=${COG_DATA_DIR}

  # json configuration path
  if [[ -f $ECP_WORK_FILES_DIR/config/config.json ]]; then
    CONFIG_PATH=$ECP_WORK_FILES_DIR/config/config.json
  else
    echo "! NO CONFIG FILE on this device"
    exit 1
  fi

  JSON_KEY_SERIAL='.Device.Serial'
  JSON_KEY_ROLE='.System.Role'
  # read out configuration (with trimmed "")
  SERIAL=$(jq $JSON_KEY_SERIAL "$CONFIG_PATH" | tr -d \")
  echo "Serial from config: $SERIAL"
  ROLE=$(jq $JSON_KEY_ROLE "$CONFIG_PATH" | tr -d \")
  echo "Role: $ROLE"

  if [[ "$ROLE" != "ControllerLocalHMI" ]]; then
    # calculate url from serial
    HIGH_BYTE=$(($(($((SERIAL -1)) / 100)) % 100))
    LOW_BYTE=$(($(($((SERIAL - 1)) % 100)) + 1))
    NEW_HOST="http://10.2.${HIGH_BYTE}.${LOW_BYTE}:8090/"
  else
    NEW_HOST="http://localhost:8090/"
  fi
  echo "Target host: $NEW_HOST"

  case $MAIN_ARG in
  ################# run default display #################
  "default")
    # write replaced bootstrap
    sed "s_<ECP-HMI-HOST>_${NEW_HOST}_" $SRC_HTML > $TARGET_HTML
    ;;
  "cm")
    # write replaced bootstrap
    sed "s_<ECP-HMI-HOST>_${NEW_HOST}_" $TOUCH_SRC_HTML > $TARGET_HTML
    ;;
  esac
}

################################################################################
# Help                                                                         #
################################################################################
Help()
{
   # Display Help
  echo "This script shall be used to start any of the displays on the MSI platform."
  echo
  echo "Syntax: run [-p|t|d]"
  echo "options:"
  echo "-d   Sets a specific data directory for the application"
  echo "-h   For help instructions"
  echo "-t   Sets a display type; 'default' OR 'touch' OR '1024x768'"
  echo "-    When omitted 'default' is used"
}


################################################################################
# Main entry                                                                   #
################################################################################
while getopts :ht:d: opt
do
  case $opt in
    h) Help
       exit
       ;;
    t) echo "option t : ($OPTARG)"
       TYPE="$OPTARG"
       ;;
    d) DATA_PATH="$OPTARG"
       ;;
    *) echo "option $opt unknown"
      ;;
   esac
done

# Preconditioning the application start - *Warmup 123*
HandleEvtecWorkDir
CreateEvtecFolderStructure $ECP_WORK_FILES_DIR
CheckApplicationMode $DEFAULT_MODE "\${FALLBACK_REASON}" "\${DISPLAYS}"
PrepareBootstrapHtml

# Start the application - *The semaphore is green*
echo "Display starts with: Role=${MAIN_ARG}  DataPath=${ECP_WORK_FILES_DIR}"

case $MAIN_ARG in
  ################# run default display #################
  "default")
    cog -P drm --platform-params=renderer=gles \
      --webprocess-failure=exit \
      --enable-page-cache=false \
      --enable-write-console-messages-to-stdout=1 \
      --user-agent="RemoteHMI $SERIAL" \
      $TARGET_HTML
    ;;
  ################# run charge master display #################
  "cm")
    cog -P drm --platform-params=renderer=gles \
      --webprocess-failure=exit \
      --enable-page-cache=false \
      --enable-write-console-messages-to-stdout=1 \
      --user-agent="RemoteHMI $SERIAL" \
      $TARGET_HTML
     ;;
  ################# run 1024x768 display #################
  "1024x768")
    #todo: commented below is the old school way, find something working in on newer platform "4.0".
    echo "$MAIN_ARG NOT IMPLEMENTED ON THIS PLATFORM"
    exit 1
#    pkill -9 Xorg
#
#    # settings are tested with a Winstar WF150ATYAMLNN0# display
#    fbset --geometry 1024 768 1024 768 24
#    fbset --timings 15748 152 48 3 23 104 4
#    fbset -vsync high
#
#    sleep 0.5
#    /usr/bin/Xfbdev -s 0 -nolisten tcp "$@" &
#    rm -rf /opt/firefox-profile-run
#    cp -ra /opt/firefox-profile-1024x768 /opt/firefox-profile-run
#    DISPLAY=:0 su xfc -c "firefox /opt/ECP/ui/uiandcharge/resources/bootstrap.html -profile /opt/firefox-profile-run"
    ;;
esac
