-- =====================================================
-- Migration 001: Planos de Inventário Cíclico (campanha)
-- Feature: inventario-ciclico
-- Data: 2026-06-29
-- =====================================================
--
-- Um plano é uma campanha de inventário contínuo. Define o universo
-- (provider + filtros), a estratégia de distribuição (carga diária), a de
-- seleção (quais alvos pegar) e o calendário. O motor (cron diário) usa o
-- plano para gerar, a cada dia útil, uma missão de inventário no AlocacaoWms.
--
-- Não modela curva ABC/giro/família/fornecedor (out of scope v1) — esses
-- entram como providers/estratégias registráveis no futuro.
--
-- Block columns preenchidas pelo framework via customerControl;
-- declaradas sem DEFAULT (feedback_block_columns). PostgreSQL.
-- =====================================================

CREATE TABLE IF NOT EXISTS inventario_planos (
    id                  SERIAL PRIMARY KEY,

    nome                VARCHAR(255) NOT NULL,
    descricao           TEXT,

    -- Universo: provider plugável (registry key) + tipo de alvo + filtros
    universo_provider   VARCHAR(64)  NOT NULL DEFAULT 'enderecos',     -- enderecos | produtos | ...
    alvo_tipo           VARCHAR(20)  NOT NULL DEFAULT 'endereco',      -- endereco | produto
    universo_config     JSONB,                                         -- {deposito, corredor, rua, categoria_id, ...}

    -- Distribuição: como a carga é espalhada no tempo
    distribuicao_tipo   VARCHAR(20)  NOT NULL DEFAULT 'quantidade_fixa', -- quantidade_fixa | percentual | periodo
    distribuicao_valor  NUMERIC(14,4),                                 -- N fixo (qtd) ou pct 0..100 (percentual)
    periodo_dias        INTEGER,                                       -- usado quando distribuicao_tipo = periodo

    -- Seleção: qual estratégia escolhe os próximos alvos (registry key)
    selecao_estrategia  VARCHAR(40)  NOT NULL DEFAULT 'sequencial',    -- sequencial | aleatoria | menos_recente | prioridade_manual | ...

    -- Calendário: {dias_semana:[1..7], apenas_dias_uteis:bool, feriados:["YYYY-MM-DD"], horario:"HH:MM"}
    calendario_config   JSONB,

    -- Geração da missão diária
    operadores_config   JSONB,                                         -- [] / null = fila aberta
    lider_id            INTEGER,
    requer_aprovacao    SMALLINT     NOT NULL DEFAULT 0,               -- gate de aprovação dos movimentos

    -- Estado da campanha
    status              VARCHAR(20)  NOT NULL DEFAULT 'rascunho',      -- rascunho | ativo | pausado | concluido
    campanha_inicio     DATE,                                          -- início da campanha atual (reset a cada ciclo completo)
    campanha_numero     INTEGER      NOT NULL DEFAULT 1,               -- nº da campanha (incrementa quando o universo é 100% coberto)
    ativo               SMALLINT     NOT NULL DEFAULT 1,               -- atalho de elegibilidade p/ o cron

    -- Audit/block padrão Galaxia (injetado pelo framework no create/update; sem DEFAULT).
    -- Espelha o conjunto de wms_movimentos — ModelInteligencia::create() exige estas colunas.
    data_cadastro       TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    usuario_cadastro    VARCHAR(120),
    data_atualizacao    TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(120),
    block_data          TIMESTAMP WITHOUT TIME ZONE,
    block_quem          VARCHAR(120),
    block_filial_id     INTEGER,
    block_usuario_id    INTEGER,
    block_empresa_id    INTEGER,
    block               INTEGER
);

-- Cron filtra planos elegíveis dentro do tenant
CREATE INDEX IF NOT EXISTS idx_inventario_planos_ativo  ON inventario_planos (ativo, block);
CREATE INDEX IF NOT EXISTS idx_inventario_planos_status ON inventario_planos (status, block);
