-- =====================================================
-- TABELA: goldie_ocorrencias_extrato
-- Audit trail e controle de tentativas para ocorrencias
-- Inspirado em missao_logistica_extrato, mas especializado
-- =====================================================

CREATE TABLE IF NOT EXISTS goldie_ocorrencias_extrato (
    id SERIAL PRIMARY KEY,
    
    -- Referencia a ocorrencia
    ocorrencia_id INTEGER NOT NULL,
    
    -- Controle da tentativa
    tentativa_numero INTEGER NOT NULL DEFAULT 1,
    status_antes VARCHAR(30),
    status_depois VARCHAR(30),
    
    -- Detalhes do processamento
    acao VARCHAR(50) NOT NULL, -- 'processamento_iniciado', 'processamento_sucesso', 'processamento_erro', 'retry_manual', 'retry_automatico'
    resultado VARCHAR(20), -- 'sucesso', 'erro', 'parcial'
    mensagem_erro TEXT,
    payload JSONB,
    
    -- Metricas de performance
    duracao_segundos NUMERIC(10,3),
    memoria_usada_mb NUMERIC(10,2),
    
    -- Controle de retry
    proxima_tentativa TIMESTAMP,
    backoff_minutos INTEGER,
    
    -- Block padrao
    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,
    
    -- Foreign key
    CONSTRAINT fk_ocorrencias_extrato_ocorrencia
        FOREIGN KEY (ocorrencia_id)
        REFERENCES goldie_ocorrencias (id)
        ON DELETE CASCADE
);

-- Indices
CREATE INDEX IF NOT EXISTS idx_goldie_oc_extrato_ocorrencia ON goldie_ocorrencias_extrato (ocorrencia_id);
CREATE INDEX IF NOT EXISTS idx_goldie_oc_extrato_acao ON goldie_ocorrencias_extrato (acao);
CREATE INDEX IF NOT EXISTS idx_goldie_oc_extrato_resultado ON goldie_ocorrencias_extrato (resultado);
CREATE INDEX IF NOT EXISTS idx_goldie_oc_extrato_data ON goldie_ocorrencias_extrato (data_cadastro);
CREATE INDEX IF NOT EXISTS idx_goldie_oc_extrato_proxima_tentativa ON goldie_ocorrencias_extrato (proxima_tentativa) WHERE proxima_tentativa IS NOT NULL;
