-- =====================================================
-- Migration 004: generaliza wms_alocacoes -> wms_movimentos (Operação WMS genérica)
-- Feature: operacao-wms (generaliza alocacao-wms)
-- Data: 2026-06-23
-- =====================================================
--
-- A missão de Alocação WMS vira uma Missão de Operação WMS genérica; a tabela
-- de alocações vira o log unificado de movimentos WMS. Cada movimento carrega
-- o discriminador `operacao_tipo` (alocacao | inventario_endereco |
-- inventario_produtos | conferencia_localizacao | validacao_ocupacao) e, para
-- validacao_ocupacao, o `ocupacao_estado`.
--
-- Renomeia tabela + índices e adiciona as colunas novas. Decidido fazer o
-- rename físico agora (ambiente DEV; WMS externo ainda não conectado, sem dado
-- de prod relevante) em vez de adiar via expand/contract.
--
-- Idempotente (IF EXISTS / IF NOT EXISTS): rodar 2x é seguro. Postgres.
-- Block columns sem DEFAULT (feedback_block_columns); customerControl=true.
-- =====================================================

-- 1. Rename físico da tabela (one-way; IF EXISTS torna o re-run seguro).
ALTER TABLE IF EXISTS wms_alocacoes RENAME TO wms_movimentos;

-- 2. Renomeia os índices herdados (Postgres não renomeia índice no rename da tabela).
ALTER INDEX IF EXISTS idx_wms_alocacoes_missao    RENAME TO idx_wms_movimentos_missao;
ALTER INDEX IF EXISTS idx_wms_alocacoes_produto   RENAME TO idx_wms_movimentos_produto;
ALTER INDEX IF EXISTS idx_wms_alocacoes_integ_erp RENAME TO idx_wms_movimentos_integ_erp;
ALTER INDEX IF EXISTS idx_wms_alocacoes_integ_wms RENAME TO idx_wms_movimentos_integ_wms;
ALTER INDEX IF EXISTS idx_wms_alocacoes_operacao  RENAME TO idx_wms_movimentos_operacao;
ALTER INDEX IF EXISTS wms_alocacoes_pkey           RENAME TO wms_movimentos_pkey;

-- 3. Colunas novas (aditivas) — cobre tenant que ainda não as tinha.
ALTER TABLE wms_movimentos
    ADD COLUMN IF NOT EXISTS operacao_tipo VARCHAR(40) NOT NULL DEFAULT 'alocacao';
ALTER TABLE wms_movimentos
    ADD COLUMN IF NOT EXISTS ocupacao_estado VARCHAR(30);
        -- ocupado | vazio | avariado | bloqueado (só validacao_ocupacao); NULL nas demais

-- Backfill explícito (o DEFAULT já cobre linhas existentes).
UPDATE wms_movimentos
   SET operacao_tipo = 'alocacao'
 WHERE operacao_tipo IS NULL OR operacao_tipo = '';

-- 4. Índice por operação (caso o tenant ainda não tivesse).
CREATE INDEX IF NOT EXISTS idx_wms_movimentos_operacao
    ON wms_movimentos (operacao_tipo, block);
