# e2e_checks proposal — footprint_geo_stack
# app_id:   footprint_geo_stack
# lang:     bash
# stack:    docker-compose (PostGIS 16-3.4 + Martin tile server + Valhalla routing)
# geo_deps: PostGIS/GEOS/PROJ (via postgis image), Martin MVT (maplibre), Valhalla (nilsnolde)
# date:     2026-05-19
# issue:    0121a wave 3
#
# NOTAS DE DISENO:
#
# 1. Esta app NO tiene codigo fuente propio (solo docker-compose.yml). No hay build step.
#    Los checks validan que el compose file es valido y que el stack arranca y responde.
#
# 2. VALHALLA_DATA_DIR es obligatoria — apunta a datos locales de tiles de Espana.
#    Sin el .env o la variable, el compose falla antes de arrancar.
#    Los checks de smoke estan marcados severity: warning porque dependen de:
#      - Docker running
#      - Datos de tiles presentes en VALHALLA_DATA_DIR
#      - ~60-90s de boot de Valhalla (carga tiles en memoria)
#
# 3. NO se usan tile servers externos ni APIs reales — todos los health checks
#    van contra localhost con datos locales (sin red externa).
#
# 4. Puertos e2e = mismos que produccion (no hay conflicto tipico porque aurgi-pc
#    es el unico pc_target y el stack se levanta/para explicitamente).
#    Si en el futuro se corre en CI, escalar a puertos efimeros via env overrides.
#
# 5. El check compose_config es critico (valida syntax YAML + referencias de env).
#    El resto son warning porque dependen de runtime externo (Docker daemon + datos).

