<?php
require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/config.php';
require_once __DIR__ . '/billing.php';
require_once __DIR__ . '/kyc_helpers.php';

// Autenticación obligatoria y captura de usuario actual.
$auth = getAuth(); 
$auth->requireAuth();
$user = $auth->getCurrentUser();
$db = getDatabaseConnection();
requireKycVerified($db, $user['id']);

$plan = getPlanByCode($_GET['plan'] ?? null);

// Detecta proveedor de pago; cae en Stripe si no hay otro configurado.
$provider = getenv('PAYMENT_PROVIDER');
if (!$provider) {
    if (getenv('WOMPI_PUBLIC_KEY')) {
        $provider = 'wompi';
    } elseif (getenv('MP_ACCESS_TOKEN')) {
        $provider = 'mercadopago';
    } else {
        $provider = 'stripe';
    }
}
if ($provider === 'mercadopago') {
    header('Location: create_mp_preapproval?plan=' . urlencode($plan['code']));
    exit;
}
if ($provider === 'wompi') {
    header('Location: create_wompi_checkout?plan=' . urlencode($plan['code']));
    exit;
} 

// Recupera suscripción previa para reutilizar el cliente de Stripe.
$sub = getUserSubscription($db, $user['id']);

// Verifica configuración mínima de Stripe.
$priceId = $plan['stripe_price_id'] ?: STRIPE_PRICE_ID;
if (!STRIPE_SECRET_KEY || !STRIPE_PUBLISHABLE_KEY || !$priceId) {
    http_response_code(500);
    echo 'Stripe no está configurado. Faltan claves o PRICE_ID.';
    exit;
}

try {
    $success = rtrim(BASE_URL, '/') . '/subscription?message=' . urlencode('Pago exitoso. Actualizando suscripción...');
    $cancel = rtrim(BASE_URL, '/') . '/subscription?message=' . urlencode('Pago cancelado.');

    // Valida que el precio configurado sea recurrente.
    try {
        $price = stripeRequest('GET', '/prices/' . urlencode($priceId));
        if (empty($price) || empty($price['recurring'])) {
            throw new Exception('El STRIPE_PRICE_ID no corresponde a un precio recurrente. Configure un precio mensual/anual en Stripe.');
        }
    } catch (Throwable $e) {
        throw new Exception('Validación de precio falló: ' . $e->getMessage());
    }

    // Arma el payload para Checkout; incluye metadata y reutiliza cliente si existe.
    $payload = [
        'mode' => 'subscription',
        'success_url' => $success,
        'cancel_url' => $cancel,
        'line_items[0][price]' => $priceId,
        'line_items[0][quantity]' => 1,
        'allow_promotion_codes' => 'true',
        'client_reference_id' => $user['id'],
        // Metadata para que los eventos de suscripción lleven nuestro user_id y plan
        'subscription_data[metadata][user_id]' => $user['id'],
        'subscription_data[metadata][plan_code]' => $plan['code'],
        'subscription_data[metadata][plan_name]' => $plan['name'],
        'metadata[user_id]' => $user['id'],
        'metadata[plan_code]' => $plan['code'],
        'metadata[plan_name]' => $plan['name'],
    ];

    if (!empty($sub) && !empty($sub['stripe_customer_id'])) {
        // Reusar el cliente de Stripe existente para evitar duplicados.
        $payload['customer'] = $sub['stripe_customer_id'];
    } else {
        // Primera compra: deja que Stripe cree/vincule usando email.
        $payload['customer_email'] = $user['email'];
    }

    $session = stripeRequest('POST', '/checkout/sessions', $payload);
    if (!empty($session['url'])) {
        header('Location: ' . $session['url']);
        exit;
    }
    throw new Exception('Respuesta inválida de Stripe');
} catch (Throwable $e) {
    error_log('Stripe Checkout error: ' . $e->getMessage());
    http_response_code(500);
    echo 'Falla al crear la sesión de pago.';
}
