<?php
/**
 * 🚗 API COMPLETA PARA FINALIZAR VIAGEM COM CONFERÊNCIA
 * 
 * Esta API vai:
 * 1. Receber odômetro inicial e final
 * 2. Receber estimativas de KM
 * 3. Calcular KM GPS real
 * 4. Fazer conferência automática
 * 5. Retornar relatório completo
 */

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

// Conectar ao banco
$pdo = new PDO(
    "mysql:host=localhost;dbname=pinheir3_controle_frotasV1.1;charset=utf8mb4",
    "pinheir3_admin",
    "080880Gelboy"
);

// Função Haversine para calcular distância GPS
function haversine($lat1, $lon1, $lat2, $lon2) {
    $R = 6371.0; // Raio da Terra em km
    $dLat = deg2rad($lat2 - $lat1);
    $dLon = deg2rad($lon2 - $lon1);
    $lat1 = deg2rad($lat1);
    $lat2 = deg2rad($lat2);
    
    $a = sin($dLat/2) * sin($dLat/2) + cos($lat1) * cos($lat2) * sin($dLon/2) * sin($dLon/2);
    $c = 2 * atan2(sqrt($a), sqrt(1-$a));
    return $R * $c;
}

// Função para calcular KM GPS real
function calcularKmGpsReal($pdo, $viagem_id) {
    $sql = "SELECT latitude, longitude, timestamp 
            FROM rastreamento_tempo_real 
            WHERE viagem_id = ? 
            ORDER BY timestamp ASC";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$viagem_id]);
    $pontos = $stmt->fetchAll();
    
    if (count($pontos) <= 1) {
        return 0;
    }
    
    $distanciaTotal = 0;
    for ($i = 0; $i < count($pontos) - 1; $i++) {
        $lat1 = $pontos[$i]['latitude'];
        $lon1 = $pontos[$i]['longitude'];
        $lat2 = $pontos[$i + 1]['latitude'];
        $lon2 = $pontos[$i + 1]['longitude'];
        
        $distancia = haversine($lat1, $lon1, $lat2, $lon2);
        $distanciaTotal += $distancia;
    }
    
    return $distanciaTotal;
}

// Função para calcular status de conferência
function calcularStatusConferencia($kmOdometro, $kmGpsReal, $kmEstimativaViagem) {
    $diferencaOdometroGps = abs($kmOdometro - $kmGpsReal);
    $diferencaEstimativaReal = abs($kmEstimativaViagem - $kmGpsReal);
    
    if ($diferencaOdometroGps <= 2) {
        return 'aprovada';
    } elseif ($diferencaOdometroGps <= 5) {
        return 'divergente_pequena';
    } else {
        return 'divergente_grande';
    }
}

