<?php
declare(strict_types=1);

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

$data = input_json();
require_fields($data, ['id_corrida', 'id_motorista', 'lat', 'lng']);

$idCorrida = (int) $data['id_corrida'];
$idMotorista = (int) $data['id_motorista'];
$lat = payload_float($data, ['lat', 'latitude']);
$lng = payload_float($data, ['lng', 'longitude']);
$rumo = payload_float($data, ['rumo', 'heading']);
$velocidade = payload_float($data, ['velocidade', 'speed']);
$precisao = payload_float($data, ['precisao', 'accuracy']);
$registradoEmRaw = trim((string) ($data['registrado_em'] ?? ''));
$registradoEmTs = $registradoEmRaw === '' ? time() : strtotime($registradoEmRaw);
$registradoEm = date('Y-m-d H:i:s', $registradoEmTs === false ? time() : $registradoEmTs);

if ($idCorrida <= 0 || $idMotorista <= 0 || $lat === null || $lng === null) {
    json_fail('Dados invalidos para registrar rota.');
}

if ($lat < -90 || $lat > 90 || $lng < -180 || $lng > 180) {
    json_fail('Coordenadas invalidas.');
}

try {
    $pdo = db();

    if (!corrida_table_exists($pdo, 'corrida_pontos_rota')) {
        json_fail('Tabela de pontos da rota ainda nao existe. Rode a atualizacao do banco.', 500);
    }

    $stmt = $pdo->prepare(
        'SELECT id, id_motorista, status
         FROM corridas
         WHERE id = ?
         LIMIT 1'
    );
    $stmt->execute([$idCorrida]);
    $corrida = $stmt->fetch();

    if (!$corrida) {
        json_fail('Corrida nao encontrada.', 404);
    }

    if ((int) ($corrida['id_motorista'] ?? 0) !== $idMotorista) {
        json_fail('Essa corrida nao pertence a este motorista.', 403);
    }

    if ((string) ($corrida['status'] ?? '') !== 'em_andamento') {
        json_fail('A rota real so pode ser registrada durante a viagem.', 409);
    }

    $ins = $pdo->prepare(
        'INSERT INTO corrida_pontos_rota
            (id_corrida, id_motorista, lat, lng, rumo, velocidade, precisao, registrado_em)
         VALUES (?, ?, ?, ?, ?, ?, ?, ?)'
    );
    $ins->execute([
        $idCorrida,
        $idMotorista,
        $lat,
        $lng,
        $rumo,
        $velocidade,
        $precisao,
        $registradoEm,
    ]);

    json_ok(['id_ponto' => (int) $pdo->lastInsertId()]);
} catch (Throwable $e) {
    json_fail('Erro ao registrar ponto da rota.', 500, ['error' => $e->getMessage()]);
}
