#!/bin/sh
OLDPATH=$PATH

SCRIPTDIR=$(dirname "$0")
NODE=$(cd "$SCRIPTDIR" && pwd)

WHEREAMI=$(pwd)

if [ -z "$(/sbin/ldconfig -p | grep libatomic)" ]; then
  echo "[!] Dependencies need to be installed: libatomic1"
  exit 1
fi

export PATH=$NODE/node_binaries/bin:"$PATH"
NODEINST=$(which node)
NODEOPTS="--no-warnings --max-old-space-size=2048"

if [ -f "hybrixd.conf" ]; then
  OUTPUT=$(grep -e 'output[ ]*=[ ]*true[ ]*$' hybrixd.conf)
else
  echo "[i] No hybrixd.conf found, creating empty conf file"  
  echo "" > hybrixd.conf
fi

OUTPUT=$(grep -s -e 'output[ ]*=[ ]*true[ ]*$' hybrixd.conf)

getPID(){
  ps -A -o pid,args | grep -e '^\s*[0-9]\{2,8\} node hybrixd.js$' | head -n 1 | cut -f1 -d'n' | tr -d ' '
}

logger(){
  if [ -n "$OUTPUT" ]; then
    echo "$1 $(date +%Y-%m-%dT%T) $2 $3" | tee -a "$NODE/var/log/hybrixd.log"
  else
    echo "$1 $(date +%Y-%m-%dT%T) $2 $3" >>  "$NODE/var/log/hybrixd.log" 2>&1
  fi
}

handleShutDown(){
  if [ -f "$NODE/var/onstop" ]; then
      ON_STOP_ACTION=$(cat "$NODE/var/onstop")
      if [ "$ON_STOP_ACTION" = "restart" ]; then
          logger "[i]" "hybrixd" "Restarting..."
          startHybrixd
      elif [ "$ON_STOP_ACTION" = "update" ]; then
          sh "$NODE/scripts/npm/update.sh"
          startHybrixd
      else
          logger "[!]" "hybrixd" "Error: Unsupported onstop action!"
          logger "[i]" "hybrixd" "Stopped"
      fi
      rm -rf "$NODE/var/onstop" || true;
  elif [ -z "$OUTPUT" ]; then
    echo "hybrixd has been succesfully stopped"
  else
    logger "[i]" "hybrixd" "Stopped"
  fi;
}

startHybrixd(){
    cd "$NODE/lib"
    mkdir -p "$NODE/var/log"

    # Remove lingering onstop actions
    rm -rf "$NODE/var/onstop" || true;

    _term() {
      # Inserting line end because ctrl+c will add ugly chars
      if [ -n "$OUTPUT" ]; then
        echo "\n"
        logger "[i]" "hybrixd" "Ctrl+C pressed!"
      else
        echo "\nShutdown requested. Please wait..."
        echo "(Press Ctrl+C to force quit)"
      fi
      kill -TERM "$CHILD_PID" 2>/dev/null
    }

    trap _term INT

    ALREADY_RUNNING_PID=$(getPID)
    if [ -n "$ALREADY_RUNNING_PID" ]; then
      echo "[!] $(date +%Y%-m-%dT%T)" "hybrixd" "Another instance of hybrixd is already running!" | tee -a "$NODE/var/log/hybrixd.log"
      exit 1;
    fi

    if [ -n "$OUTPUT" ]; then
      NODE_OPTIONS="$NODEOPTS" node hybrixd.js 2>&1 | tee -a "$NODE/var/log/hybrixd.log" &
    else
      NODE_OPTIONS="$NODEOPTS" node hybrixd.js >>  "$NODE/var/log/hybrixd.log" 2>&1 &
    fi

    # Wait for child PID to be initialized
    CHILD_PID=""
    while [ -z "$CHILD_PID" ]
    do
      CHILD_PID=$(getPID)
      sleep 0.5
    done
    logger "[i]" "hybrixd" "Process running under PID $CHILD_PID"

    # Since wait will fire whenever the child process receives a signal, not when the child exits
    # we will keep waiting until the process/PID is gone. (wait -f does not work on macOs)
    while [ -n "$CHILD_PID" ]
    do
      CHILD_PID=$(getPID)
      if [ -n "$CHILD_PID" ]; then
         wait "$CHILD_PID"
      fi
      sleep 0.5
    done

    handleShutDown;

}

if [ "$1" = "" ]; then
  mkdir -p "$NODE/var/log"
  HYBRIXD_VERSION=$(node -p -e "require('./package.json').version")
  #if [ -z "$OUTPUT" ];then
    echo "
            ░░░░░░░░▒▒▒▒▒▒
       ░    ░░░░░▒▒▒▒▒▒▒▒▒▒▒
     ░░░    ░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ░░░░          ▒▒▒▒▒▒    ▓▓▓▓
    ░░░░    ▒▒▒▒    ▒▒▒▒    ▓▓▓▓
    ▒▒▒▒    ▒▒▒▒▒▒▒▒▒▒▓▓    ▓▓▓▓
    ▒▒▒▒    ▒▒▒▒    ▓▓▓▓    ▓▓▓▓
    ▒▒▒▒    ▒▒▒▒▓▓          ▓▓▓▓
     ▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓     ▓▓▓
       ▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓     ▓
          ▓▓▓▓▓▓▓▓▓▓▓▓▓
    "
    echo "    hybrixd $HYBRIXD_VERSION © hybrix 2025"

    echo "\n             Running..."
    echo "\n       Press Ctrl+C to stop.\n"
  #fi

  logger "[i]" "hybrixd" "Starting..."
  logger "[i]" "hybrixd" "Version $HYBRIXD_VERSION"
  NODE_VERSION=$($NODEINST --version)
  NODE_VERSION_MAJOR=$(echo $NODE_VERSION | cut -d'.' -f1 | cut -c2-)
  NODE_VERSION_MINOR=$(echo $NODE_VERSION | cut -d'.' -f2)

  if [ "$NODE_VERSION_MAJOR" -lt 12 ] || { [  "$NODE_VERSION_MAJOR" -eq 12 ] && [ "$NODE_VERSION_MINOR" -lt 13 ] ;}; then
      logger "[!]" "hybrixd" "Warning: hybrixd expects Node v12.13.0 or higher (found node $NODEINST @ $NODE_VERSION)"
      read -p "[?] Do you wish to continue? [y/N] " CONFIRM
      if [ "$CONFIRM" != "y" ]; then
          cd "$WHEREAMI"
          export PATH="$OLDPATH"
          logger "[.]" "hybrixd" "Stopped"
          exit 0
      fi
  else
    logger "[i]" "hybrixd" "Using node executable $NODEINST @ $NODE_VERSION."
  fi

  startHybrixd

elif [ "$1" = "start" ] || [ "$1" = "/c/start" ] || [ "$1" = "/command/start" ]; then
    ./hybrixd.start
elif [ "$1" = "version" ]; then
    npm version patch
elif [ "$1" = "stop" ] || [ "$1" = "restart" ] || [ "$1" = "update" ] || [ "$1" = "reload" ]; then
    cd "$NODE/lib"
    node hcmd.js "/command/$1"
else
    cd "$NODE/lib"
    node hcmd.js $@
fi
cd "$WHEREAMI"
export PATH="$OLDPATH"
