===============================================================
  OPCIÓN D — WEBHOOK REACTIVO
===============================================================

ARQUITECTURA
------------
  GitHub publica un release
       ↓
  Webhook POST → tu VPS:5000/api/oasis-release
       ↓
  El endpoint dispara el pipeline (B u otro)
       ↓
  APK lista en minutos


COMPONENTES NECESARIOS
----------------------
  - VPS público con HTTPS (Let's Encrypt vale)
  - Dominio o IP fija
  - Nginx o Caddy como reverse proxy
  - Servicio webhook receiver (Python Flask / Node Express / Go)
  - Secret compartido para verificar firma de GitHub


WEBHOOK CONFIG EN GITHUB (en repo oasis_mobile fork)
-----------------------------------------------------
  Settings → Webhooks → Add webhook
    Payload URL: https://your-vps.com/api/oasis-release
    Content type: application/json
    Secret: <generar 32 bytes random>
    Events: only "Releases"

NOTA IMPORTANTE: GitHub solo dispara webhooks de TU repo,
no del repo upstream de epsylon. Hay dos formas:

  a) Hacer fork de oasis y configurar webhook ahí
     - Cada push del upstream se replica si tienes
       sync activo
  b) Poll periódico al upstream desde tu VPS y dispara
     internamente cuando detectas nuevo release
     - Más simple, no requiere fork
     - Recomendado


RECEIVER ENDPOINT (Flask, en Python)
-------------------------------------
  /opt/oasis-webhook/app.py:

  from flask import Flask, request, abort
  import hmac, hashlib, subprocess

  app = Flask(__name__)
  SECRET = open("/opt/oasis-webhook/secret").read().strip()

  @app.post("/api/oasis-release")
  def release():
      sig = request.headers.get("X-Hub-Signature-256", "")
      mac = hmac.new(SECRET.encode(), request.data, hashlib.sha256)
      expected = "sha256=" + mac.hexdigest()
      if not hmac.compare_digest(sig, expected):
          abort(401)
      event = request.headers.get("X-GitHub-Event")
      if event != "release":
          return "skip", 200
      payload = request.json
      action = payload.get("action")
      if action == "published":
          tag = payload["release"]["tag_name"]
          subprocess.Popen(["/opt/scripts/oasis-scout.sh", "--tag", tag])
      return "ok", 200


ALTERNATIVA POLL (sin webhook, más simple)
-------------------------------------------
  Cada 30 min un cron consulta:
    curl -s https://api.github.com/repos/epsylon/oasis/releases/latest
  Si el tag es nuevo (no está en /var/oasis-auto/seen-tags.txt):
    1. Añadir a seen-tags
    2. Disparar scout


SYSTEMD SERVICE (recomendado para uptime)
------------------------------------------
  /etc/systemd/system/oasis-webhook.service:

  [Unit]
  Description=Oasis webhook receiver
  After=network.target

  [Service]
  User=oasis
  WorkingDirectory=/opt/oasis-webhook
  ExecStart=/usr/bin/python3 -m gunicorn -b 127.0.0.1:5000 app:app
  Restart=always

  [Install]
  WantedBy=multi-user.target


CADDY CONFIG (reverse proxy)
----------------------------
  /etc/caddy/Caddyfile:

  your-vps.com {
    handle /api/oasis-release {
      reverse_proxy 127.0.0.1:5000
    }
    handle /testing-app/* {
      root * /var/oasis-auto/apks
      file_server browse
    }
  }


PROS
----
  - Reacción casi en tiempo real (segundos)
  - No esperas al lunes
  - Si combina con cron de respaldo, robusto


CONTRAS
-------
  - Requiere VPS público con dominio
  - Hay que gestionar HTTPS (Caddy/Let's Encrypt lo hace fácil)
  - Si el webhook falla por red, hay que tener fallback


RECOMENDACIÓN: COMBINAR WEBHOOK + CRON DE RESPALDO
---------------------------------------------------
  Webhook dispara scout inmediatamente cuando hay release.
  Cron semanal lunes 03:00 también dispara scout para no
  perder oportunidades si el webhook falló.

  Scout debe ser idempotente: si ya procesó el commit X,
  no debe procesarlo de nuevo.
