-- Atualização de Tabelas para Missões Logísticas (PostgreSQL)
-- ATENÇÃO: ESTE SCRIPT APAGA DADOS EXISTENTES NAS TABELAS LOGÍSTICAS PARA RECRIAÇÃO
-- Nomes das tabelas sincronizados com os Models PHP existentes

BEGIN;

-- Drop Tables (Ordem reversa de dependência)
DROP TABLE IF EXISTS missao_logistica_solicitacao CASCADE;
DROP TABLE IF EXISTS missao_logistica_notificacao CASCADE;
DROP TABLE IF EXISTS missao_logistica_extrato CASCADE;
DROP TABLE IF EXISTS missao_logistica_usuarios CASCADE;
DROP TABLE IF EXISTS missao_logistica_itens CASCADE;
DROP TABLE IF EXISTS missao_logistica CASCADE;
DROP TABLE IF EXISTS tipos_missao_logistica CASCADE;

-- =====================================================
-- TABELA: tipos_missao_logistica (Model: TipoMissaoLogistica)
-- =====================================================
CREATE TABLE tipos_missao_logistica (
    id SERIAL PRIMARY KEY,
    codigo VARCHAR(50) UNIQUE NOT NULL,
    descricao TEXT,
    
    -- Block padrão
    data_cadastro TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id INTEGER,
    block_usuario_id INTEGER,
    usuario_cadastro VARCHAR(255),
    data_atualizacao TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data TIMESTAMP WITHOUT TIME ZONE,
    block_quem VARCHAR(255),
    block INTEGER,
    block_empresa_id INTEGER
);

-- =====================================================
-- TABELA: missao_logistica (Model: MissaoLogistica)
-- =====================================================
CREATE TABLE missao_logistica (
    id SERIAL PRIMARY KEY,
    tipo_missao_id INTEGER REFERENCES tipos_missao_logistica(id) ON DELETE SET NULL,
    status VARCHAR(30) DEFAULT 'pendente',
    descricao TEXT,
    
    -- Referência Externa
    referencia_tipo VARCHAR(50),
    referencia_id INTEGER,
    
    -- Modo de Atribuição
    modo_atribuicao VARCHAR(30) DEFAULT 'DESIGNADA',
    ordem_prioridade INTEGER DEFAULT 0,
    
    -- Novos campos admin
    lider_id INTEGER,
    prioridade SMALLINT DEFAULT 0,
    permite_conjunto SMALLINT DEFAULT 0,
    requer_aprovacao BOOLEAN DEFAULT TRUE,
    
    -- Timestamps Operacionais
    iniciado_em TIMESTAMP WITHOUT TIME ZONE,
    finalizado_em TIMESTAMP WITHOUT TIME ZONE,
    finalizada_por INTEGER,
    
    -- Block padrão
    data_cadastro TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id INTEGER,
    block_usuario_id INTEGER,
    usuario_cadastro VARCHAR(255),
    data_atualizacao TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data TIMESTAMP WITHOUT TIME ZONE,
    block_quem VARCHAR(255),
    block INTEGER,
    block_empresa_id INTEGER
);

-- =====================================================
-- TABELA: missao_logistica_itens (Model: MissaoLogisticaItem)
-- =====================================================
CREATE TABLE missao_logistica_itens (
    id SERIAL PRIMARY KEY,
    missao_logistica_id INTEGER NOT NULL REFERENCES missao_logistica(id) ON DELETE CASCADE,
    
    -- Identificação do item
    produto_id INTEGER,
    quantidade DECIMAL(15,4) DEFAULT 1.000,
    unidade VARCHAR(10) DEFAULT 'UN',
    origem VARCHAR(100),
    destino VARCHAR(100),
    ordem INTEGER DEFAULT 0,
    status VARCHAR(30) DEFAULT 'pendente',
    
    -- Dados e Logs
    campos_solicitados JSONB,
    dados_coletados JSONB,
    pulado_vezes INTEGER DEFAULT 0,
    observacoes TEXT,
    
    -- Timestamps Operacionais
    iniciado_em TIMESTAMP WITHOUT TIME ZONE,
    iniciado_por INTEGER,
    concluido_em TIMESTAMP WITHOUT TIME ZONE,
    concluido_por INTEGER,
    
    -- Novos campos solicitações
    motivo_remocao TEXT,
    solicitou_recomeco SMALLINT DEFAULT 0,
    tempo_execucao VARCHAR(20),
    
    -- Campos Bipagem (Adicionados para suportar Picking)
    quantidade_esperada DECIMAL(15,4) DEFAULT 1.000,
    quantidade_bipada DECIMAL(15,4) DEFAULT 0,
    codigo_barras VARCHAR(50),
    
    -- Referência Externa (para rastrear origem: PEDIDO, ROMANEIO, etc)
    referencia_tipo VARCHAR(50),
    referencia_id INTEGER,
    pedido_id INTEGER REFERENCES pedidos(id) ON DELETE SET NULL,
    romaneio_id INTEGER REFERENCES romaneios(id) ON DELETE SET NULL,
    dados_adicionais JSONB,
    
    -- Block padrão
    data_cadastro TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id INTEGER,
    block_usuario_id INTEGER,
    usuario_cadastro VARCHAR(255),
    data_atualizacao TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data TIMESTAMP WITHOUT TIME ZONE,
    block_quem VARCHAR(255),
    block INTEGER,
    block_empresa_id INTEGER
);

