<?php
declare(strict_types=1);

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

$data = input_json();
$idPassageiro = (int) ($data['id_passageiro'] ?? $data['id_usuario'] ?? 0);
$valor = isset($data['valor']) ? (float) str_replace(',', '.', (string) $data['valor']) : 0.0;

if ($idPassageiro <= 0) {
    json_fail('Passageiro nao informado.');
}
if ($valor < 1) {
    json_fail('Informe um valor de recarga maior ou igual a R$ 1,00.');
}

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

    $txid = 'BULO' . $idPassageiro . date('YmdHis') . random_int(100, 999);
    $pixCopiaCola = 'PIX_EM_CONFIGURACAO_BULO_' . $txid;
    $externalReference = mp_external_reference('pix', (int) (microtime(true) * 1000));

    $columns = ['id_passageiro', 'valor', 'status', 'txid', 'pix_copia_cola', 'observacao'];
    $placeholders = ['?', '?', '"pendente"', '?', '?', '?'];
    $params = [
        $idPassageiro,
        round($valor, 2),
        $txid,
        $pixCopiaCola,
        'Recarga aguardando confirmacao do pagamento.',
    ];
    if (mp_column_exists($pdo, 'passageiro_pix_recargas', 'external_reference')) {
        $columns[] = 'external_reference';
        $placeholders[] = '?';
        $params[] = $externalReference;
    }

    $stmt = $pdo->prepare(
        'INSERT INTO passageiro_pix_recargas (' . implode(', ', $columns) . ')
         VALUES (' . implode(', ', $placeholders) . ')'
    );
    $stmt->execute($params);

    json_ok([
        'id_recarga' => (int) $pdo->lastInsertId(),
        'valor' => round($valor, 2),
        'status' => 'pendente',
        'txid' => $txid,
        'external_reference' => $externalReference,
        'pix_copia_cola' => $pixCopiaCola,
        'message' => 'Recarga Pix registrada. A confirmacao sera automatica quando o pagamento for aprovado.',
    ]);
} catch (Throwable $e) {
    json_fail('Erro ao criar recarga Pix.', 500, ['error' => $e->getMessage()]);
}
