<?php
declare(strict_types=1);

require_once __DIR__ . '/../config/helpers.php';
require_once __DIR__ . '/../config/corrida_ofertas_helpers.php';

const GANHOS_PERCENTUAL_MOTORISTA = 0.85;

$data = input_json();
$idMotorista = (int) ($data['id_motorista'] ?? ($_GET['id_motorista'] ?? 0));
$dataRef = trim((string) ($data['data'] ?? ($_GET['data'] ?? '')));

if ($idMotorista <= 0) {
    json_fail('Motorista nao informado.');
}

if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataRef)) {
    json_fail('Data invalida.');
}

function ganhos_corrida_money(float $valor): float
{
    return round($valor, 2);
}

function ganhos_corrida_motorista(array $corrida): float
{
    $status = (string) ($corrida['status'] ?? '');
    if ($status === 'cancelada') {
        return ganhos_corrida_money((float) ($corrida['cancelamento_valor_motorista'] ?? 0));
    }

    $valor = (float) ($corrida['valor'] ?? 0);
    $saldoNegativo = (float) ($corrida['saldo_negativo_cobrado'] ?? 0);
    return ganhos_corrida_money(max(0.0, $valor - $saldoNegativo) * GANHOS_PERCENTUAL_MOTORISTA);
}

function ganhos_distancia_pontos_km(float $lat1, float $lng1, float $lat2, float $lng2): float
{
    $raio = 6371.0;
    $dLat = deg2rad($lat2 - $lat1);
    $dLng = deg2rad($lng2 - $lng1);
    $a = sin($dLat / 2) ** 2
        + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLng / 2) ** 2;
    return $raio * 2 * atan2(sqrt($a), sqrt(1 - $a));
}

function ganhos_distancia_rota_real(array $pontos): float
{
    $total = 0.0;
    $anterior = null;
    foreach ($pontos as $ponto) {
        if ($anterior !== null) {
            $total += ganhos_distancia_pontos_km(
                (float) $anterior['lat'],
                (float) $anterior['lng'],
                (float) $ponto['lat'],
                (float) $ponto['lng']
            );
        }
        $anterior = $ponto;
    }
    return round($total, 2);
}

