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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BRIDGE_DIR="${SOCKET_IO_BRIDGE_DIR:-$HOME/Documentos/React/superlegis-socket-bridge}"
PORT="${SOCKET_IO_TEST_PORT:-4010}"
HOST="127.0.0.1"
TOKEN="${SOCKET_IO_TEST_TOKEN:-local-test-token}"
TENANT_ID="tenant-e2e-$(date +%s)"
TIMEOUT_MS="${SOCKET_IO_TEST_TIMEOUT_MS:-12000}"

BRIDGE_LOG="/tmp/socketio-bridge-e2e.log"
RESULT_JSON="/tmp/socketio-e2e-result.json"

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

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

if [[ ! -d "$BRIDGE_DIR" ]]; then
  echo "Diretorio do bridge nao encontrado: $BRIDGE_DIR"
  echo "Defina SOCKET_IO_BRIDGE_DIR para o caminho correto."
  exit 1
fi

cd "$BRIDGE_DIR"
if [[ ! -d node_modules ]]; then
  npm install --silent
fi

PORT="$PORT" HOST="$HOST" SOCKET_IO_BRIDGE_TOKEN="$TOKEN" node src/server.js >"$BRIDGE_LOG" 2>&1 &
BRIDGE_PID=$!

for _ in {1..30}; do
  if curl -fsS "http://$HOST:$PORT/health" >/dev/null 2>&1; then
    break
  fi
  sleep 0.3
done

if ! curl -fsS "http://$HOST:$PORT/health" >/dev/null 2>&1; then
  echo "Falha ao subir socket-io-bridge. Log: $BRIDGE_LOG"
  exit 1
fi

node scripts/wait-for-event.js "http://$HOST:$PORT" "$TENANT_ID" "$TIMEOUT_MS" >"$RESULT_JSON" &
LISTENER_PID=$!

cd "$ROOT_DIR"
SOCKET_IO_BRIDGE_ENABLED=true \
SOCKET_IO_BRIDGE_ENDPOINT="http://$HOST:$PORT/events/voting-panel-update" \
SOCKET_IO_BRIDGE_TOKEN="$TOKEN" \
QUEUE_CONNECTION=sync \
php artisan tinker --execute="event(new \\App\\Events\\VotingPanelUpdated('$TENANT_ID', 'voting', 'e2e-test'));"

wait "$LISTENER_PID"
cat "$RESULT_JSON"
echo
echo "E2E OK: Laravel -> Socket.IO bridge -> cliente recebeu evento."
