<?php
/**
 * EXEMPLO COMPLETO DE INTEGRAÇÃO
 * 
 * Modelo: ERP read-only com detecção de deleções por AUSÊNCIA
 * Sincronizar lançamentos do ERP Desbravador para HELM
 * Volume: ~1M registros/mês
 * 
 * IMPORTANTE:
 * - ERP é somente leitura (não alteramos nada lá)
 * - Quando usuário deleta no ERP, o registro some (deleção física)
 * - Sincronizador detecta a ausência e marca para DELETAR no HELM
 */

require_once(dirname(__DIR__) . '/config/db.php');
require_once(dirname(__DIR__) . '/classes/SincronizacaoERP.php');

// ============================================================
// CONFIGURAÇÃO DA INTEGRAÇÃO
// ============================================================

$CONFIGURACAO = [
    'cdintegracao' => 1,  // ID da conexão com ERP
    'cdempresa' => 1,     // ID da empresa HELM
    'nome_origem' => 'Lançamentos Desbravador',
    'sql_origem' => '
        SELECT 
            l.id as id_original,
            l.empresa_id,
            l.conta_id,
            l.centro_custo_id,
            l.historico_id,
            l.valor,
            l.descricao,
            l.documento,
            l.data_lancamento,
            l.data_criacao,
            l.data_modificacao
        FROM lancamentos l
        WHERE l.data_criacao > ? OR l.data_modificacao > ?
        ORDER BY l.data_modificacao DESC
    ',
];

// ============================================================
// CLASSE CUSTOMIZADA PARA SINCRONIZAÇÃO DE LANÇAMENTOS
// ============================================================

class SincronizacaoLancamentos extends SincronizacaoERP {
    
    /**
     * MAPEAR CAMPOS DO ERP PARA HELM
     */
    protected function mapearRegistro($registro_erp) {
        return [
            'id_origem' => $registro_erp['id_original'],
            'cdempresa' => $registro_erp['empresa_id'],
            'cdconta' => $registro_erp['conta_id'],
            'cdcentrocusto' => $registro_erp['centro_custo_id'],
            'cdhistorico' => $registro_erp['historico_id'],
            'vlvalor' => (float)$registro_erp['valor'],
            'dshistorico' => $registro_erp['descricao'],
            'nrdocumento' => $registro_erp['documento'],
            'dthlanc' => $registro_erp['data_lancamento'],
            'dthcriacao' => $registro_erp['data_criacao'],
            'dthmodificacao' => $registro_erp['data_modificacao'],
            'flvigente' => true,  // Sempre true em novo INSERT
        ];
    }
    
    /**
     * EXTRAIR CHAVE ÚNICA
     * Cada lançamento é único por: empresa + documento + data
     * IMPORTANTE: Essa é a "chave de integração" que usamos para rastrear
     * Se usuario deleta #26598 no ERP, nós sabemos porque a chave #26598 some do ERP
     */
    protected function extrairChaveOrigem($registro) {
        return $registro['id_original'];  // Usar direto o ID do ERP
    }
    
