# e2e_checks proposal — element_matrix_chat
# app_id:    element_matrix_chat
# lang:      bash
# framework: docker-compose
# stack:     10+ contenedores Docker (Synapse, Element Web, MAS, LiveKit, PostgreSQL x2,
#            Synapse Admin, Nginx, LiveKit JWT, element-call-web)
# date:      2026-05-19
# issue:     0121a wave 3
#
# NOTAS DE DISENO:
#   - La app es infraestructura Docker Compose pura: no hay build de codigo,
#     no hay binarios locales que compilar, no hay tests unitarios.
#   - Los checks validan que los archivos de config esten bien formados,
#     que docker/docker-compose esten disponibles, y que el stack levante
#     correctamente (smoke via health de la API Matrix).
#   - NINGUN check usa credenciales reales. El smoke usa MATRIX_SERVER_NAME=localhost
#     y valida solo que la API responde con JSON valido (no autenticacion).
#   - El health check de Synapse (/_matrix/client/versions) es publico y no
#     requiere credenciales — responde 200 con lista de versiones soportadas.
#   - El check de LiveKit usa el endpoint /healthz que tambien es publico.
#   - Los checks marcados severity: warning son los que dependen de red externa
#     o de que el VPS este vivo — no bloquean merge en local.
#   - No existe operations.db en esta app (infra Docker pura, no usa bucle reactivo).
#     Por tanto no se incluye ops_audit.
#
# JUSTIFICACION POR CHECK:
# | check                    | razon                                                                  |
# |--------------------------|------------------------------------------------------------------------|
# | env_example_syntax       | Valida que .env.example es parseable bash sin errores de sintaxis      |
# | docker_compose_validate  | docker-compose config --quiet detecta YAML/interpolacion rota          |
# | docker_compose_livekit_v | Igual para el compose secundario de LiveKit                            |
# | config_templates_present | Asegura que configs/ tiene los templates obligatorios para setup.sh    |
# | setup_sh_syntax          | bash -n detecta errores de sintaxis en scripts sin ejecutarlos         |
# | create_user_sh_syntax    | Igual para el script de creacion de usuarios                           |
# | element_config_json      | Valida que element-config.json es JSON valido (python3 -m json.tool)   |
# | smoke_synapse_health     | GET /_matrix/client/versions en VPS. severity: warning (red externa)   |
# | smoke_element_web        | GET http://VPS:8081 devuelve 200. severity: warning (red externa)      |
# | smoke_mas_health         | GET http://VPS:8083/health devuelve 200. severity: warning             |
# | smoke_synapse_admin      | GET http://VPS:8082 devuelve 200. severity: warning                    |