// Função para resposta de erro
function enviarErro($mensagem, $codigo = 400) {
    http_response_code($codigo);
    echo json_encode([
        'success' => false,
        'message' => $mensagem,
        'timestamp' => date('Y-m-d H:i:s')
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

// Função para resposta de sucesso
function enviarSucesso($dados) {
    http_response_code(200);
    echo json_encode([
        'success' => true,
        'message' => 'Viagem finalizada com sucesso',
        'timestamp' => date('Y-m-d H:i:s'),
        'data' => $dados
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

try {
    // Verificar se é POST
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        enviarErro('Método não permitido. Use POST.', 405);
    }
    
    // Ler dados JSON
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input) {
        enviarErro('Dados JSON inválidos');
    }
    
    // Validar campos obrigatórios
    $campos_obrigatorios = ['viagem_id', 'km_final'];
    foreach ($campos_obrigatorios as $campo) {
        if (!isset($input[$campo]) || empty($input[$campo])) {
            enviarErro("Campo obrigatório ausente: $campo");
        }
    }
    
    $viagem_id = intval($input['viagem_id']);
    $km_final = intval($input['km_final']);
    
    // Campos opcionais
    $odometro_inicial = isset($input['odometro_inicial']) ? floatval($input['odometro_inicial']) : null;
    $odometro_final = isset($input['odometro_final']) ? floatval($input['odometro_final']) : null;
    $km_estimativa_viagem = isset($input['km_estimativa_viagem']) ? floatval($input['km_estimativa_viagem']) : null;
    $km_estimativa_clientes = isset($input['km_estimativa_clientes']) ? floatval($input['km_estimativa_clientes']) : null;
    $observacoes = isset($input['observacoes']) ? trim($input['observacoes']) : null;
    
    // Verificar se a viagem existe
    $sql = "SELECT id, cliente, km_inicial, data_inicio, data_fim 
            FROM viagens 
            WHERE id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$viagem_id]);
    $viagem = $stmt->fetch();
    
    if (!$viagem) {
        enviarErro("Viagem #$viagem_id não encontrada", 404);
    }
    
    if ($viagem['data_fim']) {
        enviarErro("Viagem #$viagem_id já foi finalizada", 400);
    }
    
    // Calcular KM GPS real
    $km_gps_real = calcularKmGpsReal($pdo, $viagem_id);
    
    // Calcular diferenças
    $km_odometro = null;
    $diferenca_odometro_gps = null;
    $diferenca_estimativa_real = null;
    $status_conferencia = 'pendente';
    $observacoes_conferencia = 'Aguardando dados completos';
    
    if ($odometro_inicial && $odometro_final) {
        $km_odometro = $odometro_final - $odometro_inicial;
        $diferenca_odometro_gps = $km_odometro - $km_gps_real;
        $status_conferencia = calcularStatusConferencia($km_odometro, $km_gps_real, $km_estimativa_viagem);
        
        $observacoes_conferencia = "Odômetro: " . number_format($km_odometro, 2) . " km | GPS: " . number_format($km_gps_real, 2) . " km | Diferença: " . number_format(abs($diferenca_odometro_gps), 2) . " km";
    }
    
    if ($km_estimativa_viagem && $km_gps_real) {
        $diferenca_estimativa_real = $km_estimativa_viagem - $km_gps_real;
    }
    
    // Atualizar viagem
    $sql = "UPDATE viagens SET 
            km_final = ?,
            odometro_inicial = ?,
            odometro_final = ?,
            km_estimativa_viagem = ?,
            km_estimativa_clientes = ?,
            km_gps_real = ?,
            diferenca_odometro_gps = ?,
            diferenca_estimativa_real = ?,
            status_conferencia = ?,
            observacoes_conferencia = ?,
            observacoes = ?,
            data_fim = NOW(),
            updated_at = NOW()
            WHERE id = ?";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        $km_final,
        $odometro_inicial,
        $odometro_final,
        $km_estimativa_viagem,
        $km_estimativa_clientes,
        $km_gps_real,
        $diferenca_odometro_gps,
        $diferenca_estimativa_real,
        $status_conferencia,
        $observacoes_conferencia,
        $observacoes,
        $viagem_id
    ]);
    
    // Buscar dados atualizados
    $sql = "SELECT 
                id, cliente, km_inicial, km_final,
                odometro_inicial, odometro_final,
                (odometro_final - odometro_inicial) as km_odometro,
                km_estimativa_viagem, km_estimativa_clientes,
                km_gps_real, km_gps_final,
                diferenca_odometro_gps, diferenca_estimativa_real,
                status_conferencia, observacoes_conferencia,
                data_inicio, data_fim
            FROM viagens 
            WHERE id = ?";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$viagem_id]);
    $viagem_atualizada = $stmt->fetch();
    
    // Preparar resposta
    $resposta = [
        'viagem_id' => $viagem_id,
        'cliente' => $viagem_atualizada['cliente'],
        'km_inicial' => $viagem_atualizada['km_inicial'],
        'km_final' => $viagem_atualizada['km_final'],
        'km_manual' => $viagem_atualizada['km_final'] - $viagem_atualizada['km_inicial'],
        'odometro' => [
            'inicial' => $viagem_atualizada['odometro_inicial'],
            'final' => $viagem_atualizada['odometro_final'],
            'total' => $viagem_atualizada['km_odometro']
        ],
        'estimativas' => [
            'viagem' => $viagem_atualizada['km_estimativa_viagem'],
            'clientes' => $viagem_atualizada['km_estimativa_clientes']
        ],
        'gps' => [
            'real' => $viagem_atualizada['km_gps_real'],
            'final' => $viagem_atualizada['km_gps_final']
        ],
        'conferencia' => [
            'status' => $viagem_atualizada['status_conferencia'],
            'diferenca_odometro_gps' => $viagem_atualizada['diferenca_odometro_gps'],
            'diferenca_estimativa_real' => $viagem_atualizada['diferenca_estimativa_real'],
            'observacoes' => $viagem_atualizada['observacoes_conferencia']
        ],
        'tempo' => [
            'inicio' => $viagem_atualizada['data_inicio'],
            'fim' => $viagem_atualizada['data_fim']
        ]
    ];
    
    enviarSucesso($resposta);
    
} catch (Exception $e) {
    error_log("Erro na API de finalização: " . $e->getMessage());
    enviarErro('Erro interno do servidor: ' . $e->getMessage(), 500);
}
?>
