-- 060 — WA Cloud: disparo vira PERMISSÃO aditiva (com aceite jurídico).
--
-- Decisão do dono (31/07/2026), revendo o desenho da A1.5: o papel deixa de ser
-- exclusivo. TODO número atende plenamente (receptivo + chatbot + chat manual,
-- janela contada da última mensagem do contato — regra da própria Meta) e
-- disparo em massa passa a ser uma AUTORIZAÇÃO específica, concedida pelo
-- cliente com aceite registrado (ele assume o risco de banimento pela Meta e
-- responde pela base/conteúdo, isentando a plataforma).
--
-- De-para: quem já era 'disparo' preserva a capacidade (dispatchAuthorized=true)
-- para nenhuma campanha existente quebrar. Quem era 'atendimento' fica sem
-- autorização — que é exatamente o comportamento que já tinha.
--
-- A coluna `purpose` NÃO é removida: vira dado histórico. Nenhum código novo lê.

ALTER TABLE meta_cloud_connections
  ADD COLUMN IF NOT EXISTS dispatch_authorized boolean NOT NULL DEFAULT false,
  ADD COLUMN IF NOT EXISTS dispatch_authorized_at timestamptz,
  ADD COLUMN IF NOT EXISTS dispatch_authorized_by_user_id varchar,
  ADD COLUMN IF NOT EXISTS dispatch_revoked_at timestamptz,
  ADD COLUMN IF NOT EXISTS dispatch_revoked_reason text;

-- De-para idempotente: só promove quem era 'disparo' e ainda não foi promovido.
UPDATE meta_cloud_connections
   SET dispatch_authorized = true,
       dispatch_authorized_at = COALESCE(dispatch_authorized_at, now())
 WHERE purpose = 'disparo'
   AND dispatch_authorized = false;

-- Trilha de aceites (append-only). Ver comentário do schema para a justificativa
-- de cada campo de prova — em especial `port` (Decreto 8.771/2016, art. 11, §3º:
-- sob CG-NAT o IP sozinho não identifica o cliente).
CREATE TABLE IF NOT EXISTS cloud_connection_authorizations (
  id varchar PRIMARY KEY DEFAULT gen_random_uuid(),
  connection_id varchar NOT NULL REFERENCES meta_cloud_connections(id) ON DELETE CASCADE,
  kind varchar(30) NOT NULL,
  user_id varchar NOT NULL REFERENCES users(id),
  account_root_id varchar NOT NULL REFERENCES users(id),
  text_snapshot text NOT NULL,
  doc_version integer,
  phone_number_snapshot varchar(30),
  waba_id_snapshot varchar(100),
  ip varchar(64),
  port integer,
  user_agent text,
  account_tipo_pessoa varchar(2),
  account_documento varchar(18),
  account_razao_social varchar(200),
  account_nome_fantasia varchar(150),
  accepted_at timestamptz DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_cloud_conn_auth_connection
  ON cloud_connection_authorizations (connection_id, accepted_at);
CREATE INDEX IF NOT EXISTS idx_cloud_conn_auth_account
  ON cloud_connection_authorizations (account_root_id);
