#!/usr/bin/env bash
# run.sh — ejecutar E2E tests con Playwright
#
# Uso:
#   ./dev-scripts/e2e/run.sh            # headless (default)
#   ./dev-scripts/e2e/run.sh --headed   # con browser visible (requiere DISPLAY)
#
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
E2E_DIR="$REPO_ROOT/e2e"
ELEMENT_SCRIPT="$E2E_DIR/scripts/setup-element.sh"
PS_SCRIPT="$REPO_ROOT/dev-scripts/server/ps.sh"

HEADED=false
EXTRA_ARGS=()

for arg in "$@"; do
    case "$arg" in
        --headed)
            HEADED=true
            ;;
        *)
            EXTRA_ARGS+=("$arg")
            ;;
    esac
done

# --- Verificaciones previas ---

# 1. Verificar dependencias instaladas
if [ ! -d "$E2E_DIR/node_modules" ]; then
    echo "ERROR: node_modules no encontrado. Ejecutar primero:"
    echo "  ./dev-scripts/e2e/install.sh"
    exit 1
fi

# 2. Verificar .env
if [ ! -f "$E2E_DIR/.env" ]; then
    echo "ERROR: e2e/.env no encontrado. Crear desde el template:"
    echo "  cp e2e/.env.example e2e/.env"
    echo "  # editar e2e/.env con credenciales"
    exit 1
fi

# 3. Verificar que los agentes estan corriendo
echo "=== Verificando agentes ==="
if [ -x "$PS_SCRIPT" ]; then
    if ! "$PS_SCRIPT" 2>/dev/null | grep -q "running"; then
        echo "WARN: el launcher no parece estar corriendo."
        echo "  Iniciar con: ./dev-scripts/server/start.sh"
        echo "  Continuando de todas formas..."
    else
        echo "Launcher corriendo OK"
    fi
else
    echo "WARN: no se encontro ps.sh, no se puede verificar el estado de los agentes"
fi

# --- Element Web ---

echo ""
echo "=== Element Web ==="
ELEMENT_STARTED_BY_US=false

if [ -x "$ELEMENT_SCRIPT" ]; then
    if "$ELEMENT_SCRIPT" status 2>/dev/null | grep -q "corriendo\|running\|listening"; then
        echo "Element Web ya esta corriendo"
    else
        echo "Levantando Element Web..."
        "$ELEMENT_SCRIPT" start
        ELEMENT_STARTED_BY_US=true
        # Esperar a que el servidor este listo
        sleep 2
    fi
else
    echo "WARN: setup-element.sh no encontrado. Asegurarse de que Element Web esta corriendo."
fi

# --- Ejecutar tests ---

echo ""
echo "=== Ejecutando E2E tests ==="

PLAYWRIGHT_ARGS=()
if [ "$HEADED" = true ]; then
    if [ -z "${DISPLAY:-}" ] && [ -z "${WAYLAND_DISPLAY:-}" ]; then
        echo "WARN: --headed solicitado pero no se detecta DISPLAY. Ejecutando headless."
    else
        PLAYWRIGHT_ARGS+=("--headed")
    fi
fi

# Agregar argumentos extra del usuario
if [ ${#EXTRA_ARGS[@]} -gt 0 ]; then
    PLAYWRIGHT_ARGS+=("${EXTRA_ARGS[@]}")
fi

EXIT_CODE=0
cd "$E2E_DIR"
npx playwright test "${PLAYWRIGHT_ARGS[@]}" || EXIT_CODE=$?

# Generar reporte HTML si hay fallos
if [ "$EXIT_CODE" -ne 0 ]; then
    echo ""
    echo "=== Generando reporte HTML ==="
    npx playwright show-report --host 0.0.0.0 --port 0 2>/dev/null &
    REPORT_PID=$!
    sleep 1
    kill "$REPORT_PID" 2>/dev/null || true
    echo "Reporte disponible en: $E2E_DIR/playwright-report/"
    echo "  Para verlo: cd e2e && npx playwright show-report"
fi

# --- Teardown ---

if [ "$ELEMENT_STARTED_BY_US" = true ]; then
    echo ""
    echo "=== Deteniendo Element Web ==="
    "$ELEMENT_SCRIPT" stop 2>/dev/null || true
fi

# --- Resultado ---

echo ""
if [ "$EXIT_CODE" -eq 0 ]; then
    echo "=== Todos los tests pasaron ==="
else
    echo "=== Algunos tests fallaron (exit code: $EXIT_CODE) ==="
    echo "Ver screenshots en: $E2E_DIR/test-results/"
fi

exit "$EXIT_CODE"
