<?php
header('Content-Type: text/html; charset=utf-8');

// Configuração do banco
$host = 'localhost';
$dbname = 'pinheir3_controle_frotasV1.1';
$user = 'pinheir3_admin';
$pass = 'G3r@ld0P!nh3!r0';

$apenasAnalisar = isset($_GET['apenas_analisar']) && $_GET['apenas_analisar'] == '1';

if ($apenasAnalisar) {
    echo "<h1>🔍 Análise de Usuários e Motoristas</h1>";
    echo "<p>Análise da situação atual sem modificar dados.</p>";
} else {
    echo "<h1>🔧 Unificação de Usuários e Motoristas</h1>";
    echo "<p>Este script irá unificar as tabelas 'usuarios' e 'motoristas' em uma única estrutura.</p>";
}

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // Iniciar transação para segurança apenas se não for análise
    if (!$apenasAnalisar) {
        $pdo->beginTransaction();
    }
    
    echo "<h2>📊 Análise Atual</h2>";
    
    // 1. Verificar dados atuais
    $stmt = $pdo->query("SELECT COUNT(*) as total FROM usuarios");
    $totalUsuarios = $stmt->fetch()['total'];
    echo "<p>👥 Usuários atuais: $totalUsuarios</p>";
    
    $stmt = $pdo->query("SELECT COUNT(*) as total FROM motoristas");
    $totalMotoristas = $stmt->fetch()['total'];
    echo "<p>🚗 Motoristas atuais: $totalMotoristas</p>";
    
    $stmt = $pdo->query("SELECT COUNT(*) as total FROM viagens");
    $totalViagens = $stmt->fetch()['total'];
    echo "<p>📍 Viagens totais: $totalViagens</p>";
    
    // 2. Analisar problemas atuais
    echo "<h3>🔍 Problemas Identificados:</h3>";
    
    // Verificar viagens com tecnico_id inválido
    $stmt = $pdo->query("
        SELECT COUNT(*) as total 
        FROM viagens v 
        LEFT JOIN usuarios u ON v.tecnico_id = u.id 
        WHERE u.id IS NULL
    ");
    $viagensOrfas = $stmt->fetch()['total'];
    echo "<p>❌ Viagens com técnico não encontrado em 'usuarios': $viagensOrfas</p>";
    
    // Verificar se existem motoristas que não são usuários
    $stmt = $pdo->query("
        SELECT COUNT(*) as total 
        FROM motoristas m 
        LEFT JOIN usuarios u ON m.usuario = u.id 
        WHERE u.id IS NULL
    ");
    $motoristasOrfaos = $stmt->fetch()['total'];
    echo "<p>❌ Motoristas sem correspondência em 'usuarios': $motoristasOrfaos</p>";
    
    // Mostrar detalhes dos problemas
    if ($viagensOrfas > 0) {
        echo "<h4>📋 Detalhes das Viagens Órfãs:</h4>";
        $stmt = $pdo->query("
            SELECT DISTINCT v.tecnico_id, COUNT(*) as total_viagens
            FROM viagens v 
            LEFT JOIN usuarios u ON v.tecnico_id = u.id 
            WHERE u.id IS NULL 
            GROUP BY v.tecnico_id
            ORDER BY total_viagens DESC
        ");
        $tecnicos_orfaos = $stmt->fetchAll();
        
        echo "<table border='1' style='border-collapse: collapse; width: 100%; margin: 10px 0;'>";
        echo "<tr style='background: #f0f0f0;'><th>Técnico ID</th><th>Viagens Afetadas</th></tr>";
        foreach ($tecnicos_orfaos as $tecnico) {
            echo "<tr>";
            echo "<td>{$tecnico['tecnico_id']}</td>";
            echo "<td>{$tecnico['total_viagens']}</td>";
            echo "</tr>";
        }
        echo "</table>";
    }
    
    if ($motoristasOrfaos > 0) {
        echo "<h4>📋 Motoristas Sem Usuário Correspondente:</h4>";
        $stmt = $pdo->query("
            SELECT m.id, m.nome, m.usuario, m.status
            FROM motoristas m 
            LEFT JOIN usuarios u ON m.usuario = u.id 
            WHERE u.id IS NULL
            ORDER BY m.id
        ");
        $motoristas_sem_usuario = $stmt->fetchAll();
        
        echo "<table border='1' style='border-collapse: collapse; width: 100%; margin: 10px 0;'>";
        echo "<tr style='background: #f0f0f0;'><th>ID</th><th>Nome</th><th>Usuário</th><th>Status</th></tr>";
        foreach ($motoristas_sem_usuario as $motorista) {
            echo "<tr>";
            echo "<td>{$motorista['id']}</td>";
            echo "<td>{$motorista['nome']}</td>";
            echo "<td>{$motorista['usuario']}</td>";
            echo "<td>{$motorista['status']}</td>";
            echo "</tr>";
        }
        echo "</table>";
    }
    
    if ($apenasAnalisar) {
        echo "<div style='background: #e3f2fd; padding: 15px; border-radius: 5px; margin: 20px 0;'>";
        echo "<h3>📊 Resumo da Análise</h3>";
        echo "<ul>";
        echo "<li><strong>Total de usuários:</strong> $totalUsuarios</li>";
        echo "<li><strong>Total de motoristas:</strong> $totalMotoristas</li>";
        echo "<li><strong>Viagens órfãs:</strong> $viagensOrfas</li>";
        echo "<li><strong>Motoristas órfãos:</strong> $motoristasOrfaos</li>";
        echo "</ul>";
        
        if ($viagensOrfas > 0 || $motoristasOrfaos > 0) {
            echo "<p><strong>✅ Recomendação:</strong> Execute a unificação para corrigir estes problemas.</p>";
        } else {
            echo "<p><strong>✅ Status:</strong> Não há problemas críticos detectados.</p>";
        }
        echo "</div>";
        
        echo "<div class='text-center' style='margin: 20px 0;'>";
        echo "<a href='unificar-usuarios.html' class='btn btn-primary' style='padding: 10px 20px; background: #007bff; color: white; text-decoration: none; border-radius: 5px;'>Voltar</a>";
        echo "</div>";
        
        exit; // Sair aqui se for apenas análise
    }
    
    echo "<h2>🔄 Processo de Unificação</h2>";
    
    // 3. Migrar motoristas para usuarios
    echo "<h3>1. Migrando motoristas para usuários</h3>";
    
    $stmt = $pdo->query("
        SELECT id, nome, matricula, cpf, telefone, usuario, senha, status, created_at 
        FROM motoristas 
        ORDER BY id
    ");
    $motoristas = $stmt->fetchAll();
    
    $migrados = 0;
    $atualizados = 0;
    
    foreach ($motoristas as $motorista) {
        // Verificar se já existe um usuário com esse ID/email
        $usuarioId = $motorista['usuario'] ?: 'motorista_' . $motorista['id'];
        $email = $motorista['cpf'] ? $motorista['cpf'] . '@motorista.local' : $usuarioId . '@motorista.local';
        
        $stmt = $pdo->prepare("SELECT id FROM usuarios WHERE id = ? OR email = ?");
        $stmt->execute([$usuarioId, $email]);
        $usuarioExiste = $stmt->fetch();
        
        if (!$usuarioExiste) {
            // Criar novo usuário baseado no motorista
            $senhaHash = password_hash($motorista['senha'] ?: '123456', PASSWORD_DEFAULT);
            
            $stmt = $pdo->prepare("
                INSERT INTO usuarios (id, nome, email, senha, cargo, ativo, created_at) 
                VALUES (?, ?, ?, ?, 'Técnico', ?, ?)
            ");
            $stmt->execute([
                $usuarioId,
                $motorista['nome'],
                $email,
                $senhaHash,
                $motorista['status'] === 'ativo' ? 1 : 0,
                $motorista['created_at']
            ]);
            
            echo "<p>✅ Criado usuário: {$motorista['nome']} (ID: $usuarioId)</p>";
            $migrados++;
        } else {
            // Atualizar usuário existente com dados do motorista
            $stmt = $pdo->prepare("
                UPDATE usuarios 
                SET nome = ?, ativo = ?, updated_at = NOW() 
                WHERE id = ?
            ");
            $stmt->execute([
                $motorista['nome'],
                $motorista['status'] === 'ativo' ? 1 : 0,
                $usuarioId
            ]);
            
            echo "<p>🔄 Atualizado usuário: {$motorista['nome']} (ID: $usuarioId)</p>";
            $atualizados++;
        }
        
        // Criar tabela auxiliar para mapear IDs antigos para novos
        $pdo->exec("
            CREATE TABLE IF NOT EXISTS temp_motorista_mapping (
                motorista_id BIGINT PRIMARY KEY,
                usuario_id VARCHAR(50),
                nome VARCHAR(100)
            )
        ");
        
        $stmt = $pdo->prepare("
            INSERT INTO temp_motorista_mapping (motorista_id, usuario_id, nome) 
            VALUES (?, ?, ?) 
            ON DUPLICATE KEY UPDATE usuario_id = VALUES(usuario_id)
        ");
        $stmt->execute([$motorista['id'], $usuarioId, $motorista['nome']]);
    }
    
    echo "<p><strong>📊 Resumo da migração:</strong></p>";
    echo "<ul>";
    echo "<li>Usuários criados: $migrados</li>";
    echo "<li>Usuários atualizados: $atualizados</li>";
    echo "</ul>";
    
    // 4. Corrigir viagens órfãs
    echo "<h3>2. Corrigindo referências nas viagens</h3>";
    
    // Primeiro, tentar mapear por nome
    $stmt = $pdo->query("
        SELECT DISTINCT v.tecnico_id, COUNT(*) as total_viagens
        FROM viagens v 
        LEFT JOIN usuarios u ON v.tecnico_id = u.id 
        WHERE u.id IS NULL 
        GROUP BY v.tecnico_id
    ");
    $tecnicos_orfaos = $stmt->fetchAll();
    
    $corrigidas = 0;
    
    foreach ($tecnicos_orfaos as $tecnico) {
        $tecnico_nome = $tecnico['tecnico_id'];
        $total_viagens = $tecnico['total_viagens'];
        
        // Tentar encontrar usuário por nome similar
        $stmt = $pdo->prepare("
            SELECT id FROM usuarios 
            WHERE nome LIKE ? OR id = ?
            LIMIT 1
        ");
        $stmt->execute(["%$tecnico_nome%", $tecnico_nome]);
        $usuario_correspondente = $stmt->fetch();
        
        if ($usuario_correspondente) {
            // Atualizar viagens para usar o ID correto
            $stmt = $pdo->prepare("
                UPDATE viagens 
                SET tecnico_id = ? 
                WHERE tecnico_id = ?
            ");
            $stmt->execute([$usuario_correspondente['id'], $tecnico_nome]);
            
            echo "<p>✅ Corrigidas $total_viagens viagens: '$tecnico_nome' → '{$usuario_correspondente['id']}'</p>";
            $corrigidas += $total_viagens;
        } else {
            // Criar usuário temporário para viagens órfãs
            $usuario_temp_id = 'temp_' . preg_replace('/[^a-zA-Z0-9]/', '_', $tecnico_nome);
            $email_temp = $usuario_temp_id . '@temp.local';
            
            $stmt = $pdo->prepare("
                INSERT IGNORE INTO usuarios (id, nome, email, senha, cargo, ativo) 
                VALUES (?, ?, ?, ?, 'Técnico', 1)
            ");
            $stmt->execute([
                $usuario_temp_id,
                $tecnico_nome,
                $email_temp,
                password_hash('123456', PASSWORD_DEFAULT)
            ]);
            
            $stmt = $pdo->prepare("
                UPDATE viagens 
                SET tecnico_id = ? 
                WHERE tecnico_id = ?
            ");
            $stmt->execute([$usuario_temp_id, $tecnico_nome]);
            
            echo "<p>⚠️ Criado usuário temporário e corrigidas $total_viagens viagens: '$tecnico_nome' → '$usuario_temp_id'</p>";
            $corrigidas += $total_viagens;
        }
    }
    
    echo "<p><strong>📊 Viagens corrigidas: $corrigidas</strong></p>";
    
    // 5. Atualizar estrutura da tabela usuarios para incluir campos de motorista
    echo "<h3>3. Expandindo tabela de usuários</h3>";
    
    // Adicionar campos específicos de motorista à tabela usuarios
    $campos_motorista = [
        'matricula VARCHAR(50) NULL',
        'cpf VARCHAR(14) NULL',
        'telefone VARCHAR(20) NULL',
        'cnh_numero VARCHAR(20) NULL',
        'cnh_categoria VARCHAR(10) NULL',
        'data_nascimento DATE NULL',
        'foto_uri VARCHAR(500) NULL'
    ];
    
    foreach ($campos_motorista as $campo) {
        try {
            $pdo->exec("ALTER TABLE usuarios ADD COLUMN $campo");
            echo "<p>✅ Campo adicionado: $campo</p>";
        } catch (PDOException $e) {
            if (strpos($e->getMessage(), 'Duplicate column name') !== false) {
                echo "<p>ℹ️ Campo já existe: $campo</p>";
            } else {
                throw $e;
            }
        }
    }
    
    // 6. Migrar dados específicos de motorista
    echo "<h3>4. Migrando dados específicos de motorista</h3>";
    
    $stmt = $pdo->query("
        SELECT m.*, t.usuario_id 
        FROM motoristas m 
        JOIN temp_motorista_mapping t ON m.id = t.motorista_id
    ");
    $dados_motorista = $stmt->fetchAll();
    
    $dados_migrados = 0;
    
    foreach ($dados_motorista as $dados) {
        $stmt = $pdo->prepare("
            UPDATE usuarios 
            SET matricula = ?, cpf = ?, telefone = ?, cnh_numero = ?, cnh_categoria = ?, 
                data_nascimento = ?, foto_uri = ?
            WHERE id = ?
        ");
        $stmt->execute([
            $dados['matricula'],
            $dados['cpf'],
            $dados['telefone'],
            $dados['cnh_numero'],
            $dados['cnh_categoria'],
            $dados['data_nascimento'],
            $dados['foto_uri'],
            $dados['usuario_id']
        ]);
        $dados_migrados++;
    }
    
    echo "<p>✅ Dados específicos migrados para $dados_migrados usuários</p>";
    
    // 7. Verificação final
    echo "<h2>✅ Verificação Final</h2>";
    
    $stmt = $pdo->query("SELECT COUNT(*) as total FROM usuarios");
    $totalUsuariosFinal = $stmt->fetch()['total'];
    echo "<p>👥 Total de usuários após unificação: $totalUsuariosFinal</p>";
    
    $stmt = $pdo->query("
        SELECT COUNT(*) as total 
        FROM viagens v 
        LEFT JOIN usuarios u ON v.tecnico_id = u.id 
        WHERE u.id IS NULL
    ");
    $viagensOrfasFinal = $stmt->fetch()['total'];
    echo "<p>📍 Viagens órfãs restantes: $viagensOrfasFinal</p>";
    
    if ($viagensOrfasFinal == 0) {
        echo "<div style='background: #d4edda; padding: 15px; border-radius: 5px; margin: 20px 0;'>";
        echo "<h3>🎉 Unificação Concluída com Sucesso!</h3>";
        echo "<p>✅ Todas as viagens agora têm técnicos válidos</p>";
        echo "<p>✅ Dados de motoristas migrados para usuários</p>";
        echo "<p>✅ Estrutura unificada criada</p>";
        echo "</div>";
        
        // Commit da transação
        $pdo->commit();
        
        echo "<h3>🧹 Limpeza (Opcional)</h3>";
        echo "<p>Agora você pode:</p>";
        echo "<ul>";
        echo "<li>Renomear a tabela 'motoristas' para 'motoristas_backup'</li>";
        echo "<li>Remover a tabela temporária 'temp_motorista_mapping'</li>";
        echo "<li>Atualizar o código para usar apenas a tabela 'usuarios'</li>";
        echo "</ul>";
        
        echo "<div style='background: #fff3cd; padding: 15px; border-radius: 5px; margin: 20px 0;'>";
        echo "<h4>⚠️ Próximos Passos:</h4>";
        echo "<ol>";
        echo "<li>Testar o sistema completamente</li>";
        echo "<li>Atualizar APIs para usar apenas tabela 'usuarios'</li>";
        echo "<li>Remover referências à tabela 'motoristas' no código</li>";
        echo "<li>Fazer backup e remover tabela 'motoristas' quando tudo estiver funcionando</li>";
        echo "</ol>";
        echo "</div>";
    } else {
        echo "<div style='background: #f8d7da; padding: 15px; border-radius: 5px; margin: 20px 0;'>";
        echo "<h3>⚠️ Ainda há problemas</h3>";
        echo "<p>Existem $viagensOrfasFinal viagens que não puderam ser corrigidas.</p>";
        echo "<p>Verifique manualmente essas viagens antes de prosseguir.</p>";
        echo "</div>";
        
        // Rollback em caso de problemas
        $pdo->rollback();
        echo "<p>❌ Transação revertida por segurança.</p>";
    }
    
    // Limpar tabela temporária
    $pdo->exec("DROP TABLE IF EXISTS temp_motorista_mapping");
    
} catch (Exception $e) {
    // Rollback em caso de erro
    if ($pdo->inTransaction()) {
        $pdo->rollback();
    }
    
    echo "<div style='color: red; background: #f8d7da; padding: 15px; border-radius: 5px;'>";
    echo "<h3>❌ Erro durante a unificação:</h3>";
    echo "<p><strong>Erro:</strong> " . $e->getMessage() . "</p>";
    echo "<p><strong>Linha:</strong> " . $e->getLine() . "</p>";
    echo "<p><strong>Arquivo:</strong> " . $e->getFile() . "</p>";
    echo "<p>Todas as alterações foram revertidas por segurança.</p>";
    echo "</div>";
}

echo "<hr>";
echo "<p><a href='verificar-tecnicos.html'>🔗 Verificar Resultado</a> | ";
echo "<a href='../admin/dashboard.html'>🔗 Dashboard</a></p>";
?> 
