<?php

declare(strict_types=1);

require_once __DIR__ . '/../init.php';
require_once __DIR__ . '/../../lib/ReferralCreditService.php';

Security::headers(true);
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    Security::json(['success' => false, 'message' => 'Método no permitido.'], 405);
}
Security::requireCsrf();

$role = mb_strtolower(trim((string) ($_SESSION['admin']['rol'] ?? '')), 'UTF-8');
if ($role !== 'superadmin') {
    Security::json(['success' => false, 'message' => 'Acción no permitida.'], 403);
}

$subscriptionId = filter_input(INPUT_POST, 'id_suscripcion', FILTER_VALIDATE_INT) ?: 0;
$paymentId = filter_input(INPUT_POST, 'id_pago', FILTER_VALIDATE_INT) ?: 0;
if ($subscriptionId <= 0 || $paymentId <= 0) {
    Security::json(['success' => false, 'message' => 'Datos de referido no válidos.'], 422);
}

if (session_status() === PHP_SESSION_ACTIVE) {
    session_write_close();
}
@set_time_limit(15);
ignore_user_abort(true);

try {
    try {
        $pdo->exec('SET SESSION innodb_lock_wait_timeout = 3');
        $pdo->exec('SET SESSION max_statement_time = 10');
    } catch (Throwable) {
    }

    $check = $pdo->prepare(
        "SELECT p.id, COALESCE(p.ciclo, 'manual') AS ciclo,
                COALESCE(p.estado_pago, 'confirmado') AS estado_pago
         FROM pagos p
         WHERE p.id = ? AND p.id_suscripcion = ?
         LIMIT 1"
    );
    $check->execute([$paymentId, $subscriptionId]);
    $payment = $check->fetch(PDO::FETCH_ASSOC);

    if (!$payment || (string) ($payment['estado_pago'] ?? '') !== 'confirmado') {
        Security::json(['success' => true, 'message' => 'El pago no requiere procesamiento adicional.']);
    }
    if ((string) ($payment['ciclo'] ?? '') !== 'mensual') {
        Security::json(['success' => true, 'message' => 'La modalidad no genera beneficio de referido.']);
    }

    try {
        (new ReferralCreditService($pdo))->rewardFirstPayment($subscriptionId, $paymentId);
    } catch (Throwable $referralError) {
        error_log('Beneficio de referido pendiente para pago ' . $paymentId . ': ' . $referralError->getMessage());
    }

    Security::json(['success' => true, 'message' => 'Beneficio de referido revisado.']);
} catch (Throwable $e) {
    error_log('Error procesando beneficio de referido: ' . $e->getMessage());
    Security::json(['success' => true, 'message' => 'La renovación fue confirmada; el beneficio de referido quedó pendiente de revisión.']);
}
