<?php
declare(strict_types=1);

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

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

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

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

    $stmt = $pdo->prepare(
        'SELECT id, nome, tipo, cnh_status, cnh_observacao, cnh_vencimento, cnh_aprovado_por, cnh_aprovado_em, documento_veiculo_status, documento_veiculo_observacao, documento_veiculo_vencimento, documento_veiculo_aprovado_por, documento_veiculo_aprovado_em, selfie_status, selfie_observacao, selfie_aprovado_por, selfie_aprovado_em, status_verificacao, observacao_verificacao, disponivel, COALESCE(NULLIF(foto_url, ""), selfie_url) AS foto_url, id_veiculo_ativo
         FROM usuarios WHERE id = ? LIMIT 1'
    );
    $stmt->execute([$idMotorista]);
    $user = $stmt->fetch();

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

    motorista_atualizar_localizacao($idMotorista, $data + $_GET);

    $ratingStmt = db()->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];
    $veiculoStmt = db()->prepare(
        'SELECT COUNT(*) AS total, SUM(CASE WHEN status = "aprovado" THEN 1 ELSE 0 END) AS aprovados
         FROM veiculos
         WHERE id_motorista = ?'
    );
    $veiculoStmt->execute([$idMotorista]);
    $veiculos = $veiculoStmt->fetch() ?: ['total' => 0, 'aprovados' => 0];

    $ganhosStmt = db()->prepare(
        'SELECT COALESCE(total_corridas, 0) AS total_corridas, COALESCE(total_valor, 0) AS total_valor
         FROM ganhos_diarios
         WHERE id_motorista = ? AND data_ref = CURDATE()
         LIMIT 1'
    );
    $ganhosStmt->execute([$idMotorista]);
    $ganhosHoje = $ganhosStmt->fetch() ?: ['total_corridas' => 0, 'total_valor' => 0];
    $metricasCorridas = motorista_metricas_corridas_recalcular($pdo, $idMotorista);

    $veiculoAtivo = null;
    if (!empty($user['id_veiculo_ativo'])) {
        $veiculoAtivoStmt = db()->prepare(
            'SELECT id, marca, modelo, ano_fabricacao, ano_modelo, cor, placa, documento_url, status
             FROM veiculos
             WHERE id = ? AND id_motorista = ?
             LIMIT 1'
        );
        $veiculoAtivoStmt->execute([(int) $user['id_veiculo_ativo'], $idMotorista]);
        $veiculoAtivo = $veiculoAtivoStmt->fetch() ?: null;

        if ($veiculoAtivo !== null) {
            $veiculoAtivo['id'] = (int) $veiculoAtivo['id'];
            $veiculoAtivo['ano_fabricacao'] = $veiculoAtivo['ano_fabricacao'] === null ? null : (int) $veiculoAtivo['ano_fabricacao'];
            $veiculoAtivo['ano_modelo'] = $veiculoAtivo['ano_modelo'] === null ? null : (int) $veiculoAtivo['ano_modelo'];
        }
    }

    $user['total_veiculos'] = (int) ($veiculos['total'] ?? 0);
    $user['veiculos_aprovados'] = (int) ($veiculos['aprovados'] ?? 0);
    $user['veiculos_reprovados'] = (int) ($veiculos['total'] ?? 0) - (int) ($veiculos['aprovados'] ?? 0);
    $statusGeral = motorista_status_operacional($user, (int) ($veiculos['aprovados'] ?? 0) > 0);
    $documentoVeiculoStatus = motorista_status_documento_real($user);
    $podeFicarOnline = motorista_documentos_aprovados($user) && (int) ($veiculos['aprovados'] ?? 0) > 0;

    json_ok([
        'tipo_convertido_motorista' => $promocao['foi_promovido'],
        'indicador_removido' => $promocao['indicador_removido'],
        'motorista' => [
            'id' => (int) $user['id'],
            'nome' => $user['nome'],
            'status_verificacao' => $statusGeral,
            'status_operacional' => $statusGeral,
            'observacao_verificacao' => $user['observacao_verificacao'],
            'disponivel' => $user['disponivel'] ?? 'nao',
            'pode_ficar_online' => $podeFicarOnline,
            'foto_url' => $user['foto_url'] ?? null,
            'cnh_status' => $user['cnh_status'] ?? 'pendente',
            'cnh_observacao' => $user['cnh_observacao'] ?? null,
            'cnh_vencimento' => $user['cnh_vencimento'] ?? null,
            'cnh_aprovado_por' => $user['cnh_aprovado_por'] ?? null,
            'cnh_aprovado_em' => $user['cnh_aprovado_em'] ?? null,
            'documento_veiculo_status' => $documentoVeiculoStatus,
            'documento_veiculo_observacao' => $user['documento_veiculo_observacao'] ?? null,
            'documento_veiculo_vencimento' => $user['documento_veiculo_vencimento'] ?? null,
            'documento_veiculo_aprovado_por' => $user['documento_veiculo_aprovado_por'] ?? null,
            'documento_veiculo_aprovado_em' => $user['documento_veiculo_aprovado_em'] ?? null,
            'selfie_status' => $user['selfie_status'] ?? 'pendente',
            'selfie_observacao' => $user['selfie_observacao'] ?? null,
            'selfie_aprovado_por' => $user['selfie_aprovado_por'] ?? null,
            'selfie_aprovado_em' => $user['selfie_aprovado_em'] ?? null,
            'documentos_aprovados' => motorista_documentos_aprovados($user),
            'tem_veiculo_aprovado' => (int) ($veiculos['aprovados'] ?? 0) > 0,
            'total_veiculos' => (int) ($veiculos['total'] ?? 0),
            'veiculos_aprovados' => (int) ($veiculos['aprovados'] ?? 0),
            'id_veiculo_ativo' => !empty($user['id_veiculo_ativo']) ? (int) $user['id_veiculo_ativo'] : null,
            'veiculo_ativo' => $veiculoAtivo,
            'nota_media' => $rating['media'] !== null ? (float) $rating['media'] : 0.0,
            'total_avaliacoes' => (int) ($rating['total'] ?? 0),
            'ganhos_hoje' => (float) ($ganhosHoje['total_valor'] ?? 0),
            'corridas_hoje' => (int) ($ganhosHoje['total_corridas'] ?? 0),
            'metricas_corridas' => $metricasCorridas,
        ],
    ]);
} catch (Throwable $e) {
    json_fail('Erro ao carregar status do motorista.', 500, ['error' => $e->getMessage()]);
}