try {
    $pdo = db();
    usuario_garantir_motorista($idMotorista, $pdo);

    $stmt = $pdo->prepare(
        'SELECT c.id,
                c.status,
                c.categoria_veiculo,
                c.forma_pagamento,
                c.forma_pagamento_detalhe,
                c.origem_lat,
                c.origem_lng,
                c.origem_endereco,
                c.destino_lat,
                c.destino_lng,
                c.destino_endereco,
                c.distancia,
                c.tempo_estimado,
                c.valor,
                c.saldo_negativo_cobrado,
                c.cancelamento_valor_motorista,
                c.criada_em,
                c.aceita_em,
                c.chegou_embarque_em,
                c.iniciou_viagem_em,
                c.finalizada_em,
                c.cancelada_em,
                TIMESTAMPDIFF(SECOND, c.iniciou_viagem_em, c.finalizada_em) AS duracao_segundos,
                p.nome AS passageiro_nome
         FROM corridas c
         LEFT JOIN usuarios p ON p.id = c.id_passageiro
         WHERE c.id_motorista = ?
           AND (
                (c.status = "finalizada" AND DATE(c.finalizada_em) = ?)
                OR (c.status = "cancelada" AND DATE(c.cancelada_em) = ?)
           )
         ORDER BY COALESCE(c.finalizada_em, c.cancelada_em, c.criada_em) DESC,
                  c.id DESC'
    );
    $stmt->execute([$idMotorista, $dataRef, $dataRef]);
    $rows = $stmt->fetchAll();

    $rotasPorCorrida = [];
    $idsCorridas = array_values(array_unique(array_map(
        static fn(array $row): int => (int) $row['id'],
        $rows
    )));

    if ($idsCorridas && corrida_table_exists($pdo, 'corrida_pontos_rota')) {
        $placeholders = implode(',', array_fill(0, count($idsCorridas), '?'));
        $rotasStmt = $pdo->prepare(
            'SELECT id_corrida, lat, lng, rumo, velocidade, precisao, registrado_em
             FROM corrida_pontos_rota
             WHERE id_corrida IN (' . $placeholders . ')
             ORDER BY id_corrida ASC, registrado_em ASC, id ASC'
        );
        $rotasStmt->execute($idsCorridas);
        foreach ($rotasStmt->fetchAll() as $ponto) {
            $idCorrida = (int) $ponto['id_corrida'];
            $rotasPorCorrida[$idCorrida][] = [
                'lat' => (float) $ponto['lat'],
                'lng' => (float) $ponto['lng'],
                'rumo' => $ponto['rumo'] === null ? null : (float) $ponto['rumo'],
                'velocidade' => $ponto['velocidade'] === null ? null : (float) $ponto['velocidade'],
                'precisao' => $ponto['precisao'] === null ? null : (float) $ponto['precisao'],
                'registrado_em' => $ponto['registrado_em'],
            ];
        }
    }

    $corridas = [];
    $totalMotorista = 0.0;
    $totalDistancia = 0.0;
    $totalDuracao = 0;
    $finalizadas = 0;

    foreach ($rows as $row) {
        $idCorrida = (int) $row['id'];
        $rotaPontos = $rotasPorCorrida[$idCorrida] ?? [];
        $distanciaRotaReal = ganhos_distancia_rota_real($rotaPontos);
        $valorMotorista = ganhos_corrida_motorista($row);
        $distancia = $row['distancia'] === null ? 0.0 : (float) $row['distancia'];
        $duracao = $row['duracao_segundos'] === null ? 0 : max(0, (int) $row['duracao_segundos']);

        if (($row['status'] ?? '') === 'finalizada') {
            $finalizadas++;
            $totalDistancia += $distanciaRotaReal > 0 ? $distanciaRotaReal : $distancia;
            $totalDuracao += $duracao;
        }

        $totalMotorista += $valorMotorista;
        $corridas[] = [
            'id' => $idCorrida,
            'status' => (string) $row['status'],
            'categoria_veiculo' => (string) ($row['categoria_veiculo'] ?? 'economica'),
            'forma_pagamento' => (string) ($row['forma_pagamento'] ?? ''),
            'forma_pagamento_detalhe' => (string) ($row['forma_pagamento_detalhe'] ?? ''),
            'passageiro_nome' => (string) ($row['passageiro_nome'] ?? ''),
            'origem_lat' => $row['origem_lat'] === null ? null : (float) $row['origem_lat'],
            'origem_lng' => $row['origem_lng'] === null ? null : (float) $row['origem_lng'],
            'origem_endereco' => (string) ($row['origem_endereco'] ?? ''),
            'destino_lat' => $row['destino_lat'] === null ? null : (float) $row['destino_lat'],
            'destino_lng' => $row['destino_lng'] === null ? null : (float) $row['destino_lng'],
            'destino_endereco' => (string) ($row['destino_endereco'] ?? ''),
            'distancia_km' => round($distancia, 2),
            'distancia_rota_real_km' => $distanciaRotaReal,
            'rota_pontos' => $rotaPontos,
            'tempo_estimado' => (string) ($row['tempo_estimado'] ?? ''),
            'duracao_segundos' => $duracao,
            'valor_total' => ganhos_corrida_money((float) ($row['valor'] ?? 0)),
            'valor_motorista' => $valorMotorista,
            'saldo_negativo_cobrado' => ganhos_corrida_money((float) ($row['saldo_negativo_cobrado'] ?? 0)),
            'criada_em' => $row['criada_em'],
            'aceita_em' => $row['aceita_em'],
            'chegou_embarque_em' => $row['chegou_embarque_em'],
            'iniciou_viagem_em' => $row['iniciou_viagem_em'],
            'finalizada_em' => $row['finalizada_em'],
            'cancelada_em' => $row['cancelada_em'],
            'data_evento' => $row['finalizada_em'] ?? $row['cancelada_em'] ?? $row['criada_em'],
        ];
    }

    json_ok([
        'data' => $dataRef,
        'resumo' => [
            'total_corridas' => count($corridas),
            'finalizadas' => $finalizadas,
            'total_motorista' => ganhos_corrida_money($totalMotorista),
            'total_distancia_km' => round($totalDistancia, 2),
            'total_duracao_segundos' => $totalDuracao,
        ],
        'corridas' => $corridas,
    ]);
} catch (Throwable $e) {
    json_fail('Erro ao carregar corridas do dia.', 500, ['error' => $e->getMessage()]);
}
