-- ---------------------------------------------------------------------------
-- O indice das saidas do estoque pela data: `IDX_PRODUTOS_ESTOQUE_data_criacao` em
-- `produtos_estoque (data_criacao)` (o D630; o D-r9 de `docs/f3-relatorios/spec-retirada.md`).
--
--   mysql franquia_producao < scripts/migracao-produtos-estoque-indice-data.sql
--
-- Roda no laco do passo 0 de `docs/procedimento-de-corte.md`, em PRODUCAO (o passo 4 da
-- etapa 1, `docs/procedimento-de-corte-etapa-1.md`), e no laco da copia do
-- desenvolvimento de `docs/ensaio-geral-do-corte.md`, contra a `franquiabv_dev`. Nas duas
-- copias locais desde 07/11/2026 (a fatia 114, ESQUEMA-QUE-SO-ACRESCENTA; a resposta 83 (a) do
-- dono: o que so acrescenta entra nas copias, com a migracao no passo 0). O PostgreSQL da copia
-- o recebe por `postgres/migracao-produtos-estoque-indice-data.sql`; os bancos da suite, o do
-- contrato e a producao nascem do `postgres/schema.sql`, que o gerador emite do `KEY` do
-- `mysql.sql`.
--
-- POR QUE: o mes da Retirada de produtos (`ProdutoEstoqueRepository::retiradasDoPeriodo`)
-- filtra as saidas por `data_criacao`, e sem indice nela le a tabela inteira (as 33.576 linhas da
-- copia) para achar as do mes. Hoje e pouco (o tempo antes e depois esta no D630); a tabela so
-- cresce. So desempenho: nenhum codigo depende dele, e o codigo antigo nao o sente.
--
-- SO ACRESCENTA: indice secundario novo, sem chave estrangeira. O InnoDB o cria INPLACE, com
-- LOCK=NONE: as escritas no estoque seguem durante a criacao. Se o servidor recusar o INPLACE, o
-- ALTER falha e nao muda nada.
--
-- IDEMPOTENTE: sem o indice, cria; com ele em `data_criacao`, nao faz nada. Com o nome em outras
-- colunas PARA com erro, sem mudar nada: e uma producao que esta migracao nao conhece. ENSAIADA em
-- 07/11/2026 (a correcao da fatia 114), num banco descartavel com a `produtos_estoque` da copia sem o
-- indice (33.576 linhas): cria em 0,09 s, a segunda vez "indice ja existe" em 0,04 s, e com o nome em
-- `(data_criacao, id)` a parada com saida 1 e o indice intocado. Os tres ramos rodam a cada suite
-- (`EsquemaQueSoAcrescentaTest::testAMigracaoDasSaidasCriaOIndiceUmaVezEParaNaFormaQueNaoConhece`).
--
-- PARA DESFAZER: `ALTER TABLE produtos_estoque DROP INDEX IDX_PRODUTOS_ESTOQUE_data_criacao;`.
--
-- ---------------------------------------------------------------------------
-- ESTA MIGRACAO PRECISA ESTAR EM PRODUCAO ANTES DO PASSO 1 -- o passo 0 (D323): o passo 1
-- refaz o `mysql.sql` da producao, e sem o indice la ele some do `mysql.sql` e do `schema.sql`.
-- ---------------------------------------------------------------------------

SET @colunas = (
    SELECT GROUP_CONCAT(column_name ORDER BY seq_in_index)
      FROM information_schema.statistics
     WHERE table_schema = DATABASE()
       AND table_name = 'produtos_estoque'
       AND index_name = 'IDX_PRODUTOS_ESTOQUE_data_criacao'
);

SET @sql = CASE
    WHEN @colunas = 'data_criacao' THEN
        'SELECT ''indice ja existe, nada a fazer'' AS aviso'
    WHEN @colunas IS NULL THEN
        'ALTER TABLE produtos_estoque
           ADD INDEX IDX_PRODUTOS_ESTOQUE_data_criacao (data_criacao),
           ALGORITHM=INPLACE, LOCK=NONE'
    ELSE
        -- A FORMA QUE NAO SE CONHECE (o molde da `migracao-vendas-indice-cliente-status-data.sql`): o `SIGNAL` nao vale
        -- no `PREPARE`, e a parada e uma coluna que nao existe, com o motivo no nome -- saida 1, nada mudou.
        'SELECT IDX_PRODUTOS_ESTOQUE_data_criacao_com_colunas_que_esta_migracao_nao_conhece_nada_mudou FROM produtos_estoque LIMIT 1'
END;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- Conferencia. O esperado e uma linha: o indice, nao unico, em `data_criacao`.
SELECT index_name                                         AS indice,
       GROUP_CONCAT(column_name ORDER BY seq_in_index)    AS colunas,
       MAX(non_unique)                                    AS nao_unico
  FROM information_schema.statistics
 WHERE table_schema = DATABASE()
   AND table_name = 'produtos_estoque'
   AND index_name = 'IDX_PRODUTOS_ESTOQUE_data_criacao'
 GROUP BY index_name;
