<?php
declare(strict_types=1);

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

$data = input_json();
$idMotorista = (int) ($data['id_motorista'] ?? ($_GET['id_motorista'] ?? 0));
$semanaOffset = (int) ($data['semana_offset'] ?? ($_GET['semana_offset'] ?? 0));

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

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

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

    $hoje = new DateTimeImmutable('today');
    $inicioSemana = $hoje
        ->modify('-' . ((int) $hoje->format('N') - 1) . ' days')
        ->modify(($semanaOffset >= 0 ? '+' : '') . $semanaOffset . ' weeks');
    $fimSemana = $inicioSemana->modify('+6 days');
    $fimExclusivo = $inicioSemana->modify('+7 days');

    $dias = [];
    $diasChaves = [];
    $nomes = ['Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab', 'Dom'];

    for ($i = 0; $i < 7; $i++) {
        $dataDia = $inicioSemana->modify('+' . $i . ' days');
        $chave = $dataDia->format('Y-m-d');
        $diasChaves[] = $chave;
        $dias[$chave] = [
            'data' => $chave,
            'rotulo' => $nomes[$i],
            'ganhos' => 0.0,
            'corridas' => 0,
            'horas_online' => 0.0,
            'segundos_online' => 0,
        ];
    }

    $ganhosStmt = $pdo->prepare(
        'SELECT data_ref, total_corridas, total_valor
         FROM ganhos_diarios
         WHERE id_motorista = ?
           AND data_ref BETWEEN ? AND ?'
    );
    $ganhosStmt->execute([
        $idMotorista,
        $inicioSemana->format('Y-m-d'),
        $fimSemana->format('Y-m-d'),
    ]);

    foreach ($ganhosStmt->fetchAll() as $linha) {
        $dataRef = (string) $linha['data_ref'];
        if (!isset($dias[$dataRef])) {
            continue;
        }
        $dias[$dataRef]['ganhos'] = ganhos_money((float) $linha['total_valor']);
        $dias[$dataRef]['corridas'] = (int) $linha['total_corridas'];
    }

    $sessoesStmt = $pdo->prepare(
        'SELECT inicio_em, COALESCE(fim_em, NOW()) AS fim_em
         FROM motorista_sessoes_online
         WHERE id_motorista = ?
           AND inicio_em < ?
           AND COALESCE(fim_em, NOW()) > ?'
    );
    $sessoesStmt->execute([
        $idMotorista,
        $fimExclusivo->format('Y-m-d H:i:s'),
        $inicioSemana->format('Y-m-d H:i:s'),
    ]);

    $inicioSemanaTs = $inicioSemana->getTimestamp();
    $fimExclusivoTs = $fimExclusivo->getTimestamp();

    foreach ($sessoesStmt->fetchAll() as $sessao) {
        $inicio = new DateTimeImmutable((string) $sessao['inicio_em']);
        $fim = new DateTimeImmutable((string) $sessao['fim_em']);

        $inicioTs = max($inicio->getTimestamp(), $inicioSemanaTs);
        $fimTs = min($fim->getTimestamp(), $fimExclusivoTs);
        if ($fimTs <= $inicioTs) {
            continue;
        }

        for ($i = 0; $i < 7; $i++) {
            $dia = $inicioSemana->modify('+' . $i . ' days');
            $diaInicioTs = $dia->getTimestamp();
            $diaFimTs = $dia->modify('+1 day')->getTimestamp();
            $sobreposicao = max(0, min($fimTs, $diaFimTs) - max($inicioTs, $diaInicioTs));
            if ($sobreposicao <= 0) {
                continue;
            }
            $chave = $dia->format('Y-m-d');
            $dias[$chave]['segundos_online'] += $sobreposicao;
        }
    }

    $totalGanhos = 0.0;
    $totalCorridas = 0;
    $totalSegundos = 0;
    $maiorGanhoDia = 0.0;
    $maiorHorasDia = 0.0;

    foreach ($diasChaves as $chave) {
        $dias[$chave]['horas_online'] = round($dias[$chave]['segundos_online'] / 3600, 2);
        $totalGanhos += (float) $dias[$chave]['ganhos'];
        $totalCorridas += (int) $dias[$chave]['corridas'];
        $totalSegundos += (int) $dias[$chave]['segundos_online'];
        $maiorGanhoDia = max($maiorGanhoDia, (float) $dias[$chave]['ganhos']);
        $maiorHorasDia = max($maiorHorasDia, (float) $dias[$chave]['horas_online']);
    }

    $totalHoras = round($totalSegundos / 3600, 2);

    json_ok([
        'tipo_convertido_motorista' => $promocao['foi_promovido'],
        'indicador_removido' => $promocao['indicador_removido'],
        'semana' => [
            'offset' => $semanaOffset,
            'inicio' => $inicioSemana->format('Y-m-d'),
            'fim' => $fimSemana->format('Y-m-d'),
            'rotulo' => $inicioSemana->format('d/m') . ' - ' . $fimSemana->format('d/m'),
            'eh_semana_atual' => $semanaOffset === 0,
        ],
        'resumo' => [
            'total_ganhos' => ganhos_money($totalGanhos),
            'total_corridas' => $totalCorridas,
            'total_horas_online' => $totalHoras,
            'media_por_corrida' => $totalCorridas > 0 ? ganhos_money($totalGanhos / $totalCorridas) : 0.0,
            'ganho_por_hora' => $totalHoras > 0 ? ganhos_money($totalGanhos / $totalHoras) : 0.0,
            'maior_ganho_dia' => ganhos_money($maiorGanhoDia),
            'maior_horas_dia' => round($maiorHorasDia, 2),
        ],
        'dias' => array_values($dias),
    ]);
} catch (Throwable $e) {
    json_fail('Erro ao carregar ganhos semanais.', 500, ['error' => $e->getMessage()]);
}
