<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }

require __DIR__ . '/config_pix.php';

// Gera um CPF válido aleatório (a página só pede nome e e-mail)
function gerar_cpf_valido() {
    $n = [];
    for ($i = 0; $i < 9; $i++) { $n[$i] = random_int(0, 9); }
    // 1º dígito verificador
    $s = 0;
    for ($i = 0; $i < 9; $i++) { $s += $n[$i] * (10 - $i); }
    $r = $s % 11;
    $n[9] = ($r < 2) ? 0 : 11 - $r;
    // 2º dígito verificador
    $s = 0;
    for ($i = 0; $i < 10; $i++) { $s += $n[$i] * (11 - $i); }
    $r = $s % 11;
    $n[10] = ($r < 2) ? 0 : 11 - $r;
    $cpf = implode('', $n);
    // evita sequências inválidas (000..., 111...)
    if (preg_match('/^(\d)\1{10}$/', $cpf)) { return gerar_cpf_valido(); }
    return $cpf;
}

// PEGAR DADOS JSON
$input = json_decode(file_get_contents('php://input'), true);
if (!is_array($input)) { $input = []; }

// Aceita tanto o formato antigo (nome/cpf/valorCentavos) quanto o novo
// (amount + customer{ name, document, email, phone }) enviado pelo front.
$customer = is_array($input['customer'] ?? null) ? $input['customer'] : [];

$nome = trim($input['nome'] ?? $customer['name'] ?? '');
$cpf = preg_replace('/\D/', '', $input['cpf'] ?? $customer['document'] ?? '');
$valorCentavos = (int) ($input['valorCentavos'] ?? $input['amount'] ?? 0);
$email = $input['email'] ?? $customer['email'] ?? 'cliente@teste.com';
$telefone = preg_replace('/\D/', '', $input['phone'] ?? $customer['phone'] ?? '11974546525');

// Se não vier CPF ou vier inválido, gera um válido
if (strlen($cpf) !== 11) { $cpf = gerar_cpf_valido(); }

// VALIDAR CAMPOS (CPF é gerado automaticamente, não exigido)
if (!$nome || $valorCentavos <= 0) {
    http_response_code(400);
    echo json_encode([
        'error' => 'Nome e valor são obrigatórios e o valor deve ser maior que zero.',
        'http_code' => 400
    ]);
    exit;
}

// MONTAR PAYLOAD
$payload = [
    "amount" => $valorCentavos,
    "offer_hash" => $FORTPAY_OFFER_HASH,
    "payment_method" => "pix",
    "customer" => [
        "name" => $nome,
        "email" => $email,
        "phone_number" => $telefone,
        "document" => $cpf
    ],
    "cart" => [
        [
            "product_hash" => $FORTPAY_PRODUTO_HASH,
            "title" => "Pagamento PIX",
            "price" => $valorCentavos,
            "quantity" => 1,
            "operation_type" => 1,
            "tangible" => false
        ]
    ],
    "installments" => 1,
    "expire_in_days" => 1
];

// URL COM TOKEN
$url = $FORTPAY_ENDPOINT . '?api_token=' . urlencode($FORTPAY_API_TOKEN);

// INICIAR cURL
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Accept: application/json',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));

// TIMEOUTS — EVITAR TRAVAMENTO
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 5s para conectar
curl_setopt($ch, CURLOPT_TIMEOUT, 10);       // 10s para resposta

// EXECUTAR
$response = curl_exec($ch);
$err = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// TRATAR ERROS DE CONEXÃO
if ($err) {
    http_response_code(500);
    echo json_encode([
        'success'   => false,
        'error'     => 'Erro na conexão com FortPay: ' . $err,
        'http_code' => 500
    ]);
    exit;
}

$decoded = json_decode($response, true);
if (!is_array($decoded)) {
    http_response_code(502);
    echo json_encode([
        'success'   => false,
        'error'     => 'Resposta inválida da FortPay.',
        'http_code' => 502,
        'raw'       => $response
    ]);
    exit;
}

// Só é erro se o HTTP for >= 400. A FortPay retorna 201 (sem campo "success")
// quando cria a transação com sucesso.
if ($httpCode >= 400) {
    http_response_code($httpCode);
    echo json_encode([
        'success'      => false,
        'error'        => $decoded['message'] ?? $decoded['error'] ?? 'Falha ao criar a transação na FortPay.',
        'http_code'    => $httpCode,
        'api_response' => $decoded
    ]);
    exit;
}

// EXTRAIR DADOS DA TRANSAÇÃO
// Formato real FortPay (plano): { hash, token, pix: { pix_qr_code, pix_url }, ... }
$data    = is_array($decoded['data'] ?? null) ? $decoded['data'] : $decoded;
$pix     = is_array($data['pix'] ?? null) ? $data['pix'] : [];
$txId    = $data['hash'] ?? $data['token'] ?? $data['id'] ?? null;
$pixCode = $pix['pix_qr_code'] ?? $data['pix_code'] ?? $data['qr_code_text'] ?? null;
$qrImg   = $pix['pix_url'] ?? $data['qr_code'] ?? null; // imagem; null = front gera pelo pixCode
$status  = $data['payment_status'] ?? $data['status'] ?? 'pending';

// VALIDA QUE VEIO O CÓDIGO PIX
if (!$txId || !$pixCode) {
    http_response_code(502);
    echo json_encode([
        'success'      => false,
        'error'        => 'A FortPay não retornou o código PIX.',
        'http_code'    => 502,
        'api_response' => $decoded
    ]);
    exit;
}

// RETORNA NO FORMATO ESPERADO PELO FRONT (PixModal)
http_response_code(200);
echo json_encode([
    'success'       => true,
    'token'         => $txId,
    'transactionId' => $txId,
    'pixCode'       => $pixCode,        // "copia e cola"
    'qrCodeUrl'     => $qrImg,          // imagem base64 (data:image/png;base64,...) ou null
    'status'        => $status,
    'expiresAt'     => $data['expires_at'] ?? null,
    'api_response'  => $decoded         // resposta crua (debug)
]);
exit;
