-- GRUPOS DE DADOS (assuntos): a taxonomia do ERP, no nivel do TENANT.
--
-- POR QUE ISSO EXISTE (medida, nao estetica)
--
-- Listar 6 datasets custa ~1.180 tokens ao agente. Um ERP real com 26 views
-- custa ~5.100 tokens SO PARA LISTAR, gastos em toda conversa antes de
-- responder qualquer coisa. Agrupar por assunto permite o agente perguntar
-- "quais assuntos existem?" (barato) e so entao detalhar um grupo. O ganho so
-- aparece porque list_data_sources passa a responder RESUMIDO por padrao --
-- guardar o grupo como mais um campo do dataset nao resolveria nada.
--
-- POR QUE O GRUPO VIVE NO TENANT, E NAO NO PROJETO
--
-- A taxonomia e do ERP, nao do cliente final: todo cliente tem
-- `contas_pagar`, e em todos ela e Financeiro. Definir por projeto repetiria a
-- mesma taxonomia N vezes e -- pior -- permitiria divergencia (o mesmo
-- `contas_pagar` classificado como Financeiro num cliente e como Compras em
-- outro). tenant_id NOT NULL nas duas tabelas e a barreira: e a PRIMEIRA
-- condicao de todo WHERE, do mesmo jeito que project_id e nas tabelas de
-- dados.
--
-- POR QUE A ASSOCIACAO E POR NOME DE DATASET, E NAO POR dataset_id
--
-- Esta e a decisao central. `dataset_group_members` guarda
-- `dataset_name`, nao uma FK para `datasets`. A afirmacao gravada e:
--
--   "neste tenant, o dataset chamado `contas_pagar` pertence ao grupo
--    `financeiro`"
--
-- e nao "o dataset #4711 pertence ao grupo #3". A diferenca aparece no dia a
-- dia da operacao:
--
--  * um cliente NOVO entra com os mesmos 26 datasets do ERP e ja nasce
--    inteiramente classificado, sem nenhuma acao -- com FK seria preciso
--    reclassificar 26 datasets a cada cliente novo, e alguem esqueceria;
--  * a classificacao existe ANTES do dado: da para classificar `contas_pagar`
--    num tenant onde nenhum projeto ingeriu esse dataset ainda;
--  * um dataset apagado e recriado (mesmo nome, id novo) nao perde o assunto;
--  * a mesma logica ja usada pela heranca semantica da Etapa 9 -- o que vale
--    para a casa toda mora acima do projeto.
--
-- O preco: nao ha integridade referencial com `datasets`. E aceitavel e
-- deliberado -- uma linha de membership sem dataset correspondente e apenas
-- uma classificacao esperando o dado chegar, nao lixo. E por isso o DELETE de
-- um grupo NUNCA apaga dataset nenhum: some a classificacao, o dado fica.
--
-- UNIQUE (tenant_id, dataset_name): UM grupo por dataset por tenant. Assunto e
-- TAXONOMIA, nao etiqueta -- "contas_pagar e Financeiro" e uma resposta unica.
-- Um many-to-many devolveria ao agente o mesmo dataset em varios grupos e
-- destruiria a contagem que justifica a etapa.
--
-- position: ordem de exibicao. O agente le a primeira secao; "Financeiro"
-- antes de "Outros" e uma decisao do operador, nao do ORDER BY alfabetico.

CREATE TABLE dataset_groups (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  tenant_id BIGINT UNSIGNED NOT NULL,
  -- slug normalizado: minusculas, [a-z0-9_-]. E o identificador que o agente
  -- passa em list_data_sources(group=...) e describe_data(source_type=group).
  name VARCHAR(190) NOT NULL,
  -- rotulo humano ("Financeiro"), o que aparece na resposta e no painel.
  label VARCHAR(190) NOT NULL,
  description TEXT NULL,
  position INT NOT NULL DEFAULT 0,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY uq_dataset_groups_tenant_name (tenant_id, name),
  KEY idx_dataset_groups_tenant_position (tenant_id, position),
  CONSTRAINT fk_dataset_groups_tenant FOREIGN KEY (tenant_id) REFERENCES tenants (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE dataset_group_members (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  tenant_id BIGINT UNSIGNED NOT NULL,
  group_id BIGINT UNSIGNED NOT NULL,
  -- NOME do dataset (datasets.name, ja normalizado para [a-z0-9_] pela
  -- ingestao). Deliberadamente SEM FK: ver o cabecalho.
  dataset_name VARCHAR(190) NOT NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uq_dataset_group_members_tenant_dataset (tenant_id, dataset_name),
  KEY idx_dataset_group_members_group (group_id),
  CONSTRAINT fk_dataset_group_members_tenant FOREIGN KEY (tenant_id) REFERENCES tenants (id),
  CONSTRAINT fk_dataset_group_members_group FOREIGN KEY (group_id) REFERENCES dataset_groups (id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
