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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

source "$ROOT_DIR/scripts/load-node.sh"
source "$ROOT_DIR/scripts/ngrok-common.sh"

NODE_BIN="$(command -v node)"
APP_URL="${APP_URL:-http://127.0.0.1:3000/}"
NGROK_URL="${NGROK_URL:-https://comparatuvehiculo.ngrok.io}"
NGROK_UPSTREAM="${NGROK_UPSTREAM:-127.0.0.1:3000}"
APP_LOG_FILE="${APP_LOG_FILE:-/tmp/comp_autos_server.log}"
NGROK_LOG_FILE="${NGROK_LOG_FILE:-/tmp/comp_autos_ngrok.log}"
APP_MATCH=".output/server/index.mjs"

cleanup() {
  if [[ -n "${NGROK_PID:-}" ]] && kill -0 "$NGROK_PID" >/dev/null 2>&1; then
    kill "$NGROK_PID" >/dev/null 2>&1 || true
  fi

  if [[ -n "${APP_PID:-}" ]] && kill -0 "$APP_PID" >/dev/null 2>&1; then
    kill "$APP_PID" >/dev/null 2>&1 || true
  fi
}

trap cleanup EXIT INT TERM

pkill -f "$APP_MATCH" >/dev/null 2>&1 || true
mapfile -t EXISTING_NGROK_PIDS < <(ps -eo pid=,args= | awk -v url="$NGROK_URL" '$0 ~ /ngrok http/ && index($0, url) { print $1 }')

if ((${#EXISTING_NGROK_PIDS[@]} > 0)); then
  kill "${EXISTING_NGROK_PIDS[@]}" >/dev/null 2>&1 || true
  sleep 2
fi

echo "Iniciando servidor local..."
"$NODE_BIN" --env-file-if-exists=.env .output/server/index.mjs > "$APP_LOG_FILE" 2>&1 &
APP_PID=$!

for _ in {1..20}; do
  if curl -fsS --max-time 5 "$APP_URL" >/dev/null 2>&1; then
    echo "Servidor listo en $APP_URL"
    break
  fi

  if ! kill -0 "$APP_PID" >/dev/null 2>&1; then
    wait "$APP_PID" || true
    echo "El servidor se cerro antes de quedar listo." >&2
    echo "Revisa el log en $APP_LOG_FILE" >&2
    exit 1
  fi

  sleep 1
done

echo "Iniciando tunel ngrok..."
configure_ngrok_authtoken
assert_valid_ngrok_config
ngrok http --url="$NGROK_URL" "$NGROK_UPSTREAM" > "$NGROK_LOG_FILE" 2>&1 &
NGROK_PID=$!

for _ in {1..20}; do
  if curl -I -fsS --max-time 5 "$NGROK_URL" -H "ngrok-skip-browser-warning: true" >/dev/null 2>&1; then
    echo "Stack listo en $NGROK_URL"
    echo "Log servidor: $APP_LOG_FILE"
    echo "Log ngrok: $NGROK_LOG_FILE"
    break
  fi

  if ! kill -0 "$NGROK_PID" >/dev/null 2>&1; then
    wait "$NGROK_PID" || true
    echo "Ngrok se cerro antes de quedar listo." >&2
    echo "Revisa el log en $NGROK_LOG_FILE" >&2
    exit 1
  fi

  sleep 1
done

while true; do
  if ! kill -0 "$APP_PID" >/dev/null 2>&1; then
    wait "$APP_PID" || true
    echo "El servidor local se cerro." >&2
    echo "Revisa el log en $APP_LOG_FILE" >&2
    exit 1
  fi

  if ! kill -0 "$NGROK_PID" >/dev/null 2>&1; then
    wait "$NGROK_PID" || true
    echo "Ngrok se cerro." >&2
    echo "Revisa el log en $NGROK_LOG_FILE" >&2
    exit 1
  fi

  sleep 5
done