-- =====================================================
-- TABELA: missao_logistica_usuarios (Model: MissaoLogisticaUsuario)
-- =====================================================
CREATE TABLE missao_logistica_usuarios (
    id SERIAL PRIMARY KEY,
    missao_logistica_id INTEGER NOT NULL REFERENCES missao_logistica(id) ON DELETE CASCADE,
    usuario_id INTEGER NOT NULL,
    papel VARCHAR(30) DEFAULT 'OPERADOR',
    entrou_em TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    saiu_em TIMESTAMP WITHOUT TIME ZONE,
    
    -- Block padrão
    data_cadastro TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id INTEGER,
    block_usuario_id INTEGER,
    usuario_cadastro VARCHAR(255),
    data_atualizacao TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data TIMESTAMP WITHOUT TIME ZONE,
    block_quem VARCHAR(255),
    block INTEGER,
    block_empresa_id INTEGER
);

-- =====================================================
-- TABELA: missao_logistica_extrato (Model: MissaoLogisticaExtrato)
-- =====================================================
CREATE TABLE missao_logistica_extrato (
    id SERIAL PRIMARY KEY,
    missao_logistica_id INTEGER NOT NULL REFERENCES missao_logistica(id) ON DELETE CASCADE,
    acao VARCHAR(50) NOT NULL,
    usuario_id INTEGER,
    referencia_id INTEGER,
    payload JSONB,
    
    -- Block padrão
    data_cadastro TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id INTEGER,
    block_usuario_id INTEGER,
    usuario_cadastro VARCHAR(255),
    data_atualizacao TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data TIMESTAMP WITHOUT TIME ZONE,
    block_quem VARCHAR(255),
    block INTEGER,
    block_empresa_id INTEGER
);

-- =====================================================
-- TABELA: missao_logistica_notificacao (Model: MissaoLogisticaNotificacao)
-- =====================================================
CREATE TABLE missao_logistica_notificacao (
    id SERIAL PRIMARY KEY,
    missao_logistica_id INTEGER REFERENCES missao_logistica(id) ON DELETE CASCADE,
    usuario_origem_id INTEGER,
    usuario_destino_id INTEGER NOT NULL,
    tipo VARCHAR(30) DEFAULT 'INFO',  -- INFO, PRIORIDADE, ATENCAO, ALERTA
    mensagem TEXT NOT NULL,
    lida SMALLINT DEFAULT 0,
    
    -- Block padrão
    data_cadastro TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id INTEGER,
    block_usuario_id INTEGER,
    usuario_cadastro VARCHAR(255),
    data_atualizacao TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data TIMESTAMP WITHOUT TIME ZONE,
    block_quem VARCHAR(255),
    block INTEGER,
    block_empresa_id INTEGER
);

-- =====================================================
-- TABELA: missao_logistica_solicitacao (Model: MissaoLogisticaSolicitacao)
-- =====================================================
CREATE TABLE missao_logistica_solicitacao (
    id SERIAL PRIMARY KEY,
    missao_logistica_id INTEGER NOT NULL REFERENCES missao_logistica(id) ON DELETE CASCADE,
    item_id INTEGER REFERENCES missao_logistica_itens(id) ON DELETE SET NULL,
    tipo VARCHAR(30) NOT NULL,  -- DESVINCULO, RECOMECO
    solicitante_id INTEGER NOT NULL,
    motivo TEXT,
    status VARCHAR(30) DEFAULT 'pendente',  -- pendente, aprovada, rejeitada
    respondido_por INTEGER,
    resposta TEXT,
    respondido_em TIMESTAMP WITHOUT TIME ZONE,
    
    -- Block padrão
    data_cadastro TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id INTEGER,
    block_usuario_id INTEGER,
    usuario_cadastro VARCHAR(255),
    data_atualizacao TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data TIMESTAMP WITHOUT TIME ZONE,
    block_quem VARCHAR(255),
    block INTEGER,
    block_empresa_id INTEGER
);

-- =====================================================
-- ÍNDICES
-- =====================================================
CREATE INDEX idx_missao_status ON missao_logistica (status);
CREATE INDEX idx_missao_tipo ON missao_logistica (tipo_missao_id);
CREATE INDEX idx_missao_prioridade ON missao_logistica (prioridade);

CREATE INDEX idx_itens_missao ON missao_logistica_itens (missao_logistica_id);
CREATE INDEX idx_itens_status ON missao_logistica_itens (status);

CREATE INDEX idx_usuarios_missao ON missao_logistica_usuarios (missao_logistica_id);

CREATE INDEX idx_extrato_missao ON missao_logistica_extrato (missao_logistica_id);

CREATE INDEX idx_notificacao_destino ON missao_logistica_notificacao (usuario_destino_id);
CREATE INDEX idx_notificacao_lida ON missao_logistica_notificacao (lida);

CREATE INDEX idx_solicitacao_status ON missao_logistica_solicitacao (status);
CREATE INDEX idx_solicitacao_missao ON missao_logistica_solicitacao (missao_logistica_id);

CREATE INDEX idx_itens_pedido ON missao_logistica_itens (pedido_id);
CREATE INDEX idx_itens_romaneio ON missao_logistica_itens (romaneio_id);

COMMIT;
