<?php
declare(strict_types=1);

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

const PASSAGEIRO_ENDERECOS_RECENTES_LIMITE = 5;

$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$data = $method === 'POST' ? input_json() : $_GET;
$idPassageiro = (int) ($data['id_passageiro'] ?? $data['id_usuario'] ?? 0);

if ($idPassageiro <= 0) {
    json_fail('Passageiro nao informado.');
}

function recente_float_nullable(array $data, array $keys): ?float
{
    foreach ($keys as $key) {
        if (isset($data[$key]) && trim((string) $data[$key]) !== '') {
            return (float) str_replace(',', '.', (string) $data[$key]);
        }
    }

    return null;
}

function passageiro_recentes_listar(PDO $pdo, int $idPassageiro): array
{
    $stmt = $pdo->prepare(
        'SELECT id, endereco, latitude, longitude, tipo, usado_em
         FROM passageiro_enderecos_recentes
         WHERE id_passageiro = ?
         ORDER BY usado_em DESC, id DESC
         LIMIT ' . PASSAGEIRO_ENDERECOS_RECENTES_LIMITE
    );
    $stmt->execute([$idPassageiro]);

    $recentes = [];
    foreach ($stmt->fetchAll() as $row) {
        $row['id'] = (int) $row['id'];
        $row['latitude'] = $row['latitude'] === null ? null : (float) $row['latitude'];
        $row['longitude'] = $row['longitude'] === null ? null : (float) $row['longitude'];
        $recentes[] = $row;
    }

    return $recentes;
}

try {
    $pdo = db();

    if ($method !== 'POST') {
        json_ok(['enderecos' => passageiro_recentes_listar($pdo, $idPassageiro)]);
    }

    $endereco = trim((string) ($data['endereco'] ?? ''));
    if ($endereco === '' || mb_strlen($endereco) < 3) {
        json_ok(['enderecos' => passageiro_recentes_listar($pdo, $idPassageiro)]);
    }

    $tipo = strtolower(trim((string) ($data['tipo'] ?? 'destino')));
    if (!in_array($tipo, ['origem', 'destino'], true)) {
        $tipo = 'destino';
    }

    $latitude = recente_float_nullable($data, ['latitude', 'lat']);
    $longitude = recente_float_nullable($data, ['longitude', 'lng']);

    $existente = $pdo->prepare(
        'SELECT id
         FROM passageiro_enderecos_recentes
         WHERE id_passageiro = ?
           AND endereco = ?
         LIMIT 1'
    );
    $existente->execute([$idPassageiro, $endereco]);
    $id = $existente->fetchColumn();

    if ($id) {
        $stmt = $pdo->prepare(
            'UPDATE passageiro_enderecos_recentes
             SET latitude = ?, longitude = ?, tipo = ?, usado_em = NOW()
             WHERE id = ?'
        );
        $stmt->execute([$latitude, $longitude, $tipo, (int) $id]);
    } else {
        $stmt = $pdo->prepare(
            'INSERT INTO passageiro_enderecos_recentes
              (id_passageiro, endereco, latitude, longitude, tipo, usado_em)
             VALUES (?, ?, ?, ?, ?, NOW())'
        );
        $stmt->execute([$idPassageiro, $endereco, $latitude, $longitude, $tipo]);
    }

    $idsStmt = $pdo->prepare(
        'SELECT id
         FROM passageiro_enderecos_recentes
         WHERE id_passageiro = ?
         ORDER BY usado_em DESC, id DESC
         LIMIT 999 OFFSET ' . PASSAGEIRO_ENDERECOS_RECENTES_LIMITE
    );
    $idsStmt->execute([$idPassageiro]);
    $ids = array_map('intval', $idsStmt->fetchAll(PDO::FETCH_COLUMN));
    if ($ids) {
        $placeholders = implode(',', array_fill(0, count($ids), '?'));
        $limpar = $pdo->prepare(
            'DELETE FROM passageiro_enderecos_recentes
             WHERE id_passageiro = ?
               AND id IN (' . $placeholders . ')'
        );
        $limpar->execute(array_merge([$idPassageiro], $ids));
    }

    json_ok(['enderecos' => passageiro_recentes_listar($pdo, $idPassageiro)]);
} catch (Throwable $e) {
    json_fail('Erro ao processar enderecos recentes.', 500, ['error' => $e->getMessage()]);
}
