-- 096_banco_templates.sql — Banco de Templates por categoria (26/08/2026)
--
-- POR QUE: o "Solicitar novo template" montava cada pedido do zero — 1 chamada
-- de IA para a imagem + 1 para os exemplos, por pedido, sem cache (medido: as
-- 12 submissões aprovadas com imagem em produção têm header_content NULO, então
-- o ramo "herdar" nunca dispara). Além do custo repetido, o conteúdo chegava
-- imprevisível na revisão da Meta, que julga a mensagem MONTADA com os exemplos.
--
-- O banco inverte: o ADM cura UMA vez, a validação acontece no cadastro, e a
-- montagem vira rotação determinística — o pedido do cliente deixa de poder
-- falhar por conteúdo.
--
-- LEI DE COERÊNCIA (dono, 26/08): um pedido = UMA categoria em tudo. Texto,
-- imagem e vídeo saem da MESMA categoria — por isso a FK é obrigatória e tem
-- ON DELETE CASCADE. Rodapés e o botão de descadastro são GLOBAIS (servem
-- todas as categorias) e por isso não têm categoria.
--
-- Idempotente e puramente aditiva: nenhuma tabela existente é tocada.

CREATE TABLE IF NOT EXISTS template_bank_categories (
  id            varchar PRIMARY KEY DEFAULT gen_random_uuid(),
  slug          varchar(60)  NOT NULL,
  nome          varchar(120) NOT NULL,
  descricao     text,
  -- padrao | chamariz (o corpo do chamariz é moldado para a pergunta)
  tipo_template varchar(20)  NOT NULL DEFAULT 'padrao',
  ordem         integer      NOT NULL DEFAULT 0,
  ativo         boolean      NOT NULL DEFAULT true,
  created_at    timestamptz  DEFAULT now(),
  CONSTRAINT template_bank_categories_slug_uniq UNIQUE (slug)
);

-- 3 variáveis SEMPRE, com papéis fixos: {{1}} nome, {{2}} o fato,
-- {{3}} complemento. Os exemplos são o que a Meta lê no lugar dos
-- placeholders para decidir UTILITY × MARKETING.
CREATE TABLE IF NOT EXISTS template_bank_texts (
  id             varchar PRIMARY KEY DEFAULT gen_random_uuid(),
  category_id    varchar NOT NULL REFERENCES template_bank_categories(id) ON DELETE CASCADE,
  corpo          text        NOT NULL,
  var_exemplo_1  varchar(60) NOT NULL,
  var_exemplo_2  varchar(60) NOT NULL,
  var_exemplo_3  varchar(60) NOT NULL,
  -- Rotação anticlone: a Meta rejeita corpo idêntico entre WABAs.
  usage_count    integer     NOT NULL DEFAULT 0,
  ativo          boolean     NOT NULL DEFAULT true,
  created_at     timestamptz DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_template_bank_texts_cat_ativo
  ON template_bank_texts (category_id, ativo);

-- url = pública, servida por /template-media/... — a MESMA que os 3 canais já
-- consomem (Infobip busca a URL; Cloud baixa e sobe handle; Gupshup recebe em
-- exampleMedia).
CREATE TABLE IF NOT EXISTS template_bank_media (
  id            varchar PRIMARY KEY DEFAULT gen_random_uuid(),
  category_id   varchar NOT NULL REFERENCES template_bank_categories(id) ON DELETE CASCADE,
  tipo          varchar(10) NOT NULL,          -- imagem | video
  url           text        NOT NULL,
  nome_arquivo  varchar(255),
  bytes         integer,
  usage_count   integer     NOT NULL DEFAULT 0,
  ativo         boolean     NOT NULL DEFAULT true,
  created_at    timestamptz DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_template_bank_media_cat_tipo
  ON template_bank_media (category_id, tipo, ativo);

-- GLOBAIS (sem categoria) ---------------------------------------------------
-- finalidade='descadastro' + padrao_em_todos=true ⇒ entra em TODO template
-- montado, ADICIONAL ao teto de 2 botões do cliente e SEMPRE como ÚLTIMO
-- botão. O clique chega como MO com este texto e cai na black-list da conta
-- pelos gatilhos de opt-out já existentes.
CREATE TABLE IF NOT EXISTS template_bank_buttons (
  id              varchar PRIMARY KEY DEFAULT gen_random_uuid(),
  finalidade      varchar(20) NOT NULL,        -- descadastro | resposta | link
  texto           varchar(25) NOT NULL,        -- limite Meta para texto de botão
  padrao_em_todos boolean     NOT NULL DEFAULT false,
  usage_count     integer     NOT NULL DEFAULT 0,
  ativo           boolean     NOT NULL DEFAULT true,
  created_at      timestamptz DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_template_bank_buttons_finalidade
  ON template_bank_buttons (finalidade, ativo);

CREATE TABLE IF NOT EXISTS template_bank_footers (
  id          varchar PRIMARY KEY DEFAULT gen_random_uuid(),
  texto       varchar(60) NOT NULL,            -- META_LIMITS.FOOTER_MAX_CHARS
  usage_count integer     NOT NULL DEFAULT 0,
  ativo       boolean     NOT NULL DEFAULT true,
  created_at  timestamptz DEFAULT now()
);
