<?php
/**
 * gateway_pix.php — Geração de cobranças PIX dinâmicas (Mercado Pago / Asaas).
 * Ajuste o corpo da requisição conforme o gateway efetivamente contratado.
 */

require_once __DIR__ . '/db_helper.php';

/**
 * Gera uma cobrança PIX para o cliente e retorna os dados básicos
 * (id da cobrança no gateway + código copia-e-cola).
 * Em caso de falha na API, retorna um PIX "manual" com os dados da empresa
 * como fallback, para não travar o fluxo de notificação.
 */
function gerar_pix_para_cliente(array $cliente): array
{
    // Nunca deixa essa função travar/quebrar a resposta do endpoint que a
    // chamou (cobrança, renovação, mensagem avulsa). Qualquer problema aqui
    // (rede fora do ar, cURL desabilitado, token inválido, timeout) cai no
    // fallback de PIX manual — o fluxo de mensagem continua normalmente.
    try {
        $config = db_read('config');
        $gateway = $config['gateway_pix'] ?? [];
        $valor = (float) ($cliente['valor'] ?? 0);

        if (!function_exists('curl_init')) {
            error_log('PIX: extensão cURL não está habilitada neste servidor PHP — usando PIX manual.');
            return pix_manual_fallback();
        }

        if (($gateway['provedor'] ?? '') === 'mercadopago' && !empty($gateway['access_token']) && $gateway['access_token'] !== 'ALTERAR_ACCESS_TOKEN_GATEWAY') {
            $resultado = criar_cobranca_mercadopago($gateway, $cliente, $valor);
            if ($resultado) {
                return $resultado;
            }
        }

        if (($gateway['provedor'] ?? '') === 'asaas' && !empty($gateway['access_token']) && $gateway['access_token'] !== 'ALTERAR_ACCESS_TOKEN_GATEWAY') {
            $resultado = criar_cobranca_asaas($gateway, $cliente, $valor);
            if ($resultado) {
                return $resultado;
            }
        }
    } catch (\Throwable $e) {
        error_log('Erro ao gerar PIX (usando fallback manual): ' . $e->getMessage());
    }

    return pix_manual_fallback();
}

function pix_manual_fallback(): array
{
    return [
        'id' => gerar_id('PIXMANUAL-'),
        'copia_cola' => 'PIX manual — entre em contato para pagamento.',
    ];
}

function criar_cobranca_mercadopago(array $gateway, array $cliente, float $valor): ?array
{
    try {
        $ch = curl_init('https://api.mercadopago.com/v1/payments');
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_TIMEOUT => 8,
            CURLOPT_CONNECTTIMEOUT => 5,
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json',
                'Authorization: Bearer ' . $gateway['access_token'],
                'X-Idempotency-Key: ' . gerar_id('IDEMP-'),
            ],
            CURLOPT_POSTFIELDS => json_encode([
                'transaction_amount' => $valor,
                'description' => 'Renovação de plano - ' . ($cliente['nome'] ?? ''),
                'payment_method_id' => 'pix',
                'external_reference' => $cliente['id'] ?? '',
                'payer' => [
                    'email' => $cliente['email'] ?? 'sememail@dominio.com',
                ],
            ]),
        ]);
        $resp = curl_exec($ch);
        $erroCurl = curl_error($ch);
        $codigo = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($erroCurl) {
            error_log('Erro cURL ao gerar PIX no Mercado Pago: ' . $erroCurl);
            return null;
        }
        if ($codigo < 200 || $codigo >= 300 || !$resp) {
            error_log("Mercado Pago retornou HTTP {$codigo} ao gerar PIX: " . substr((string) $resp, 0, 300));
            return null;
        }
        $data = json_decode($resp, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            return null;
        }
        return [
            'id' => (string) ($data['id'] ?? ''),
            'copia_cola' => $data['point_of_interaction']['transaction_data']['qr_code'] ?? '',
        ];
    } catch (\Throwable $e) {
        error_log('Exceção ao gerar PIX no Mercado Pago: ' . $e->getMessage());
        return null;
    }
}

function criar_cobranca_asaas(array $gateway, array $cliente, float $valor): ?array
{
    // Estrutura equivalente para o gateway Asaas — implementar conforme a
    // documentação oficial (endpoint /v3/payments com billingType=PIX).
    return null;
}
