#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEFAULT_ROOT="/var/Galeria-ALPR-Control-Center"

if [[ -z "${INSTALL_ROOT:-}" ]]; then
  if [[ -d "$SCRIPT_DIR/server" && -d "$SCRIPT_DIR/web-admin" ]]; then
    INSTALL_ROOT="$SCRIPT_DIR"
  else
    INSTALL_ROOT="$DEFAULT_ROOT"
  fi
fi

SERVER_PATH="$INSTALL_ROOT/server"
WEB_PATH="$INSTALL_ROOT/web-admin"

for dir in "$SERVER_PATH" "$WEB_PATH"; do
  if [[ ! -d "$dir" ]]; then
    echo "Required folder not found: $dir. Run the deploy script first." >&2
    exit 1
  fi
done

echo "==> Starting API (server) and dashboard (web-admin) from \"$INSTALL_ROOT\""

start_services() {
  npm --prefix "$SERVER_PATH" run start &
  SERVER_PID=$!
  npm --prefix "$WEB_PATH" run preview -- --host 0.0.0.0 --port 5189 &
  WEB_PID=$!
}

cleanup() {
  local reason="${1:-Stopping services}"
  echo -e "\n==> $reason"
  for pid in "${SERVER_PID:-}" "${WEB_PID:-}"; do
    if [[ -n "$pid" ]] && kill -0 "$pid" >/dev/null 2>&1; then
      kill "$pid" >/dev/null 2>&1 || true
      sleep 0.5
      if kill -0 "$pid" >/dev/null 2>&1; then
        kill -9 "$pid" >/dev/null 2>&1 || true
      fi
    fi
  done
}

start_services
trap 'cleanup "Signal received, stopping services"' INT TERM

echo "==> Press Ctrl+C to stop both services."
first_exit=0
while true; do
  if ! kill -0 "$SERVER_PID" >/dev/null 2>&1; then
    wait "$SERVER_PID"
    first_exit=$?
    break
  fi
  if ! kill -0 "$WEB_PID" >/dev/null 2>&1; then
    wait "$WEB_PID"
    first_exit=$?
    break
  fi
  sleep 1
done

cleanup "One service stopped, shutting down the other"
wait "$SERVER_PID" >/dev/null 2>&1 || true
wait "$WEB_PID" >/dev/null 2>&1 || true
exit "$first_exit"
