<?php
/**
 * Script para corrigir o erro 500 na API de solicitações
 */

require_once 'config/bootstrap.php';

use ControleFrotas\Config\Database;

try {
    $pdo = Database::getConnection();
    echo "✅ Conexão com banco estabelecida\n";
    
    // Executar correções
    echo "\n🔧 Executando correções...\n";
    
    // 1. Remover foreign keys problemáticas
    try {
        $pdo->exec("ALTER TABLE solicitacoes_viagem DROP FOREIGN KEY IF EXISTS fk_solicitacao_tecnico");
        $pdo->exec("ALTER TABLE solicitacoes_viagem DROP FOREIGN KEY IF EXISTS fk_solicitacao_veiculo");
        echo "✅ Foreign keys removidas\n";
    } catch (Exception $e) {
        echo "⚠️  Aviso ao remover foreign keys: " . $e->getMessage() . "\n";
    }
    
    // 2. Recriar tabela
    $pdo->exec("DROP TABLE IF EXISTS solicitacoes_viagem");
    echo "✅ Tabela antiga removida\n";
    
    $createTable = "
    CREATE TABLE solicitacoes_viagem (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        tecnico_id VARCHAR(50) NOT NULL,
        veiculo_id BIGINT NOT NULL,
        cliente VARCHAR(200) NOT NULL,
        motivo TEXT NOT NULL,
        km_inicial INT NOT NULL,
        latitude_inicial DECIMAL(10, 8) NULL,
        longitude_inicial DECIMAL(11, 8) NULL,
        endereco_inicial TEXT NULL,
        cliente_id BIGINT NULL,
        data_solicitacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        status ENUM('pendente', 'aprovada', 'negada', 'cancelada') DEFAULT 'pendente',
        gestor_id VARCHAR(50) NULL,
        data_resposta TIMESTAMP NULL,
        justificativa_gestor TEXT NULL,
        observacoes TEXT NULL,
        prioridade ENUM('baixa', 'normal', 'alta', 'urgente') DEFAULT 'normal',
        viagem_id BIGINT NULL,
        sincronizado BOOLEAN DEFAULT FALSE,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        INDEX idx_tecnico_id (tecnico_id),
        INDEX idx_veiculo_id (veiculo_id),
        INDEX idx_status (status),
        INDEX idx_gestor_id (gestor_id),
        INDEX idx_data_solicitacao (data_solicitacao),
        INDEX idx_prioridade (prioridade)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";
    
    $pdo->exec($createTable);
    echo "✅ Tabela solicitacoes_viagem recriada\n";
    
    // 3. Criar tabela notificacoes_push se não existir
    $createNotificacoes = "
    CREATE TABLE IF NOT EXISTS notificacoes_push (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        user_id VARCHAR(50) NOT NULL,
        tipo ENUM('solicitacao_viagem', 'aprovacao_viagem', 'negacao_viagem', 'cancelamento_viagem', 'viagem_iniciada', 'viagem_finalizada') NOT NULL,
        titulo VARCHAR(200) NOT NULL,
        mensagem TEXT NOT NULL,
        solicitacao_id BIGINT NULL,
        viagem_id BIGINT NULL,
        lida BOOLEAN DEFAULT FALSE,
        enviada BOOLEAN DEFAULT FALSE,
        data_envio TIMESTAMP NULL,
        fcm_token VARCHAR(500) NULL,
        fcm_message_id VARCHAR(200) NULL,
        fcm_response TEXT NULL,
        tentativas_envio INT DEFAULT 0,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        INDEX idx_user_id (user_id),
        INDEX idx_tipo (tipo),
        INDEX idx_lida (lida),
        INDEX idx_enviada (enviada),
        INDEX idx_solicitacao_id (solicitacao_id),
        INDEX idx_viagem_id (viagem_id),
        INDEX idx_created_at (created_at)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";
    
    $pdo->exec($createNotificacoes);
    echo "✅ Tabela notificacoes_push criada/verificada\n";
    
    // 4. Adicionar campos na tabela motoristas
    try {
        $pdo->exec("ALTER TABLE motoristas ADD COLUMN IF NOT EXISTS token VARCHAR(255) NULL");
        $pdo->exec("ALTER TABLE motoristas ADD COLUMN IF NOT EXISTS token_validade TIMESTAMP NULL");
        $pdo->exec("ALTER TABLE motoristas ADD COLUMN IF NOT EXISTS tipo ENUM('motorista', 'gestor', 'admin') DEFAULT 'motorista'");
        echo "✅ Campos adicionados na tabela motoristas\n";
    } catch (Exception $e) {
        echo "⚠️  Aviso ao adicionar campos: " . $e->getMessage() . "\n";
    }
    
    // 5. Criar índices
    try {
        $pdo->exec("CREATE INDEX IF NOT EXISTS idx_motoristas_token ON motoristas(token)");
        $pdo->exec("CREATE INDEX IF NOT EXISTS idx_motoristas_tipo ON motoristas(tipo)");
        echo "✅ Índices criados\n";
    } catch (Exception $e) {
        echo "⚠️  Aviso ao criar índices: " . $e->getMessage() . "\n";
    }
    
    // 6. Testar inserção
    echo "\n🧪 Testando inserção...\n";
    $stmt = $pdo->prepare("INSERT INTO solicitacoes_viagem (
        tecnico_id, veiculo_id, cliente, motivo, km_inicial,
        latitude_inicial, longitude_inicial, endereco_inicial,
        observacoes, prioridade, status
    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
    
    $result = $stmt->execute([
        '4', // tecnico_id
        6,   // veiculo_id
        'Cliente Teste Final',
        'Motivo Teste Final',
        100, // km_inicial
        -10.9265, // latitude_inicial
        -37.0722, // longitude_inicial
        'Endereço Teste Final',
        'Observação teste final',
        'normal', // prioridade
        'pendente' // status
    ]);
    
    if ($result) {
        $id = $pdo->lastInsertId();
        echo "✅ Inserção de teste realizada com sucesso! ID: $id\n";
        
        // Limpar teste
        $pdo->exec("DELETE FROM solicitacoes_viagem WHERE id = $id");
        echo "🧹 Registro de teste removido\n";
        
        echo "\n🎉 Correção do erro 500 concluída com sucesso!\n";
        echo "✅ A API de solicitações deve funcionar agora.\n";
    } else {
        echo "❌ Erro na inserção de teste\n";
        print_r($stmt->errorInfo());
    }
    
} catch (Exception $e) {
    echo "❌ ERRO: " . $e->getMessage() . "\n";
    echo "📋 Stack trace:\n" . $e->getTraceAsString() . "\n";
}
?> 
