-- =====================================================
-- Migration 002: Alvos do plano (universo materializado + frequência)
-- Feature: inventario-ciclico
-- Data: 2026-06-29
-- =====================================================
--
-- O universo do plano é calculado uma vez (ou quando solicitado) e
-- materializado aqui, um registro por alvo. Cada linha carrega também o
-- "controle de frequência" — último inventário, quantidade de inventários,
-- último responsável — que alimenta indicadores e a estratégia "menos
-- recente". `ultima_divergencia` fica reservada para a fase 2 (recontagem).
--
-- alvo_ref guarda o código da localização (endereço) OU o produto_id (string),
-- conforme alvo_tipo. Block columns sem DEFAULT (feedback_block_columns).
-- =====================================================

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

    plano_id                INTEGER      NOT NULL,
    alvo_tipo               VARCHAR(20)  NOT NULL,                  -- endereco | produto
    alvo_ref                VARCHAR(120) NOT NULL,                  -- codigo do endereço ou produto_id
    alvo_descricao          VARCHAR(255),
    ordem                   INTEGER      NOT NULL DEFAULT 0,        -- usado pela seleção sequencial
    prioridade              INTEGER      NOT NULL DEFAULT 0,        -- usado pela seleção por prioridade manual

    -- Controle de frequência / histórico
    ultimo_inventario_em    TIMESTAMP WITHOUT TIME ZONE,
    qtd_inventarios         INTEGER      NOT NULL DEFAULT 0,
    ultimo_responsavel_id   INTEGER,
    ultima_divergencia      NUMERIC(14,4),                         -- reservado p/ fase 2 (recontagem)
    coberto_campanha        INTEGER      NOT NULL DEFAULT 0,       -- nº da campanha em que o alvo já foi coberto

    status                  VARCHAR(20)  NOT NULL DEFAULT 'pendente', -- pendente | agendado | concluido

    -- 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
);

-- Um alvo é único dentro do plano (por tenant)
CREATE UNIQUE INDEX IF NOT EXISTS uniq_inv_plano_alvo
    ON inventario_plano_alvos (plano_id, alvo_tipo, alvo_ref, block);

-- Listagens e seleção
CREATE INDEX IF NOT EXISTS idx_inv_plano_alvo_plano    ON inventario_plano_alvos (plano_id, block);
CREATE INDEX IF NOT EXISTS idx_inv_plano_alvo_recencia ON inventario_plano_alvos (plano_id, ultimo_inventario_em);
CREATE INDEX IF NOT EXISTS idx_inv_plano_alvo_ordem    ON inventario_plano_alvos (plano_id, ordem);
