<?php
declare(strict_types=1);

require_once __DIR__ . '/_bootstrap.php';

header('Content-Type: application/json; charset=utf-8');

if (!admin_is_logged()) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Login administrativo necessario.'], JSON_UNESCAPED_UNICODE);
    exit;
}

try {
    $pdo = db();

    $motoristasStmt = $pdo->query(
        'SELECT
            u.id,
            u.nome,
            COALESCE(NULLIF(u.primeiro_nome, ""), u.nome) AS nome_curto,
            u.email,
            u.celular,
            u.foto_url,
            u.ultimo_lat,
            u.ultimo_lng,
            u.ultimo_rumo,
            u.localizacao_atualizada_em,
            TIMESTAMPDIFF(SECOND, u.localizacao_atualizada_em, NOW()) AS localizacao_idade_segundos,
            COALESCE(av.nota_media, 0) AS nota_media,
            COALESCE(av.total_avaliacoes, 0) AS total_avaliacoes,
            COALESCE(rc.total_corridas, 0) AS total_corridas,
            v.marca AS veiculo_marca,
            v.modelo AS veiculo_modelo,
            v.ano_modelo AS veiculo_ano_modelo,
            v.cor AS veiculo_cor,
            v.placa AS veiculo_placa
         FROM usuarios u
         LEFT JOIN veiculos v ON v.id = u.id_veiculo_ativo
         LEFT JOIN (
            SELECT id_motorista, ROUND(AVG(avaliacao_motorista), 2) AS nota_media, COUNT(*) AS total_avaliacoes
            FROM corridas
            WHERE status = "finalizada" AND avaliacao_motorista IS NOT NULL
            GROUP BY id_motorista
         ) av ON av.id_motorista = u.id
         LEFT JOIN (
            SELECT id_motorista, COUNT(*) AS total_corridas
            FROM corridas
            WHERE status = "finalizada"
            GROUP BY id_motorista
         ) rc ON rc.id_motorista = u.id
         WHERE u.tipo = "motorista"
           AND u.disponivel = "sim"
           AND u.ultimo_lat IS NOT NULL
           AND u.ultimo_lng IS NOT NULL
         ORDER BY u.localizacao_atualizada_em DESC
         LIMIT 300'
    );
    $motoristas = [];
    foreach ($motoristasStmt->fetchAll() as $row) {
        $motoristas[] = [
            'id' => (int) $row['id'],
            'nome' => (string) $row['nome'],
            'nome_curto' => (string) $row['nome_curto'],
            'email' => $row['email'] ?? null,
            'celular' => $row['celular'] ?? null,
            'foto_url' => $row['foto_url'] ?? null,
            'lat' => (float) $row['ultimo_lat'],
            'lng' => (float) $row['ultimo_lng'],
            'rumo' => $row['ultimo_rumo'] === null ? 0.0 : (float) $row['ultimo_rumo'],
            'localizacao_atualizada_em' => $row['localizacao_atualizada_em'] ?? null,
            'localizacao_idade_segundos' => $row['localizacao_idade_segundos'] === null ? null : (int) $row['localizacao_idade_segundos'],
            'nota_media' => (float) $row['nota_media'],
            'total_avaliacoes' => (int) $row['total_avaliacoes'],
            'total_corridas' => (int) $row['total_corridas'],
            'veiculo' => [
                'marca' => $row['veiculo_marca'] ?? null,
                'modelo' => $row['veiculo_modelo'] ?? null,
                'ano_modelo' => $row['veiculo_ano_modelo'] === null ? null : (int) $row['veiculo_ano_modelo'],
                'cor' => $row['veiculo_cor'] ?? null,
                'placa' => $row['veiculo_placa'] ?? null,
            ],
        ];
    }

    $corridasStmt = $pdo->query(
        'SELECT
            c.id,
            c.id_passageiro,
            c.id_motorista,
            c.status,
            c.valor,
            c.forma_pagamento,
            c.distancia,
            c.tempo_estimado,
            c.origem_lat,
            c.origem_lng,
            c.destino_lat,
            c.destino_lng,
            c.criada_em,
            c.aceita_em,
            c.atualizada_em,
            p.nome AS passageiro_nome,
            p.celular AS passageiro_celular,
            m.nome AS motorista_nome,
            m.celular AS motorista_celular
         FROM corridas c
         INNER JOIN usuarios p ON p.id = c.id_passageiro
         LEFT JOIN usuarios m ON m.id = c.id_motorista
         WHERE c.status NOT IN ("finalizada", "cancelada")
         ORDER BY c.criada_em DESC
         LIMIT 120'
    );
    $corridas = [];
    foreach ($corridasStmt->fetchAll() as $row) {
        $corridas[] = [
            'id' => (int) $row['id'],
            'id_passageiro' => (int) $row['id_passageiro'],
            'id_motorista' => $row['id_motorista'] === null ? null : (int) $row['id_motorista'],
            'status' => (string) $row['status'],
            'valor' => $row['valor'] === null ? null : (float) $row['valor'],
            'forma_pagamento' => $row['forma_pagamento'] ?? null,
            'distancia' => $row['distancia'] === null ? null : (float) $row['distancia'],
            'tempo_estimado' => $row['tempo_estimado'] ?? null,
            'origem_lat' => $row['origem_lat'] === null ? null : (float) $row['origem_lat'],
            'origem_lng' => $row['origem_lng'] === null ? null : (float) $row['origem_lng'],
            'destino_lat' => $row['destino_lat'] === null ? null : (float) $row['destino_lat'],
            'destino_lng' => $row['destino_lng'] === null ? null : (float) $row['destino_lng'],
            'criada_em' => $row['criada_em'] ?? null,
            'aceita_em' => $row['aceita_em'] ?? null,
            'atualizada_em' => $row['atualizada_em'] ?? null,
            'passageiro_nome' => $row['passageiro_nome'] ?? null,
            'passageiro_celular' => $row['passageiro_celular'] ?? null,
            'motorista_nome' => $row['motorista_nome'] ?? null,
            'motorista_celular' => $row['motorista_celular'] ?? null,
        ];
    }

    $center = ['lat' => -31.7669, 'lng' => -52.3420, 'zoom' => 13];
    if ($motoristas) {
        $latTotal = 0.0;
        $lngTotal = 0.0;
        foreach ($motoristas as $motorista) {
            $latTotal += (float) $motorista['lat'];
            $lngTotal += (float) $motorista['lng'];
        }
        $center = [
            'lat' => round($latTotal / count($motoristas), 7),
            'lng' => round($lngTotal / count($motoristas), 7),
            'zoom' => 13,
        ];
    } else {
        foreach ($corridas as $corrida) {
            if ($corrida['origem_lat'] !== null && $corrida['origem_lng'] !== null) {
                $center = ['lat' => $corrida['origem_lat'], 'lng' => $corrida['origem_lng'], 'zoom' => 13];
                break;
            }
        }
    }

    $incluirDinamicas = ($_GET['incluir_dinamicas'] ?? '1') !== '0';
    $dinamicas = $incluirDinamicas ? tarifas_dinamicas_ativas($pdo) : null;

    echo json_encode([
        'success' => true,
        'atualizado_em' => date('Y-m-d H:i:s'),
        'map_center' => $center,
        'motoristas' => $motoristas,
        'corridas' => $corridas,
        'dinamicas' => $dinamicas,
        'dinamicas_atualizadas' => $incluirDinamicas,
    ], JSON_UNESCAPED_UNICODE);
} catch (Throwable $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'Erro ao carregar dados em tempo real.',
        'error' => $e->getMessage(),
    ], JSON_UNESCAPED_UNICODE);
}
