-- Task #348 — IA + Base de Conhecimento (resposta automática a mensagens MO).
-- Adiciona:
--   (1) services.ai_enabled — liga o atendente de IA por serviço (só tipo "api").
--   (2) ai_agent_config — config global singleton (provedor/modelo, janela, limite,
--       mensagem padrão de fallback, persona base).
--   (3) ai_client_settings — liga/desliga IA e persona por cliente (dono).
--   (4) knowledge_base_items — base de conhecimento isolada por dono (FAQ/documento).
--   (5) ai_conversations + ai_conversation_messages — conversas e histórico, com
--       idempotência das mensagens recebidas via infobip_message_id.
--
-- IDEMPOTENTE: usa IF NOT EXISTS em colunas, tabelas e índices.

ALTER TABLE services
  ADD COLUMN IF NOT EXISTS ai_enabled BOOLEAN NOT NULL DEFAULT false;

CREATE TABLE IF NOT EXISTS ai_client_settings (
  user_id     VARCHAR      PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
  ai_enabled  BOOLEAN      NOT NULL DEFAULT false,
  persona     TEXT,
  updated_at  TIMESTAMPTZ  NOT NULL DEFAULT now()
);

CREATE TABLE IF NOT EXISTS knowledge_base_items (
  id            VARCHAR      PRIMARY KEY DEFAULT gen_random_uuid(),
  owner_user_id VARCHAR      NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  tipo          VARCHAR(20)  NOT NULL DEFAULT 'faq',
  titulo        VARCHAR(300) NOT NULL,
  conteudo      TEXT         NOT NULL,
  ativo         BOOLEAN      NOT NULL DEFAULT true,
  created_at    TIMESTAMPTZ  DEFAULT now(),
  updated_at    TIMESTAMPTZ  DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_kb_items_owner ON knowledge_base_items (owner_user_id);

CREATE TABLE IF NOT EXISTS ai_conversations (
  id                   VARCHAR      PRIMARY KEY DEFAULT gen_random_uuid(),
  owner_user_id        VARCHAR      NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  service_id           VARCHAR      REFERENCES services(id) ON DELETE SET NULL,
  campaign_id          VARCHAR,
  contact_phone        VARCHAR      NOT NULL,
  sender_number        VARCHAR      NOT NULL,
  status               VARCHAR(24)  NOT NULL DEFAULT 'OPEN',
  ai_reply_count       INTEGER      NOT NULL DEFAULT 0,
  last_user_message_at TIMESTAMPTZ,
  last_ai_message_at   TIMESTAMPTZ,
  created_at           TIMESTAMPTZ  DEFAULT now(),
  updated_at           TIMESTAMPTZ  DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_ai_conversations_owner ON ai_conversations (owner_user_id);
CREATE INDEX IF NOT EXISTS idx_ai_conversations_lookup ON ai_conversations (sender_number, contact_phone);

CREATE TABLE IF NOT EXISTS ai_conversation_messages (
  id                  VARCHAR      PRIMARY KEY DEFAULT gen_random_uuid(),
  conversation_id     VARCHAR      NOT NULL REFERENCES ai_conversations(id) ON DELETE CASCADE,
  role                VARCHAR(10)  NOT NULL,
  texto               TEXT         NOT NULL,
  infobip_message_id  VARCHAR,
  created_at          TIMESTAMPTZ  DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_ai_conv_msgs_conversation ON ai_conversation_messages (conversation_id);
-- Task #348 — dedupe ATÔMICO de MO por messageId da Infobip. Índice único parcial
-- (apenas linhas com infobip_message_id NÃO nulo) garante que retransmissões
-- concorrentes do webhook não gerem duas respostas: o segundo INSERT colide e é
-- tratado como no-op (ON CONFLICT DO NOTHING) no orquestrador. Linhas com id nulo
-- (ex.: mensagens SYSTEM de falha de envio) não participam da restrição.
CREATE UNIQUE INDEX IF NOT EXISTS uq_ai_conv_msgs_infobip_id
  ON ai_conversation_messages (infobip_message_id)
  WHERE infobip_message_id IS NOT NULL;