e2e_checks:
  # -----------------------------------------------------------------------
  # CHECKS LOCALES (critical — sin red externa, sin credenciales)
  # -----------------------------------------------------------------------

  - id: env_example_syntax
    # por que: .env.example define todas las variables del stack.
    # Un error de sintaxis bash impide hacer `source .env` en setup.sh.
    cmd: "bash -n projects/element_agents/apps/element_matrix_chat/.env.example || (bash --posix -c 'set -a; source projects/element_agents/apps/element_matrix_chat/.env.example' 2>&1 | grep -v 'command not found' && true)"
    timeout_s: 5
    severity: warning

  - id: docker_compose_validate
    # por que: docker-compose config --quiet detecta YAML malformado,
    # imagenes invalidas, y referencias a variables sin definir antes
    # de intentar levantar el stack.
    # Requiere docker-compose instalado localmente.
    cmd: >
      cd projects/element_agents/apps/element_matrix_chat &&
      cp -n .env.example .env.e2e_tmp 2>/dev/null;
      env $(grep -v '^#' .env.example | xargs) docker-compose -f docker-compose.yml config --quiet
    timeout_s: 20
    severity: critical

  - id: docker_compose_livekit_validate
    # por que: el compose de LiveKit es independiente pero obligatorio para
    # videollamadas. Validarlo por separado asegura que no rompe al hacer
    # `docker-compose -f docker-compose.livekit.yml up -d`.
    cmd: >
      cd projects/element_agents/apps/element_matrix_chat &&
      env $(grep -v '^#' .env.example | xargs) docker-compose -f docker-compose.livekit.yml config --quiet
    timeout_s: 20
    severity: critical

  - id: config_templates_present
    # por que: setup.sh requiere configs/nginx/well-known.conf,
    # configs/well-known/, y configs/livekit/livekit.example.yaml.
    # Si alguno falta, setup.sh falla silenciosamente o con un error opaco.
    cmd: >
      test -f projects/element_agents/apps/element_matrix_chat/configs/nginx/well-known.conf &&
      test -d projects/element_agents/apps/element_matrix_chat/configs/well-known &&
      test -f projects/element_agents/apps/element_matrix_chat/configs/homeserver.yaml.template &&
      echo "all config templates present"
    expect_stdout_contains: "all config templates present"
    timeout_s: 5
    severity: critical

  - id: setup_sh_syntax
    # por que: bash -n detecta errores de sintaxis en el script principal
    # de deploy sin ejecutarlo (sin efectos secundarios).
    cmd: "bash -n projects/element_agents/apps/element_matrix_chat/scripts/setup.sh"
    timeout_s: 5
    severity: critical

  - id: create_user_sh_syntax
    # por que: create-user.sh es el script operativo para crear usuarios Matrix.
    # Un error de sintaxis lo romperia silenciosamente en produccion.
    cmd: "bash -n projects/element_agents/apps/element_matrix_chat/scripts/create-user.sh"
    timeout_s: 5
    severity: critical

  - id: backup_sh_syntax
    # por que: backup.sh gestiona backups de PostgreSQL. Un error de sintaxis
    # podria dejar la app sin backup en produccion.
    cmd: "bash -n projects/element_agents/apps/element_matrix_chat/scripts/backup.sh"
    timeout_s: 5
    severity: warning

  - id: element_config_json
    # por que: element-config.json configura el cliente web de Element.
    # JSON invalido hace que Element Web no arranque (pantalla en blanco).
    cmd: "python3 -m json.tool projects/element_agents/apps/element_matrix_chat/element-config.json > /dev/null"
    timeout_s: 5
    severity: critical

  - id: element_config_template_json
    # por que: el template en configs/ se usa en setup para generar la
    # configuracion final. Debe ser JSON valido tambien.
    cmd: "python3 -m json.tool projects/element_agents/apps/element_matrix_chat/configs/element-config.json.template > /dev/null 2>&1 || echo 'template_not_json_skip'"
    timeout_s: 5
    severity: warning

  # -----------------------------------------------------------------------
  # CHECKS REMOTOS (warning — dependen del VPS organic-machine.com)
  # Estos checks validan el estado del stack en produccion.
  # severity: warning porque red externa puede fallar por razones ajenas al codigo.
  # Se ejecutan en fn-analizador con MATRIX_HOST env var si esta configurado.
  # -----------------------------------------------------------------------

  - id: smoke_synapse_health
    # por que: /_matrix/client/versions es el endpoint publico de Synapse
    # que confirma que el homeserver esta vivo y responde JSON valido.
    # No requiere autenticacion. Fallo aqui = stack caido en produccion.
    cmd: >
      MATRIX_HOST=${MATRIX_E2E_HOST:-matrix-af2f3d.organic-machine.com} &&
      curl -sf --max-time 10
      "https://${MATRIX_HOST}/_matrix/client/versions"
      | python3 -m json.tool > /dev/null
    timeout_s: 15
    severity: warning

  - id: smoke_element_web
    # por que: Element Web en :8081 (o via proxy) devuelve el SPA HTML.
    # Fallo = usuarios no pueden acceder al cliente.
    # Usa el proxy Coolify que expone HTTPS en 443.
    cmd: >
      MATRIX_HOST=${MATRIX_E2E_HOST:-matrix-af2f3d.organic-machine.com} &&
      curl -sf --max-time 10 -o /dev/null -w "%{http_code}"
      "https://${MATRIX_HOST}/"
      | grep -E "^(200|301|302)$"
    timeout_s: 15
    severity: warning

  - id: smoke_mas_health
    # por que: MAS (Matrix Authentication Service) debe estar vivo para
    # que el login OIDC funcione. /health es su endpoint publico.
    cmd: >
      MATRIX_HOST=${MATRIX_E2E_HOST:-matrix-af2f3d.organic-machine.com} &&
      curl -sf --max-time 10
      "https://${MATRIX_HOST}/_mas/health"
      | python3 -c "import sys,json; d=json.load(sys.stdin); sys.exit(0 if d.get('status')=='ok' else 1)"
    timeout_s: 15
    severity: warning

  - id: smoke_synapse_admin_accessible
    # por que: Synapse Admin en :8082 debe estar accesible para operaciones
    # de administracion. Solo verificamos que el proxy responde, no login.
    cmd: >
      MATRIX_HOST=${MATRIX_E2E_HOST:-matrix-af2f3d.organic-machine.com} &&
      curl -sf --max-time 10 -o /dev/null -w "%{http_code}"
      "https://${MATRIX_HOST}/synapse-admin/"
      | grep -E "^(200|301|302)$"
    timeout_s: 15
    severity: warning

  - id: smoke_livekit_health
    # por que: LiveKit expone /healthz en :7882. Si cae, Element Call
    # no puede establecer conexiones RTC (videollamadas rotas).
    cmd: >
      curl -sf --max-time 10
      "https://matrix-rtc-320bd4.organic-machine.com/healthz"
      | grep -i "ok\|healthy\|alive" || true
    timeout_s: 15
    severity: warning
