-- ============================================================
-- 089_chat_form.sql — formulário dentro do chat (CTWA / WA Cloud)
-- ============================================================
-- Duas tabelas novas:
--
--  chat_form_configs  — a ATIVAÇÃO por conexão (satélite 1:1, molde
--    handoff_configs). PK na própria conexão: como só conexões wa_cloud
--    existem em meta_cloud_connections, a FK recusa Infobip por construção,
--    sem precisar de checagem em runtime.
--
--  chat_form_sessions — a SESSÃO por conversa (molde routine_executions).
--    O avanço de passo é sempre por UPDATE condicional
--    (WHERE status='ativa' AND pergunta_index=$N): é o que faz duas MOs em
--    rajada, ou a Meta reentregando o mesmo webhook, nunca avançarem duas
--    vezes a mesma pergunta.
-- ============================================================

CREATE TABLE IF NOT EXISTS chat_form_configs (
  connection_id   varchar PRIMARY KEY REFERENCES meta_cloud_connections(id) ON DELETE CASCADE,
  owner_user_id   varchar NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  form_id         varchar REFERENCES lead_forms(id) ON DELETE SET NULL,
  ativo           boolean NOT NULL DEFAULT false,
  -- 'ctwa' = só inicia quando a conversa nasce de um clique em anúncio
  -- (referral.ctwa_clid presente); 'todos' = qualquer primeira mensagem.
  gatilho         varchar(10) NOT NULL DEFAULT 'ctwa',
  saudacao        varchar(600),
  msg_conclusao   varchar(600),
  msg_cancelamento varchar(600),
  -- Cap prático = a própria janela grátis do CTWA (72h). Default 24h: tempo
  -- de sobra pra responder um formulário curto sem prender vaga demais.
  expira_horas    integer NOT NULL DEFAULT 24,
  created_at      timestamptz NOT NULL DEFAULT now(),
  updated_at      timestamptz NOT NULL DEFAULT now()
);

CREATE TABLE IF NOT EXISTS chat_form_sessions (
  id                  varchar PRIMARY KEY DEFAULT gen_random_uuid(),
  conversation_id     varchar NOT NULL REFERENCES ai_conversations(id) ON DELETE CASCADE,
  connection_id       varchar NOT NULL REFERENCES meta_cloud_connections(id) ON DELETE CASCADE,
  owner_user_id       varchar NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  form_id             varchar NOT NULL REFERENCES lead_forms(id) ON DELETE CASCADE,
  contact_phone       varchar(20) NOT NULL,
  -- ativa | concluida | cancelada | expirada | optout | assumida
  status              varchar(12) NOT NULL DEFAULT 'ativa',
  pergunta_index      integer NOT NULL DEFAULT 0,
  -- [{perguntaId, respostaIds[], textoLivre?}] — o estado parcial de uma
  -- pergunta multi (marcou 2 de 3, ainda não confirmou) mora aqui também,
  -- não precisa de coluna própria.
  respostas           jsonb NOT NULL DEFAULT '[]',
  tentativas_invalidas integer NOT NULL DEFAULT 0,
  -- Duplo clique no mesmo botão (dois toques, mesma resposta) vira um wamid
  -- NOVO — o dedupe por wamid não pega. Comparar contra o último replyId
  -- aplicado é a segunda rede.
  last_reply_id       varchar(100),
  lead_id             varchar REFERENCES platform_leads(id) ON DELETE SET NULL,
  started_at          timestamptz NOT NULL DEFAULT now(),
  last_step_at        timestamptz NOT NULL DEFAULT now(),
  expires_at          timestamptz NOT NULL,
  ended_at            timestamptz
);

CREATE INDEX IF NOT EXISTS idx_chat_form_sessions_owner_phone
  ON chat_form_sessions (owner_user_id, contact_phone, status);
CREATE INDEX IF NOT EXISTS idx_chat_form_sessions_conversation
  ON chat_form_sessions (conversation_id);
