-- ============================================================
-- 058 — F5/E0+E1: sinais de funil + fundação de atribuição
-- ============================================================
-- E1: fila de SINAIS (Lead/QualifiedLead) para o CAPI. Separada da
-- conversion_export_queue porque aquela é ancorada em `conversions`
-- (venda) e sinal de funil não tem venda. Dedupe por event_key, que é
-- o mesmo event_id enviado à Meta — reprocessar nunca duplica lá.
--
-- E0: a regra de atribuição consulta contact_events por tipo dentro de
-- uma janela; o índice abaixo é o que a torna barata em escala.
-- ============================================================

CREATE TABLE IF NOT EXISTS signal_export_queue (
  id             bigserial PRIMARY KEY,
  connection_id  varchar NOT NULL REFERENCES ad_platform_connections(id) ON DELETE CASCADE,
  contact_id     varchar NOT NULL REFERENCES global_contacts(id) ON DELETE CASCADE,
  event_type     varchar(20) NOT NULL,
  event_key      varchar(120) NOT NULL,
  occurred_at    timestamptz NOT NULL,
  status         varchar(12) NOT NULL DEFAULT 'pending',
  attempt_count  integer NOT NULL DEFAULT 0,
  last_error     text,
  created_at     timestamptz DEFAULT now(),
  processed_at   timestamptz
);

DO $$
BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'signal_export_conn_event_uniq') THEN
    ALTER TABLE signal_export_queue
      ADD CONSTRAINT signal_export_conn_event_uniq UNIQUE (connection_id, event_key);
  END IF;
END $$;

CREATE INDEX IF NOT EXISTS idx_signal_export_status ON signal_export_queue (status, id);

-- Atribuição (E0): último evento de anúncio do contato ANTES da venda.
-- O índice cobre exatamente esse acesso (contato + tipo + tempo desc).
CREATE INDEX IF NOT EXISTS idx_contact_events_anuncio
  ON contact_events (contact_id, occurred_at DESC)
  WHERE type IN ('anuncio_ctwa', 'anuncio_clique');
