<?php
/**
 * API Endpoint para criar pagamentos
 * 
 * Recebe requisições do checkout e usa o PaymentFactory
 * para processar o pagamento com o gateway ativo.
 */

header('Content-Type: application/json');

session_start();

// Verificar autenticação
if (!isset($_SESSION['user_id'])) {
    http_response_code(401);
    echo json_encode(['success' => false, 'error' => 'Usuário não autenticado']);
    exit;
}

// Incluir dependências
require_once __DIR__ . '/../includes/config.php';
require_once __DIR__ . '/../includes/Payment/PaymentFactory.php';

use Payment\PaymentFactory;

try {
    // Obter dados da requisição
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input) {
        throw new \InvalidArgumentException('Dados inválidos');
    }

    $planId = (int) ($input['plan_id'] ?? 0);
    $paymentMethod = $input['payment_method'] ?? 'pix';

    // Buscar dados do plano
    $stmt = getDB()->prepare("SELECT * FROM plans WHERE id = ? AND is_active = 1");
    $stmt->execute([$planId]);
    $plan = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$plan) {
        throw new \InvalidArgumentException('Plano não encontrado ou inativo');
    }

    // Buscar dados do usuário
    $stmt = getDB()->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->execute([$_SESSION['user_id']]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$user) {
        throw new \InvalidArgumentException('Usuário não encontrado');
    }

    // Criar instância do gateway via Factory
    $factory = new PaymentFactory(getDB());
    
    if (!$factory->hasActiveGateway()) {
        throw new \RuntimeException('Sistema de pagamentos temporariamente indisponível');
    }

    $gateway = $factory->create();
    $activeGatewayInfo = $factory->getActiveGateway();

    // Preparar dados do cliente
    $customerData = [
        'email' => $user['email'],
        'first_name' => $user['first_name'] ?? $user['name'] ?? '',
        'last_name' => $user['last_name'] ?? '',
        'doc_type' => 'CPF',
        'doc_number' => preg_replace('/\D/', '', $user['cpf'] ?? $user['document'] ?? ''),
        'external_reference' => 'user_' . $user['id'] . '_plan_' . $plan['id'] . '_' . time(),
        'webhook_url' => 'https://dev.duolead.com.br/api/webhook-payment.php'
    ];

    // Preparar itens
    $items = [
        [
            'title' => $plan['name'],
            'quantity' => 1,
            'unit_price' => (float) $plan['price']
        ]
    ];

    $amount = (float) $plan['price'];

    // Processar conforme método de pagamento
    if ($paymentMethod === 'pix') {
        $result = $gateway->createTransaction($amount, $customerData, $items, 'pix');
    } else {
        // Checkout redirect (MercadoPago Checkout Pro, Stripe Checkout, etc.)
        $successUrl = 'https://dev.duolead.com.br/assinatura.php?status=success';
        $failureUrl = 'https://dev.duolead.com.br/assinatura.php?status=failure';
        
        $result = $gateway->createCheckoutSession($amount, $customerData, $items, $successUrl, $failureUrl);
    }

    if ($result['success']) {
        // Salvar transação no banco
        $stmt = getDB()->prepare("
            INSERT INTO payment_transactions 
            (user_id, gateway_id, external_id, type, amount, status, plan_id, 
             pix_qr_code, pix_qr_code_base64, pix_copy_paste, checkout_url, metadata)
            VALUES (?, ?, ?, ?, ?, 'pending', ?, ?, ?, ?, ?, ?)
        ");
        
        $stmt->execute([
            $user['id'],
            $activeGatewayInfo['id'],
            $result['transaction_id'] ?? $result['preference_id'] ?? null,
            $paymentMethod,
            $amount,
            $planId,
            $result['pix_qr_code'] ?? null,
            $result['pix_qr_code_base64'] ?? null,
            $result['pix_copy_paste'] ?? null,
            $result['checkout_url'] ?? null,
            json_encode($result['raw_response'] ?? [])
        ]);

        $transactionId = getDB()->lastInsertId();
        $result['internal_transaction_id'] = $transactionId;
    }

    echo json_encode($result);

} catch (\Exception $e) {
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage()
    ]);
}