    /**
     * VALIDAÇÕES ESPECÍFICAS DE LANÇAMENTO
     */
    protected function validarRegistro($registro) {
        $erros = [];
        
        // Valor deve ser positivo
        if ($registro['vlvalor'] <= 0) {
            $erros[] = 'Valor deve ser positivo';
        }
        
        // Data deve ser válida
        if (strtotime($registro['dthlanc']) === false) {
            $erros[] = 'Data inválida';
        }
        
        // Empresa deve existir e estar ativa
        $stmt = $this->pdo->prepare("
            SELECT 1 FROM back.empresa 
            WHERE cdempresa = :id AND flativo = 0
        ");
        $stmt->execute([':id' => $registro['cdempresa']]);
        if (!$stmt->fetchColumn()) {
            $erros[] = 'Empresa ' . $registro['cdempresa'] . ' não encontrada ou inativa';
        }
        
        // Conta deve existir
        $stmt = $this->pdo->prepare("
            SELECT 1 FROM back.plano_contabil 
            WHERE cdconta = :id
        ");
        $stmt->execute([':id' => $registro['cdconta']]);
        if (!$stmt->fetchColumn()) {
            $erros[] = 'Conta ' . $registro['cdconta'] . ' não encontrada';
        }
        
        // Centro de custo (se informado) deve existir
        if (!empty($registro['cdcentrocusto'])) {
            $stmt = $this->pdo->prepare("
                SELECT 1 FROM back.centro_custo 
                WHERE cdcc = :id AND flativo = 0
            ");
            $stmt->execute([':id' => $registro['cdcentrocusto']]);
            if (!$stmt->fetchColumn()) {
                $erros[] = 'Centro de custo não encontrado';
            }
        }
        
        if (!empty($erros)) {
            throw new Exception('Validação: ' . implode('; ', $erros));
        }
    }
}

// ============================================================
// EXECUTAR SINCRONIZAÇÃO
// ============================================================

function iniciarSincronizacao() {
    global $pdo, $CONFIGURACAO;
    
    try {
        echo "\n";
        echo "════════════════════════════════════════════════════════════\n";
        echo "SINCRONIZAÇÃO ERP → HELM (Modelo Read-Only)\n";
        echo "════════════════════════════════════════════════════════════\n";
        echo "Data/Hora: " . date('Y-m-d H:i:s') . "\n";
        echo "\n";
        
        // Iniciar sincronização
        $sinc = new SincronizacaoLancamentos(
            $pdo,
            $CONFIGURACAO['cdintegracao'],
            $CONFIGURACAO['cdempresa']
        );
        
        $resultado = $sinc->iniciar();
        
        // Exibir resultado
        if ($resultado['ok']) {
            echo "✅ SINCRONIZAÇÃO CONCLUÍDA COM SUCESSO!\n\n";
            echo "Fase 1 - Registros novos/modificados: " . $resultado['resultado']['processados'] . "\n";
            echo "Fase 2 - Registros deletados no ERP: " . ($resultado['resultado']['deletados'] ?? 0) . "\n";
            echo "Registros com erro: " . $resultado['resultado']['erros'] . "\n";
            echo "\nLog ID: " . $resultado['cdintegracao_log'] . "\n";
        } else {
            echo "❌ ERRO NA SINCRONIZAÇÃO!\n\n";
            echo "Mensagem: " . $resultado['msg'] . "\n";
        }
        
        echo "\n";
        echo "════════════════════════════════════════════════════════════\n";
        echo "Próxima sincronização agendada para: " . date('Y-m-d H:i:s', strtotime('+1 hour')) . "\n";
        echo "════════════════════════════════════════════════════════════\n";
        echo "\n";
        
        return $resultado;
        
    } catch (Exception $e) {
        echo "❌ ERRO CRÍTICO:\n";
        echo $e->getMessage() . "\n";
        exit(1);
    }
}

// ============================================================
// QUERIES DE MONITORAMENTO
// ============================================================

function exibirStatusSincronizacao() {
    global $pdo;
    
    echo "\n";
    echo "STATUS ATUAL DE SINCRONIZAÇÕES\n";
    echo "──────────────────────────────────────────────────\n\n";
    
    // Últimas sincronizações
    $stmt = $pdo->query("
        SELECT 
            cdintegracao_log,
            dthsinc,
            flstatus,
            qtregistros_processados,
            qtregistros_erro,
            EXTRACT(EPOCH FROM (dthfim - dthinicio))::INT as segundos_decorridos
        FROM back.integracao_log
        ORDER BY dthsinc DESC
        LIMIT 5
    ");
    
    echo "Últimas 5 sincronizações:\n";
    foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
        $status_icon = $row['flstatus'] === 'sucesso' ? '✅' : '❌';
        echo sprintf(
            "%s %s | Processados: %d | Erros: %d | Tempo: %dm\n",
            $status_icon,
            $row['dthsinc'],
            $row['qtregistros_processados'],
            $row['qtregistros_erro'],
            ceil($row['segundos_decorridos'] / 60)
        );
    }
    
    echo "\n";
    
    // Fila pendente
    $stmt = $pdo->query("
        SELECT tipo_operacao, flstatus, COUNT(*) as qtregistros
        FROM back.integracao_fila
        GROUP BY tipo_operacao, flstatus
        ORDER BY tipo_operacao, flstatus
    ");
    
    echo "Estado da fila (para processar):\n";
    $total_pendente = 0;
    foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
        $icon = '⏳';
        if ($row['flstatus'] === 'concluido') $icon = '✅';
        if ($row['flstatus'] === 'erro') $icon = '❌';
        
        echo sprintf(
            "%s %s - %s: %d registros\n",
            $icon,
            $row['tipo_operacao'],
            $row['flstatus'],
            $row['qtregistros']
        );
        if ($row['flstatus'] === 'pendente') {
            $total_pendente += $row['qtregistros'];
        }
    }
    
    if ($total_pendente > 0) {
        echo "\n⏳ " . $total_pendente . " registros aguardando processamento por FilaProcessador\n";
    } else {
        echo "\n✅ Fila vazia - tudo processado\n";
    }
    
    echo "\n";
    
    // Registros com erro
    $stmt = $pdo->query("
        SELECT COUNT(*) as qtregistros
        FROM back.integracao_rastreamento
        WHERE flstatus = 'erro'
    ");
    
    $qt_erro = $stmt->fetch(PDO::FETCH_ASSOC)['qtregistros'];
    if ($qt_erro > 0) {
        echo "⚠️  " . $qt_erro . " registros com erro (revisar manualmente)\n";
    }
    
    echo "\n";
    
    // Deletados detectados
    $stmt = $pdo->query("
        SELECT COUNT(*) as qtregistros
        FROM back.integracao_rastreamento
        WHERE flstatus = 'deletado' AND dthdelecao > NOW() - INTERVAL '7 days'
    ");
    
    $qt_deletados = $stmt->fetch(PDO::FETCH_ASSOC)['qtregistros'];
    if ($qt_deletados > 0) {
        echo "🗑️  " . $qt_deletados . " registros deletados no ERP (últimos 7 dias)\n";
    }
}

// ============================================================
// EXECUTAR
// ============================================================

if (php_sapi_name() !== 'cli') {
    die("Este script deve ser executado via CLI\n");
}

// Verificar opção de linha de comando
$opcao = $argv[1] ?? 'sincronizar';

switch ($opcao) {
    case 'sincronizar':
        iniciarSincronizacao();
        break;
    
    case 'status':
        exibirStatusSincronizacao();
        break;
    
    case 'help':
        echo "USO: php exemplo_integracao.php [opção]\n\n";
        echo "Opções:\n";
        echo "  sincronizar  - Iniciar sincronização (padrão)\n";
        echo "  status       - Exibir status de sincronizações\n";
        echo "  help         - Este help\n";
        echo "\n";
        echo "Configurar cron job:\n";
        echo "  0 * * * * /usr/bin/php /path/to/exemplo_integracao.php sincronizar\n";
        echo "  (executa a cada hora)\n";
        break;
    
    default:
        echo "Opção desconhecida: $opcao\n";
        echo "Use 'php exemplo_integracao.php help' para ajuda\n";
        exit(1);
}

?>