e2e_checks_suggested:
  # --- CHECK 1: compose config valido ---
  # Valida que docker-compose.yml no tiene errores de sintaxis y que todas las
  # variables de entorno obligatorias estan definidas. Exit 0 sin arrancar nada.
  # Requiere un .env con VALHALLA_DATA_DIR apuntando a una ruta existente (puede ser /tmp).
  - id: compose_config
    cmd: >
      cd apps/footprint_geo_stack &&
      VALHALLA_DATA_DIR=/tmp/valhalla_e2e_stub docker compose config --quiet
    timeout_s: 10
    severity: critical
    # por que: unico check sin dependencia de Docker running ni datos reales.
    #          Detecta errores de yaml, variables no definidas, servicios mal referenciados.

  # --- CHECK 2: compose pull (dry-run de imagenes) ---
  # Verifica que las imagenes declaradas existen en los registros publicos.
  # No arranca contenedores. Util para detectar tags inexistentes o cambios de imagen.
  # severity: warning — requiere acceso a ghcr.io y Docker Hub.
  - id: compose_pull
    cmd: >
      cd apps/footprint_geo_stack &&
      VALHALLA_DATA_DIR=/tmp/valhalla_e2e_stub docker compose pull --dry-run 2>&1 |
      grep -v "^#" | head -20
    timeout_s: 60
    severity: warning
    expect_exit: 0
    # por que: detecta si las imagenes han sido eliminadas o el tag :latest cambio.
    #          No es gate critico porque depende de red externa (registries).

  # --- CHECK 3: postgis health ---
  # Levanta solo el contenedor PostGIS y verifica pg_isready.
  # Usa un proyecto e2e separado para no interferir con la instancia productiva.
  # severity: warning — requiere Docker daemon activo.
  - id: postgis_health
    cmd: >
      cd apps/footprint_geo_stack &&
      VALHALLA_DATA_DIR=/tmp/valhalla_e2e_stub
      docker compose -p footprint_e2e up -d postgis &&
      sleep 8 &&
      docker exec better_maps_postgis_footprint_e2e
        pg_isready -U geoserver -d gis 2>/dev/null ||
      docker exec $(docker ps --filter "name=footprint_e2e" --filter "ancestor=postgis/postgis:16-3.4" -q | head -1)
        pg_isready -U geoserver -d gis
    timeout_s: 45
    severity: warning
    # por que: PostGIS es la dependencia base de Martin. Si no arranca o pg_isready
    #          falla, todos los checks de tiles/queries fallan en cascada.
    # cleanup: ver check compose_down al final.

  # --- CHECK 4: martin health endpoint ---
  # Con PostGIS sano, levanta Martin y verifica /health.
  # Martin ya tiene el healthcheck nativo declarado en docker-compose.yml.
  # severity: warning — depende de PostGIS y Docker.
  - id: martin_health
    cmd: >
      cd apps/footprint_geo_stack &&
      VALHALLA_DATA_DIR=/tmp/valhalla_e2e_stub
      docker compose -p footprint_e2e up -d martin &&
      sleep 5 &&
      curl -sf --retry 5 --retry-delay 3 http://127.0.0.1:3000/health
    health: "http://127.0.0.1:3000/health"
    timeout_s: 60
    severity: warning
    expect_stdout_contains: ""
    # por que: Martin es el tile server principal (MVT). Si /health responde con 200,
    #          la conexion con PostGIS y la capa de tiles esta operativa.

  # --- CHECK 5: martin catalog (tablas PostGIS expuestas) ---
  # Verifica que Martin descubre tablas en PostGIS y expone el catalogo.
  # Respuesta esperada: JSON con lista de sources (puede ser [] si no hay tablas aun).
  # severity: warning — respuesta depende de datos cargados en PostGIS.
  - id: martin_catalog
    cmd: >
      curl -sf http://127.0.0.1:3000/catalog |
      python3 -c "import sys, json; d=json.load(sys.stdin); print(f'sources: {len(d.get(\"tiles\", d) if isinstance(d, dict) else [])}')"
    timeout_s: 15
    severity: warning
    # por que: diagnostica que Martin puede leer el schema de PostGIS.
    #          No requiere datos cargados — un catalogo vacio es valido.

  # --- CHECK 6: valhalla status ---
  # Verifica que Valhalla arranca y responde al endpoint /status.
  # CRITICO: Valhalla necesita VALHALLA_DATA_DIR con tiles reales para responder.
  # El check usa /tmp/valhalla_e2e_stub como stub — Valhalla arrancara pero
  # puede tardar o fallar si no hay tiles. Por eso severity: warning.
  # Para un gate real, VALHALLA_DATA_DIR debe apuntar a los datos reales.
  - id: valhalla_status
    cmd: >
      cd apps/footprint_geo_stack &&
      VALHALLA_DATA_DIR=/tmp/valhalla_e2e_stub
      docker compose -p footprint_e2e up -d valhalla &&
      sleep 20 &&
      curl -sf --retry 3 --retry-delay 5 http://127.0.0.1:8002/status
    timeout_s: 90
    severity: warning
    # por que: Valhalla carga tiles en memoria al arrancar (~30-90s segun tamanio).
    #          Con datos de Espana completos el boot es lento. En e2e con stub /tmp,
    #          el container arranca pero puede reportar "no tiles loaded" — aceptable.

  # --- CHECK 7: valhalla route (smoke con coordenadas Madrid→Barcelona) ---
  # Envia una peticion de ruta real a Valhalla.
  # Solo ejecutar si VALHALLA_DATA_DIR apunta a datos reales (no stub).
  # severity: warning — depende de tiles de Espana cargados.
  - id: valhalla_route_smoke
    cmd: >
      curl -sf -X POST http://127.0.0.1:8002/route
      -H 'Content-Type: application/json'
      -d '{"locations":[{"lat":40.4168,"lon":-3.7038},{"lat":41.3874,"lon":2.1686}],"costing":"auto","directions_options":{"language":"es-ES"}}'
      | python3 -c "import sys, json; r=json.load(sys.stdin); print(f'trip_km: {r[\"trip\"][\"summary\"][\"length\"]:.1f}')"
    timeout_s: 30
    severity: warning
    # por que: verifica que la ruta Madrid→Barcelona resuelve con datos reales.
    #          Si falla (tiles stub o no cargados), no bloquea — es diagnostico.
    #          Con tiles reales deberia devolver ~600km.

  # --- CHECK 8: cleanup ---
  # Para y elimina los contenedores e2e para no dejar estado sucio.
  # Siempre severity: warning — si falla la limpieza no es gate critico.
  - id: compose_down_e2e
    cmd: >
      cd apps/footprint_geo_stack &&
      VALHALLA_DATA_DIR=/tmp/valhalla_e2e_stub
      docker compose -p footprint_e2e down --volumes --remove-orphans 2>&1 | tail -5
    timeout_s: 30
    severity: warning
    # por que: limpia contenedores + volumen postgis-data del proyecto e2e.
    #          Evita acumulacion de containers parados entre runs de e2e.

# ---------------------------------------------------------------------------
# CHECKS OMITIDOS Y POR QUE
# ---------------------------------------------------------------------------
# ops_audit (fn-recopilador): OMITIDO — la app no tiene operations.db.
#   Es un stack docker-compose, no una app con ciclo reactivo propio.
#
# build step: OMITIDO — no hay codigo fuente que compilar. Entry point es
#   docker-compose.yml. El unico "build" es docker compose pull.
#
# pytest / go test: OMITIDO — no hay directorio tests/, no hay codigo Python/Go.
#
# tile server externo / API externa: OMITIDO por diseno — todos los checks
#   van contra localhost. Los datos de tiles (Espana) son locales.
#
# Valhalla isochrone/matrix checks: OMITIDO en este wave — smoke basico
#   con /route es suficiente para el gate. Anadir en wave 4 si se estabiliza
#   la carga de tiles en e2e.
# ---------------------------------------------------------------------------

# ACTIVACION GRADUAL SUGERIDA:
#
# Wave A (critico puro, sin Docker):
#   - compose_config
#
# Wave B (con Docker, sin datos):
#   - compose_config + compose_pull + postgis_health + martin_health
#
# Wave C (stack completo con datos reales en VALHALLA_DATA_DIR):
#   - todos los checks (incluyendo valhalla_route_smoke)
#
# Para CI en aurgi-pc: setear VALHALLA_DATA_DIR en el entorno del runner.
