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

PORT="${PORT:-3001}"
HOST="${HOST:-127.0.0.1}"
PUBLIC_TUNNEL="${PUBLIC_TUNNEL:-1}"
TUNNEL_PROVIDER="${TUNNEL_PROVIDER:-cloudflared}"
CLOUDFLARED_EDGE_IP_VERSION="${CLOUDFLARED_EDGE_IP_VERSION:-}"
RUN_DIR="${RUN_DIR:-.run}"
SERVER_LOG="${RUN_DIR}/mercantil-demo-server.log"
SERVER_PID_FILE="${RUN_DIR}/mercantil-demo-server.pid"

server_pid=""
started_server=0

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

trap cleanup EXIT INT TERM

mkdir -p "${RUN_DIR}"

local_base_url="http://${HOST}:${PORT}"

if curl -fsS "${local_base_url}/health" >/dev/null 2>&1; then
  echo "Mercantil demo backend already running at ${local_base_url}"
else
  echo "Starting Mercantil demo backend at ${local_base_url}"
  PORT="${PORT}" npm start >"${SERVER_LOG}" 2>&1 &
  server_pid="$!"
  started_server=1
  printf "%s\n" "${server_pid}" >"${SERVER_PID_FILE}"

  for _ in $(seq 1 30); do
    if curl -fsS "${local_base_url}/health" >/dev/null 2>&1; then
      break
    fi

    if ! kill -0 "${server_pid}" 2>/dev/null; then
      echo "Backend exited before becoming healthy. Last log lines:" >&2
      sed -n "1,120p" "${SERVER_LOG}" >&2 || true
      exit 1
    fi

    sleep 1
  done

  curl -fsS "${local_base_url}/health" >/dev/null
fi

cat <<LINKS

Local links:
  Health: ${local_base_url}/health
  Ticket OCR page: ${local_base_url}/ocr-test
  Test ticket image: ${local_base_url}/ocr/test_para_OCR.jpeg

LINKS

if [[ "${PUBLIC_TUNNEL}" != "1" ]]; then
  echo "Public tunnel disabled. Press Ctrl+C to stop the backend if this script started it."
  wait "${server_pid:-}" 2>/dev/null || true
  exit 0
fi

case "${TUNNEL_PROVIDER}" in
  cloudflared)
    echo "Starting Cloudflare tunnel with http2. Copy the trycloudflare.com URL printed below."
    cloudflared_args=(tunnel --url "${local_base_url}" --protocol http2 --no-autoupdate)
    if [[ -n "${CLOUDFLARED_EDGE_IP_VERSION}" ]]; then
      cloudflared_args+=(--edge-ip-version "${CLOUDFLARED_EDGE_IP_VERSION}")
    fi
    npx -y cloudflared "${cloudflared_args[@]}"
    ;;
  localtunnel)
    echo "Starting localtunnel fallback. Copy the loca.lt URL printed below."
    npx -y localtunnel --port "${PORT}" --local-host "${HOST}"
    ;;
  *)
    echo "Unsupported TUNNEL_PROVIDER=${TUNNEL_PROVIDER}. Use cloudflared or localtunnel." >&2
    exit 1
    ;;
esac
