-- 0031 — varios modelos configurados, um ativo por vez
--
-- Ate aqui a configuracao guardava UM provedor, UM modelo e UMA chave. Trocar
-- de modelo era reconfigurar: buscar a lista no provedor, escolher, salvar --
-- e se o admin quisesse voltar ao anterior, repetir tudo.
--
-- O que ele quer e outra coisa: deixar dois ou tres PRONTOS e alternar num
-- clique. Um Haiku barato para o dia a dia, um Opus para o fim do mes; um
-- Gemini configurado para comparar sem ter que recolar chave.
--
-- MODELAGEM
--
-- A chave fica AQUI, junto do modelo, e nao numa tabela por provedor. Sao dois
-- modelos da mesma conta Anthropic? A chave e gravada duas vezes, cifrada. E
-- duplicacao de segredo, e foi escolhida de proposito: a alternativa
-- (embed_provider_keys, com UNIQUE por provedor) faz remover um modelo ter de
-- decidir se a chave do provedor ainda e usada por outro -- uma pergunta que o
-- operador nao deveria precisar responder para apagar uma linha.
--
-- embed_configs.active_model_id aponta para o que esta valendo. Os campos
-- provider/model/provider_key da config CONTINUAM existindo e sao o espelho do
-- ativo: tudo que ja lia a config -- o agente, o widget, o painel -- continua
-- funcionando sem saber que esta tabela existe. Trocar o ativo atualiza os
-- dois lugares na mesma transacao.
--
-- Isso e duplicacao, e ela e deliberada: a alternativa era um JOIN em todo
-- caminho que hoje le a configuracao, incluindo o laco do agente, que roda ate
-- oito vezes por pergunta.

CREATE TABLE embed_models (
  id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  config_id       BIGINT UNSIGNED NOT NULL,

  provider        VARCHAR(32)  NOT NULL,
  model           VARCHAR(190) NOT NULL,

  -- Como o admin chama este modelo. "Rapido e barato" diz mais na hora de
  -- escolher do que "claude-haiku-4-5-20251001".
  label           VARCHAR(120) NULL,

  -- Cifrada com o mesmo sodium do resto. NUNCA sai em texto por API nem tela.
  provider_key    TEXT NOT NULL,

  position        INT NOT NULL DEFAULT 0,
  created_at      DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id),
  -- O mesmo modelo duas vezes na mesma configuracao e engano, nao intencao.
  UNIQUE KEY uq_embed_models (config_id, provider, model),
  KEY idx_embed_models_config (config_id, position),
  CONSTRAINT fk_embed_models_config FOREIGN KEY (config_id)
    REFERENCES embed_configs(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Qual esta valendo. NULL = nenhum escolhido ainda; os campos provider/model
-- da propria config seguem valendo, que e o estado de toda config existente.
ALTER TABLE embed_configs
  ADD COLUMN active_model_id BIGINT UNSIGNED NULL AFTER model,
  ADD CONSTRAINT fk_embed_configs_active_model FOREIGN KEY (active_model_id)
    REFERENCES embed_models(id) ON DELETE SET NULL;

-- O que ja estava configurado vira o primeiro modelo da lista, e o ativo.
-- Sem isso, abrir a tela depois desta migracao mostraria "nenhum modelo
-- configurado" para quem tem um funcionando ha semanas.
INSERT INTO embed_models (config_id, provider, model, label, provider_key, position)
SELECT id, provider, model, NULL, provider_key, 0
  FROM embed_configs
 WHERE provider_key IS NOT NULL AND provider_key <> '';

UPDATE embed_configs c
   JOIN embed_models m ON m.config_id = c.id AND m.position = 0
    SET c.active_model_id = m.id;
