<?php
declare(strict_types=1);

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

$data = input_json();
$idPassageiro = (int) ($_GET['id_passageiro'] ?? $_GET['id_usuario'] ?? $data['id_passageiro'] ?? $data['id_usuario'] ?? 0);

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

function carteira_passageiro_money(float $valor): float
{
    return round($valor, 2);
}

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

    $saldoStmt = $pdo->prepare(
        'SELECT COALESCE(SUM(
            CASE
              WHEN status <> "confirmado" THEN 0
              WHEN tipo = "debito" THEN -valor
              ELSE valor
            END
        ), 0) AS saldo
         FROM passageiro_carteira_movimentos
         WHERE id_passageiro = ?'
    );
    $saldoStmt->execute([$idPassageiro]);
    $saldo = carteira_passageiro_money((float) $saldoStmt->fetchColumn());

    $movStmt = $pdo->prepare(
        'SELECT id, id_corrida, tipo, origem, valor, descricao, status, criado_em
         FROM passageiro_carteira_movimentos
         WHERE id_passageiro = ?
         ORDER BY criado_em DESC, id DESC
         LIMIT 80'
    );
    $movStmt->execute([$idPassageiro]);
    $movimentos = [];
    foreach ($movStmt->fetchAll() as $row) {
        $row['id'] = (int) $row['id'];
        $row['id_corrida'] = $row['id_corrida'] === null ? null : (int) $row['id_corrida'];
        $row['valor'] = carteira_passageiro_money((float) $row['valor']);
        $movimentos[] = $row;
    }

    $pixStmt = $pdo->prepare(
        'SELECT id, valor, status, txid, pix_copia_cola, observacao, criado_em, atualizado_em
         FROM passageiro_pix_recargas
         WHERE id_passageiro = ?
         ORDER BY criado_em DESC, id DESC
         LIMIT 30'
    );
    $pixStmt->execute([$idPassageiro]);
    $recargas = [];
    $pixPendente = 0.0;
    foreach ($pixStmt->fetchAll() as $row) {
        $row['id'] = (int) $row['id'];
        $row['valor'] = carteira_passageiro_money((float) $row['valor']);
        if ((string) $row['status'] === 'pendente') {
            $pixPendente += (float) $row['valor'];
        }
        $recargas[] = $row;
    }

    $cartaoExtras = '';
    if (function_exists('mp_column_exists')) {
        // Mantido para compatibilidade caso este endpoint seja carregado junto dos helpers do Mercado Pago.
    }
    $hasMpCustomer = false;
    $hasMpCard = false;
    $hasMpPaymentMethod = false;
    try {
        $colStmt = $pdo->prepare(
            'SELECT COLUMN_NAME
             FROM INFORMATION_SCHEMA.COLUMNS
             WHERE TABLE_SCHEMA = DATABASE()
               AND TABLE_NAME = "passageiro_cartoes"
               AND COLUMN_NAME IN ("mp_customer_id", "mp_card_id", "mp_payment_method_id", "token_status")'
        );
        $colStmt->execute();
        $cols = array_flip(array_map('strval', $colStmt->fetchAll(PDO::FETCH_COLUMN) ?: []));
        $hasMpCustomer = isset($cols['mp_customer_id']);
        $hasMpCard = isset($cols['mp_card_id']);
        $hasMpPaymentMethod = isset($cols['mp_payment_method_id']);
        if ($hasMpCustomer) {
            $cartaoExtras .= ', mp_customer_id';
        }
        if ($hasMpCard) {
            $cartaoExtras .= ', mp_card_id';
        }
        if ($hasMpPaymentMethod) {
            $cartaoExtras .= ', mp_payment_method_id';
        }
        if (isset($cols['token_status'])) {
            $cartaoExtras .= ', token_status';
        }
    } catch (Throwable $ignored) {
        $cartaoExtras = '';
    }

    $cartoesStmt = $pdo->prepare(
        'SELECT id, apelido, bandeira, ultimos4, validade_mes, validade_ano, ativo, criado_em' . $cartaoExtras . '
         FROM passageiro_cartoes
         WHERE id_passageiro = ?
         ORDER BY ativo DESC, criado_em DESC, id DESC'
    );
    $cartoesStmt->execute([$idPassageiro]);
    $cartoes = [];
    foreach ($cartoesStmt->fetchAll() as $row) {
        $row['id'] = (int) $row['id'];
        $row['validade_mes'] = $row['validade_mes'] === null ? null : (int) $row['validade_mes'];
        $row['validade_ano'] = $row['validade_ano'] === null ? null : (int) $row['validade_ano'];
        $row['ativo'] = (int) $row['ativo'] === 1;
        if ($hasMpCustomer && isset($row['mp_customer_id'])) {
            $row['mp_customer_id'] = (string) $row['mp_customer_id'];
        }
        if ($hasMpCard && isset($row['mp_card_id'])) {
            $row['mp_card_id'] = (string) $row['mp_card_id'];
        }
        if ($hasMpPaymentMethod && isset($row['mp_payment_method_id'])) {
            $row['mp_payment_method_id'] = (string) $row['mp_payment_method_id'];
        }
        $row['gateway_pronto'] = !empty($row['mp_customer_id']) && !empty($row['mp_card_id']);
        $cartoes[] = $row;
    }

    json_ok([
        'carteira' => [
            'saldo' => $saldo,
            'saldo_disponivel' => $saldo,
            'pix_pendente' => carteira_passageiro_money($pixPendente),
            'movimentos' => $movimentos,
            'recargas_pix' => $recargas,
            'cartoes' => $cartoes,
        ],
    ]);
} catch (Throwable $e) {
    json_fail('Erro ao carregar carteira do passageiro.', 500, ['error' => $e->getMessage()]);
}
