<?php
declare(strict_types=1);

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

const PASSAGEIRO_ENDERECOS_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 endereco_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 enderecos_passageiro_listar(PDO $pdo, int $idPassageiro): array
{
    $stmt = $pdo->prepare(
        'SELECT id, rotulo, endereco, latitude, longitude, ordem, criado_em, atualizado_em
         FROM passageiro_enderecos
         WHERE id_passageiro = ? AND ativo = 1
         ORDER BY ordem ASC, atualizado_em DESC, id DESC
         LIMIT ' . PASSAGEIRO_ENDERECOS_LIMITE
    );
    $stmt->execute([$idPassageiro]);

    $enderecos = [];
    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'];
        $row['ordem'] = (int) $row['ordem'];
        $enderecos[] = $row;
    }

    return $enderecos;
}

try {
    $pdo = db();
    $usuarioStmt = $pdo->prepare('SELECT id FROM usuarios WHERE id = ? LIMIT 1');
    $usuarioStmt->execute([$idPassageiro]);
    if (!$usuarioStmt->fetch()) {
        json_fail('Passageiro nao encontrado.', 404);
    }

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

    $acao = (string) ($data['acao'] ?? 'salvar');
    if ($acao === 'excluir') {
        $id = (int) ($data['id'] ?? 0);
        if ($id <= 0) {
            json_fail('Endereco nao informado.');
        }

        $stmt = $pdo->prepare('UPDATE passageiro_enderecos SET ativo = 0 WHERE id = ? AND id_passageiro = ?');
        $stmt->execute([$id, $idPassageiro]);

        json_ok([
            'message' => 'Endereco removido.',
            'enderecos' => enderecos_passageiro_listar($pdo, $idPassageiro),
        ]);
    }

    $id = (int) ($data['id'] ?? 0);
    $rotulo = trim((string) ($data['rotulo'] ?? ''));
    $endereco = trim((string) ($data['endereco'] ?? ''));
    $latitude = endereco_float_nullable($data, ['latitude', 'lat']);
    $longitude = endereco_float_nullable($data, ['longitude', 'lng']);
    $ordem = max(0, min(4, (int) ($data['ordem'] ?? 0)));

    if ($rotulo === '' || mb_strlen($rotulo) < 2) {
        json_fail('Informe um nome para o endereco.');
    }
    if ($endereco === '' || mb_strlen($endereco) < 5) {
        json_fail('Informe o endereco.');
    }
    if ($latitude !== null && ($latitude < -90 || $latitude > 90)) {
        json_fail('Latitude invalida.');
    }
    if ($longitude !== null && ($longitude < -180 || $longitude > 180)) {
        json_fail('Longitude invalida.');
    }

    if ($id > 0) {
        $stmt = $pdo->prepare(
            'UPDATE passageiro_enderecos
             SET rotulo = ?, endereco = ?, latitude = ?, longitude = ?, ordem = ?
             WHERE id = ? AND id_passageiro = ? AND ativo = 1'
        );
        $stmt->execute([$rotulo, $endereco, $latitude, $longitude, $ordem, $id, $idPassageiro]);
    } else {
        $countStmt = $pdo->prepare('SELECT COUNT(*) FROM passageiro_enderecos WHERE id_passageiro = ? AND ativo = 1');
        $countStmt->execute([$idPassageiro]);
        if ((int) $countStmt->fetchColumn() >= PASSAGEIRO_ENDERECOS_LIMITE) {
            json_fail('Voce pode salvar ate 5 enderecos.', 422);
        }

        $stmt = $pdo->prepare(
            'INSERT INTO passageiro_enderecos
             (id_passageiro, rotulo, endereco, latitude, longitude, ordem)
             VALUES (?, ?, ?, ?, ?, ?)'
        );
        $stmt->execute([$idPassageiro, $rotulo, $endereco, $latitude, $longitude, $ordem]);
    }

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