-- Tracking de alertas automáticas que ya fueron notificadas por email.
-- Mecanismo idempotente: una sola email por (alerta_id, contribuyente_id).
-- Si la alerta deja de devolverse por `generarAlertasAutomaticas`, se marca
-- `resuelta_at`. Si vuelve a aparecer (NULL en resuelta_at), no se re-notifica
-- — política conservadora de Option B (una sola notificación por evento).

CREATE TABLE IF NOT EXISTS alertas_notificadas (
  id BIGSERIAL PRIMARY KEY,
  alerta_id TEXT NOT NULL,
  contribuyente_id UUID,
  notified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  resuelta_at TIMESTAMPTZ
);

-- UNIQUE compuesto con COALESCE para que NULL en contribuyente_id no rompa
-- la dedup (alertas tenant-level vs contribuyente-específicas comparten tabla).
CREATE UNIQUE INDEX IF NOT EXISTS uniq_alertas_notif
  ON alertas_notificadas (alerta_id, COALESCE(contribuyente_id::text, ''));

-- Índice para queries del cron que filtra por contribuyente.
CREATE INDEX IF NOT EXISTS idx_alertas_notif_contribuyente
  ON alertas_notificadas (contribuyente_id) WHERE contribuyente_id IS NOT NULL;
