<?php
declare(strict_types=1);

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

$data = input_json();
$idMotorista = isset($_GET['id_motorista']) ? (int) $_GET['id_motorista'] : 0;
if ($idMotorista <= 0) {
    $idMotorista = (int) ($data['id_motorista'] ?? 0);
}
$visao = (string) ($_GET['visao'] ?? $data['visao'] ?? '');
$idVisualizador = isset($_GET['id_visualizador']) ? (int) $_GET['id_visualizador'] : 0;
if ($idVisualizador <= 0) {
    $idVisualizador = (int) ($data['id_visualizador'] ?? 0);
}

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

function perfil_tempo_cadastro_texto(?string $criadoEm): array
{
    if ($criadoEm === null || trim($criadoEm) === '') {
        return ['anos' => 0, 'texto' => 'Cadastro recente'];
    }

    try {
        $criado = new DateTimeImmutable($criadoEm);
        $agora = new DateTimeImmutable('now');
        $diff = $criado->diff($agora);

        if ($diff->y > 0) {
            return [
                'anos' => $diff->y,
                'texto' => $diff->y === 1 ? '1 ano' : $diff->y . ' anos',
            ];
        }

        if ($diff->m > 0) {
            return [
                'anos' => 0,
                'texto' => $diff->m === 1 ? '1 mes' : $diff->m . ' meses',
            ];
        }

        return [
            'anos' => 0,
            'texto' => $diff->d <= 1 ? '1 dia' : $diff->d . ' dias',
        ];
    } catch (Throwable $e) {
        return ['anos' => 0, 'texto' => 'Cadastro recente'];
    }
}

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

    $stmt = $pdo->prepare(
        'SELECT id, nome, tipo, endereco_cidade, endereco_uf,
                COALESCE(NULLIF(foto_url, ""), selfie_url) AS foto_url,
                criado_em
         FROM usuarios
         WHERE id = ?
         LIMIT 1'
    );
    $stmt->execute([$idMotorista]);
    $motorista = $stmt->fetch();

    if (!$motorista || (string) $motorista['tipo'] !== 'motorista') {
        json_fail('Motorista nao encontrado.', 404);
    }

    $ratingStmt = $pdo->prepare(
        'SELECT ROUND(AVG(avaliacao_motorista), 2) AS media, COUNT(*) AS total
         FROM (
            SELECT avaliacao_motorista
            FROM corridas
            WHERE id_motorista = ?
              AND status = "finalizada"
              AND avaliacao_motorista IS NOT NULL
            ORDER BY atualizada_em DESC
            LIMIT 100
         ) ultimas'
    );
    $ratingStmt->execute([$idMotorista]);
    $rating = $ratingStmt->fetch() ?: ['media' => null, 'total' => 0];

    $statsStmt = $pdo->prepare(
        'SELECT COUNT(*) AS total_viagens,
                SUM(CASE WHEN avaliacao_motorista = 5 THEN 1 ELSE 0 END) AS viagens_5_estrelas
         FROM corridas
         WHERE id_motorista = ?
           AND status = "finalizada"'
    );
    $statsStmt->execute([$idMotorista]);
    $stats = $statsStmt->fetch() ?: ['total_viagens' => 0, 'viagens_5_estrelas' => 0];

    $elogios = [
        'bom_condutor' => 0,
        'simpatico' => 0,
        'veiculo_limpo' => 0,
        'boa_rota' => 0,
        'boa_conversa' => 0,
    ];

    $elogiosStmt = $pdo->prepare(
        'SELECT selo, COUNT(*) AS total
         FROM motorista_elogios
         WHERE id_motorista = ?
         GROUP BY selo'
    );
    $elogiosStmt->execute([$idMotorista]);
    foreach ($elogiosStmt->fetchAll() as $row) {
        $selo = (string) ($row['selo'] ?? '');
        if (array_key_exists($selo, $elogios)) {
            $elogios[$selo] = (int) ($row['total'] ?? 0);
        }
    }

    $comentariosStmt = $pdo->prepare(
        'SELECT id AS id_corrida,
                avaliacao_comentario AS comentario,
                COALESCE(avaliado_em, finalizada_em, atualizada_em) AS criado_em
         FROM corridas
         WHERE id_motorista = ?
           AND status = "finalizada"
           AND avaliacao_motorista = 5
           AND avaliacao_comentario IS NOT NULL
           AND TRIM(avaliacao_comentario) <> ""
         ORDER BY COALESCE(avaliado_em, finalizada_em, atualizada_em) DESC
         LIMIT 20'
    );
    $comentariosStmt->execute([$idMotorista]);
    $comentarios = [];
    foreach ($comentariosStmt->fetchAll() as $row) {
        $comentarios[] = [
            'id_corrida' => (int) $row['id_corrida'],
            'comentario' => (string) $row['comentario'],
            'criado_em' => $row['criado_em'],
        ];
    }

    $reclamacoes = [];
    $podeVerReclamacoes = $visao === 'motorista' && $idVisualizador === $idMotorista;
    if ($podeVerReclamacoes) {
        $reclamacoesStmt = $pdo->prepare(
            'SELECT id, id_corrida, comentario, criado_em
             FROM usuario_feedbacks
             WHERE id_usuario = ?
               AND tipo = "reclamacao"
               AND criado_em >= DATE_SUB(NOW(), INTERVAL 7 DAY)
             ORDER BY criado_em DESC, id DESC
             LIMIT 20'
        );
        $reclamacoesStmt->execute([$idMotorista]);
        foreach ($reclamacoesStmt->fetchAll() as $row) {
            $reclamacoes[] = [
                'id' => (int) $row['id'],
                'id_corrida' => $row['id_corrida'] === null ? null : (int) $row['id_corrida'],
                'comentario' => (string) $row['comentario'],
                'criado_em' => $row['criado_em'],
            ];
        }
    }

    $tempo = perfil_tempo_cadastro_texto($motorista['criado_em'] ?? null);

    $perfil = [
        'id' => (int) $motorista['id'],
        'nome' => $motorista['nome'],
        'foto_url' => $motorista['foto_url'] ?? null,
        'cidade' => $motorista['endereco_cidade'] ?? null,
        'uf' => $motorista['endereco_uf'] ?? null,
        'nota_media' => $rating['media'] !== null ? (float) $rating['media'] : 0.0,
        'total_avaliacoes' => (int) ($rating['total'] ?? 0),
        'total_viagens' => (int) ($stats['total_viagens'] ?? 0),
        'viagens_5_estrelas' => (int) ($stats['viagens_5_estrelas'] ?? 0),
        'anos_app' => (int) $tempo['anos'],
        'tempo_cadastro_texto' => $tempo['texto'],
        'elogios' => $elogios,
        'comentarios' => $comentarios,
    ];

    if ($podeVerReclamacoes) {
        $perfil['reclamacoes'] = $reclamacoes;
    }

    json_ok(['perfil' => $perfil]);
} catch (Throwable $e) {
    json_fail('Erro ao carregar perfil do motorista.', 500, ['error' => $e->getMessage()]);
}
