-- 062 — Usina WA Cloud: aprovação de disparo pelo ADMIN + camada de templates
--
-- CONTEXTO (decisão do dono, 01/08/2026). O canal wa_cloud conectava, atendia e
-- monitorava saúde, mas não tinha camada de GESTÃO. Duas consequências reais:
--
--  1. A WABA do cliente entrava sem nenhuma aprovação, e o PRÓPRIO CLIENTE se
--     autorizava a disparar (bastava marcar o aceite no signup). O admin só
--     conseguia revogar depois do fato.
--  2. Não existia criação de template — o cliente era obrigado a sair da
--     plataforma para o WhatsApp Manager da Meta.
--
-- A partir daqui o canal espelha a Usina Multi-BM, que é a estrutura validada
-- da casa: o ADMIN aprova o disparo, configura vazão/teto e é o único que toca
-- template ("esse ajuste fino é expertise nossa, intransferível").
--
-- ⚠ O ATENDIMENTO continua self-service e inalterado: o número é do cliente,
-- pago por ele, e receber mensagem não tem risco de reputação para o app.

BEGIN;

-- ── 1) Conexões: solicitação de disparo + configuração do admin ─────────────

-- O aceite jurídico do cliente CONTINUA sendo gravado em
-- cloud_connection_authorizations (é a prova que isenta a OnSMS), mas passa a
-- valer como SOLICITAÇÃO. Quem concede dispatch_authorized é o ADMIN.
ALTER TABLE meta_cloud_connections
  ADD COLUMN IF NOT EXISTS dispatch_requested_at timestamptz,
  ADD COLUMN IF NOT EXISTS dispatch_requested_by_user_id varchar REFERENCES users(id);

-- Vazão por minuto deste número — o "disparo por minuto" que o admin ajusta,
-- espelhando business_managers.messages_per_minute. O env META_CLOUD_MPS passa
-- a ser apenas o default global.
ALTER TABLE meta_cloud_connections
  ADD COLUMN IF NOT EXISTS messages_per_minute integer NOT NULL DEFAULT 1000;

-- Sub-teto manual: vence o tier sincronizado da Meta. Serve para aquecer número
-- novo com volume menor do que a Meta já concederia.
ALTER TABLE meta_cloud_connections
  ADD COLUMN IF NOT EXISTS daily_limit_override integer;

-- Anotação interna do admin (nunca exibida ao cliente).
ALTER TABLE meta_cloud_connections
  ADD COLUMN IF NOT EXISTS notes text;

-- DE-PARA: quem JÁ está disparando não pode parar de disparar por causa desta
-- migration. As autorizações concedidas sob a regra antiga (pelo próprio
-- cliente) são preservadas e marcadas como herdadas, para o admin saber quais
-- nunca passaram por aprovação dele.
UPDATE meta_cloud_connections
SET dispatch_requested_at = COALESCE(dispatch_requested_at, dispatch_authorized_at),
    dispatch_requested_by_user_id = COALESCE(dispatch_requested_by_user_id, dispatch_authorized_by_user_id),
    notes = COALESCE(notes, '') ||
            CASE WHEN COALESCE(notes, '') = '' THEN '' ELSE E'\n' END ||
            '[migration 062] Autorização de disparo herdada da regra anterior ' ||
            '(concedida pelo próprio cliente, sem aprovação do ADMIN). Revisar.'
WHERE dispatch_authorized = true;

-- Fila de aprovação do painel: solicitações pendentes primeiro.
CREATE INDEX IF NOT EXISTS idx_meta_cloud_conn_dispatch_pending
  ON meta_cloud_connections (dispatch_requested_at)
  WHERE dispatch_authorized = false AND dispatch_requested_at IS NOT NULL;

-- ── 2) Template Base (cluster) ──────────────────────────────────────────────
-- Esqueleto puro + assinatura. Molde: multibm_templates.
CREATE TABLE IF NOT EXISTS cloud_template_bases (
  id varchar PRIMARY KEY DEFAULT gen_random_uuid(),
  service_id varchar NOT NULL REFERENCES services(id) ON DELETE CASCADE,
  nome varchar(150) NOT NULL,
  idioma varchar(10) NOT NULL DEFAULT 'pt_BR',
  categoria varchar(50) NOT NULL DEFAULT 'UTILITY',
  corpo text NOT NULL,
  header_type varchar(20),
  buttons jsonb,
  var_count integer,
  button_url_prefix varchar(600),
  created_at timestamptz DEFAULT now(),
  updated_at timestamptz DEFAULT now(),
  CONSTRAINT cloud_template_base_service_nome_uniq UNIQUE (service_id, nome)
);

-- ── 3) Templates físicos ganham agrupamento e ocultação ─────────────────────
-- cloud_templates passa a ser o equivalente de multibm_template_submissions:
-- o template REAL na WABA do cliente.
ALTER TABLE cloud_templates
  ADD COLUMN IF NOT EXISTS base_template_id varchar REFERENCES cloud_template_bases(id) ON DELETE SET NULL,
  ADD COLUMN IF NOT EXISTS oculto boolean NOT NULL DEFAULT false;

CREATE INDEX IF NOT EXISTS idx_cloud_templates_base ON cloud_templates (base_template_id);

-- ── 4) Templates Validados ──────────────────────────────────────────────────
-- Composição completa feita pelo ADMIN, com validação em duas fases.
-- Molde: multibm_validated_templates. Diferença: no Multi-BM existe UMA "BM
-- principal" do serviço; aqui cada cliente tem a própria WABA, então a conexão
-- de validação é escolhida por template.
CREATE TABLE IF NOT EXISTS cloud_validated_templates (
  id varchar PRIMARY KEY DEFAULT gen_random_uuid(),
  service_id varchar NOT NULL REFERENCES services(id) ON DELETE CASCADE,
  nome varchar(512) NOT NULL,
  idioma varchar(10) NOT NULL DEFAULT 'pt_BR',
  categoria varchar(50) NOT NULL DEFAULT 'UTILITY',
  corpo text NOT NULL,
  var_examples jsonb DEFAULT '[]'::jsonb,
  rodape varchar(255),
  header_type varchar(20),
  header_example_url text,
  buttons jsonb,
  status varchar(20) NOT NULL DEFAULT 'RASCUNHO',
  validation_connection_id varchar REFERENCES meta_cloud_connections(id) ON DELETE SET NULL,
  rejection_reason text,
  imported_from_multibm_id varchar,
  created_at timestamptz DEFAULT now(),
  updated_at timestamptz DEFAULT now(),
  CONSTRAINT cloud_validated_template_service_nome_uniq UNIQUE (service_id, nome)
);

CREATE INDEX IF NOT EXISTS idx_cloud_validated_templates_service_status
  ON cloud_validated_templates (service_id, status);

COMMIT;
