<?php

declare(strict_types=1);

require_once __DIR__ . '/init.php';

/* AFENIXX-REFERIDOS-PERMISSION-20260724 */
$rol_referidos = mb_strtolower(
    trim(
        (string) (
            $_SESSION['admin']['rol'] ?? ''
        )
    ),
    'UTF-8'
);

$referidos_habilitados =
    ($ui_referrals_enabled ?? true) === true;

if (
    $rol_referidos !== 'admin'
    || !$referidos_habilitados
    || !tiene_permiso(
        'ver_referidos_propios_admin'
    )
) {
    $_SESSION['flash_message'] = [
        'type' => 'error',
        'text' =>
            'No tienes permiso para acceder a Mis Referidos.',
    ];

    header('Location: index.php');
    exit;
}

require_once dirname(__DIR__) . '/lib/ReferralCreditService.php';
require_once dirname(__DIR__) . '/lib/WalletSubscriptionService.php';

$role = mb_strtolower(trim((string) ($_SESSION['admin']['rol'] ?? '')), 'UTF-8');
if (!in_array($role, ['admin', 'ayudante de superadmin'], true)) {
    $_SESSION['flash_message'] = [
        'type' => 'error',
        'text' => 'El módulo de referidos está disponible para administradores y ayudantes operativos.',
    ];
    header('Location: index.php');
    exit;
}

$userId = (int) ($_SESSION['admin']['uid'] ?? 0);
$service = new ReferralCreditService($pdo);
$walletService = new WalletSubscriptionService($pdo);

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    Security::headers(true);
    Security::requireCsrf();

    try {
        $action = trim((string) ($_POST['action'] ?? ''));
        if ($action !== 'transfer_referral_credit') {
            throw new InvalidArgumentException('La acción solicitada no es válida.');
        }

        $referredId = filter_input(INPUT_POST, 'id_referido', FILTER_VALIDATE_INT) ?: 0;
        $amountRaw = str_replace(',', '.', trim((string) ($_POST['monto'] ?? '')));
        $amount = is_numeric($amountRaw) ? round((float) $amountRaw, 2) : 0.0;
        $description = trim((string) ($_POST['descripcion'] ?? ''));

        if ($referredId <= 0 || $amount <= 0) {
            throw new InvalidArgumentException('Selecciona un referido e ingresa un importe mayor que cero.');
        }
        if (mb_strlen($description, 'UTF-8') > 180) {
            throw new InvalidArgumentException('El detalle no debe superar 180 caracteres.');
        }

        $result = $walletService->transferCreditToReferral($userId, $referredId, $amount, $description);
        Security::json([
            'success' => true,
            'message' => 'La recarga fue transferida correctamente al monedero del referido.',
            'sender_balance' => $result['sender_balance'],
            'recipient_balance' => $result['recipient_balance'],
            'currency_symbol' => $walletService->getCurrencySymbol(),
        ]);
    } catch (Throwable $e) {
        error_log('Recarga a referido: ' . $e->getMessage());
        Security::json(['success' => false, 'message' => $e->getMessage()], 422);
    }
}

$error = '';
$data = [
    'code' => '',
    'currency' => 'PEN',
    'stats' => ['total_referidos' => 0, 'meses_otorgados' => 0, 'valor_referencial' => 0],
    'rows' => [],
];
$ownBalance = 0.0;
$currencySymbol = 'S/';

try {
    $data = $service->getReferralDashboard($userId);
    $ownBalance = $walletService->getBalance($userId);
    $currencySymbol = $walletService->getCurrencySymbol();
} catch (Throwable $e) {
    $error = 'No se pudo cargar el módulo de referidos. Verifica que la migración correspondiente esté instalada.';
    error_log('Error en mis_referidos: ' . $e->getMessage());
}

$scheme = (!empty($_SERVER['HTTPS']) && strtolower((string) $_SERVER['HTTPS']) !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
$basePath = rtrim(dirname(dirname((string) ($_SERVER['SCRIPT_NAME'] ?? '/admin/mis_referidos.php'))), '/');
$link = $data['code'] !== '' ? $scheme . '://' . $host . $basePath . '/registro.php?ref=' . rawurlencode($data['code']) : '';
$referralCode = trim((string) ($data['code'] ?? ''));
$trialPlanName = 'Gratis';
$trialDays = 7;
try {
    $trialPlanStmt = $pdo->query("SELECT nombre_plan, duracion_prueba_dias FROM planes WHERE nombre_plan = 'Gratis' AND activo = 1 AND es_interno = 0 ORDER BY id ASC LIMIT 1");
    if ($trialPlanStmt && ($trialPlanRow = $trialPlanStmt->fetch(PDO::FETCH_ASSOC))) {
        $trialPlanName = trim((string) ($trialPlanRow['nombre_plan'] ?? 'Gratis')) ?: 'Gratis';
        $trialDays = max(1, (int) ($trialPlanRow['duracion_prueba_dias'] ?? 7));
    }
} catch (Throwable $trialPlanError) {
    error_log('Plan gratuito en referidos: ' . $trialPlanError->getMessage());
}

$inviteMessage = $referralCode !== '' && $link !== ''
    ? "✨ *TE RECOMIENDO AVE FÉNIX*\n\n"
        . "Hola 👋\n\n"
        . "Quiero recomendarte *Ave Fénix*, una plataforma para automatizar la entrega de códigos de acceso y organizar toda la operación desde un solo panel.\n\n"
        . "⚡ *Entrega códigos con rapidez:* localiza mensajes configurados sin búsquedas manuales.\n"
        . "🔐 *Controla cada acceso:* define consultas públicas y privadas.\n"
        . "📅 *Organiza renovaciones:* administra clientes, cuentas y vencimientos.\n\n"
        . "🎉 *Beneficio inicial:* {$trialDays} días gratis con el plan *{$trialPlanName}*.\n"
        . "🎁 *Código de referido:* {$referralCode}\n"
        . "🔗 *Registro:*\n{$link}\n\n"
        . "✅ El enlace cargará el código automáticamente.\n\n"
        . "🙌 Espero que te sea útil."
    : '';
$whatsappShareUrl = $inviteMessage !== '' ? 'https://wa.me/?text=' . rawurlencode($inviteMessage) : '';
$pending = count(array_filter($data['rows'], static fn(array $row): bool => ($row['beneficio_estado'] ?? '') !== 'otorgado'));
$awarded = count(array_filter($data['rows'], static fn(array $row): bool => ($row['beneficio_estado'] ?? '') === 'otorgado'));

$titulo_pagina = 'Referidos y beneficios';
require_once __DIR__ . '/admin_header.php';
?>
<div class="af-page">
    <header class="af-heading">
        <div class="af-heading-main"><span class="af-heading-icon"><i class="fas fa-user-group"></i></span><div><p class="af-eyebrow">Beneficio y distribución de saldo</p><h1>Referidos</h1><p>Comparte tu enlace, revisa tus referidos y transfiere saldo únicamente a las cuentas Admin registradas con tu código.</p></div></div>
        <div class="af-heading-actions">
            <button type="button" id="copyReferralCodeTop" class="af-btn af-btn-secondary" <?= $referralCode === '' ? 'disabled' : '' ?>><i class="fas fa-hashtag"></i> Copiar código</button>
            <a href="mi_suscripcion.php" class="af-btn af-btn-primary"><i class="fas fa-wallet"></i> Mi suscripción y saldo</a>
            <button type="button" id="openReferralShareModal" class="af-btn af-btn-success" <?= $inviteMessage === '' ? 'disabled' : '' ?>><i class="fab fa-whatsapp"></i> Compartir invitación</button>
        </div>
    </header>

    <?php if ($error !== ''): ?><div class="af-alert af-alert-danger"><i class="fas fa-triangle-exclamation"></i><div><?= htmlspecialchars($error) ?></div></div><?php endif; ?>

    <section class="af-stats">
        <article class="af-stat"><span class="af-stat-icon"><i class="fas fa-users"></i></span><div><p class="af-stat-label">Referidos</p><p class="af-stat-value"><?= number_format((int) $data['stats']['total_referidos']) ?></p><div class="af-stat-note">Cuentas Admin vinculadas</div></div></article>
        <article class="af-stat"><span class="af-stat-icon"><i class="fas fa-gift"></i></span><div><p class="af-stat-label">Beneficios entregados</p><p class="af-stat-value"><?= number_format($awarded) ?></p><div class="af-stat-note"><?= number_format((int) $data['stats']['meses_otorgados']) ?> meses ganados</div></div></article>
        <article class="af-stat"><span class="af-stat-icon"><i class="fas fa-clock"></i></span><div><p class="af-stat-label">Pendientes</p><p class="af-stat-value"><?= number_format($pending) ?></p><div class="af-stat-note">Esperando primer pago</div></div></article>
        <article class="af-stat"><span class="af-stat-icon"><i class="fas fa-wallet"></i></span><div><p class="af-stat-label">Saldo para distribuir</p><p class="af-stat-value"><?= htmlspecialchars($currencySymbol) ?> <?= number_format($ownBalance, 2) ?></p><div class="af-stat-note">La recarga al referido se descuenta de este saldo</div></div></article>
    </section>

    <section class="af-panel">
        <div class="af-panel-head"><div class="af-panel-title"><span class="af-panel-title-icon"><i class="fas fa-share-nodes"></i></span><div><h2>Tu invitación personal</h2><p>Copia el código, comparte el enlace o prepara un mensaje profesional para WhatsApp.</p></div></div></div>
        <div class="af-panel-body">
            <div class="af-form-grid">
                <div>
                    <label class="af-label" for="referralCode"><i class="fas fa-hashtag"></i> Código de referido</label>
                    <div class="flex flex-col md:flex-row gap-2"><input id="referralCode" class="af-control flex-1" readonly value="<?= htmlspecialchars($referralCode) ?>" placeholder="Código no disponible"><button type="button" id="copyReferralCode" class="af-btn af-btn-secondary" <?= $referralCode === '' ? 'disabled' : '' ?>><i class="fas fa-copy"></i> Copiar código</button></div>
                    <span class="af-help">El invitado también puede escribir este código manualmente durante el registro.</span>
                </div>
                <div>
                    <label class="af-label" for="referralLink"><i class="fas fa-link"></i> Enlace de registro</label>
                    <div class="flex flex-col md:flex-row gap-2"><input id="referralLink" class="af-control flex-1" readonly value="<?= htmlspecialchars($link) ?>" placeholder="Enlace no disponible"><button type="button" id="copyReferralLink" class="af-btn af-btn-primary" <?= $link === '' ? 'disabled' : '' ?>><i class="fas fa-copy"></i> Copiar enlace</button><?php if ($link !== ''): ?><a href="<?= htmlspecialchars($link) ?>" target="_blank" rel="noopener" class="af-btn af-btn-secondary"><i class="fas fa-arrow-up-right-from-square"></i> Abrir</a><?php endif; ?></div>
                    <span class="af-help">Al abrir este enlace, el código queda cargado automáticamente en el formulario de registro.</span>
                </div>
            </div>
        </div>
    </section>

    <section class="af-panel">
        <div class="af-panel-head"><div class="af-panel-title"><span class="af-panel-title-icon"><i class="fas fa-coins"></i></span><div><h2>Referidos y monederos</h2><p>Consulta su estado y usa Recargar para transferir parte de tu saldo al referido.</p></div></div></div>
        <div class="af-alert af-alert-info af-referral-credit-note"><i class="fas fa-circle-info"></i><div><strong>La recarga es una transferencia.</strong> El importe se descuenta de tu monedero y se acredita inmediatamente al monedero del referido. No crea saldo nuevo.</div></div>
        <div class="af-toolbar compact-3">
            <div class="af-field"><label class="af-label" for="referralSearch"><i class="fas fa-search"></i> Buscar</label><input id="referralSearch" type="search" class="af-control" placeholder="Nombre, correo o plan"></div>
            <div class="af-field"><label class="af-label" for="referralStatus"><i class="fas fa-gift"></i> Beneficio</label><select id="referralStatus" class="af-control"><option value="">Todos</option><option value="otorgado">Otorgado</option><option value="pendiente">Pendiente</option></select></div>
            <div class="af-field"><label class="af-label" for="referralPerPage"><i class="fas fa-list-ol"></i> Mostrar</label><select id="referralPerPage" class="af-control"><option value="25">25 registros</option><option value="50">50 registros</option><option value="100" selected>100 registros</option><option value="all">Todos</option></select></div>
            <div class="af-toolbar-actions"><button type="button" id="clearReferralFilters" class="af-btn af-btn-secondary"><i class="fas fa-eraser"></i> Limpiar</button></div>
        </div>
        <div class="af-list-meta"><span><?= number_format(count($data['rows'])) ?> registros</span><span id="referralPageSummary"></span></div>
        <div class="af-table-wrap"><table id="referralTable" class="af-table"><thead><tr><th>Referido</th><th>Plan</th><th>Suscripción</th><th>Saldo</th><th>Beneficio</th><th>Nueva vigencia</th><th>Acciones</th></tr></thead><tbody>
        <?php foreach ($data['rows'] as $row): $benefit = ($row['beneficio_estado'] ?? '') === 'otorgado' ? 'otorgado' : 'pendiente'; $active = in_array((string) ($row['suscripcion_estado'] ?? ''), ['activa', 'prueba'], true); ?>
            <tr data-af-row data-benefit="<?= $benefit ?>" data-search="<?= htmlspecialchars(($row['nombre_usuario'] ?? '') . ' ' . ($row['correo'] ?? '') . ' ' . ($row['nombre_plan'] ?? ''), ENT_QUOTES, 'UTF-8') ?>">
                <td><span class="af-row-title"><?= htmlspecialchars((string) $row['nombre_usuario']) ?></span><span class="af-row-sub"><?= htmlspecialchars((string) $row['correo']) ?></span></td>
                <td><?= htmlspecialchars((string) ($row['nombre_plan'] ?? 'Sin plan')) ?></td>
                <td><span class="af-badge <?= $active ? 'af-badge-success' : 'af-badge-neutral' ?>"><?= htmlspecialchars(ucfirst((string) ($row['suscripcion_estado'] ?? 'pendiente'))) ?></span></td>
                <td><strong><?= htmlspecialchars($currencySymbol) ?> <?= number_format((float) ($row['saldo'] ?? 0), 2) ?></strong></td>
                <td><?php if ($benefit === 'otorgado'): ?><span class="af-badge af-badge-success"><i class="fas fa-gift"></i> Un mes otorgado</span><?php else: ?><span class="af-badge af-badge-warning"><i class="fas fa-clock"></i> Esperando primer pago</span><?php endif; ?></td>
                <td><?= !empty($row['fecha_fin_nueva']) ? date('d/m/Y', strtotime((string) $row['fecha_fin_nueva'])) : '—' ?></td>
                <td><button type="button" class="af-btn af-btn-primary referral-credit-btn" data-id="<?= (int) $row['id'] ?>" data-name="<?= htmlspecialchars((string) $row['nombre_usuario'], ENT_QUOTES) ?>" data-email="<?= htmlspecialchars((string) $row['correo'], ENT_QUOTES) ?>" data-balance="<?= number_format((float) ($row['saldo'] ?? 0), 2, '.', '') ?>"><i class="fas fa-coins"></i> Recargar</button></td>
            </tr>
        <?php endforeach; ?>
        </tbody></table><div id="referralEmpty" class="af-empty" hidden><i class="fas fa-user-group"></i><strong>No se encontraron referidos</strong><div>Comparte tu enlace o modifica los filtros.</div></div></div>
        <div class="af-pagination-bar"><span class="af-pagination-summary">Solo puedes recargar a referidos directos registrados con tu código.</span><div id="referralPagination" class="af-pagination"></div></div>
    </section>
</div>

<div id="referralShareModal" class="af-modal-backdrop" aria-hidden="true">
    <section class="af-modal af-modal-sm" role="dialog" aria-modal="true" aria-labelledby="referralShareTitle">
        <div class="af-modal-head"><div class="af-modal-title"><span class="af-modal-icon" style="color:#15803d;background:#dcfce7"><i class="fab fa-whatsapp"></i></span><div><p class="af-eyebrow">INVITACIÓN PROFESIONAL</p><h2 id="referralShareTitle">Compartir código de referido</h2><p>Revisa el mensaje antes de copiarlo o enviarlo por WhatsApp.</p></div></div><button type="button" class="af-modal-close" data-af-close aria-label="Cerrar"><i class="fas fa-xmark"></i></button></div>
        <div class="af-modal-body"><div class="af-alert af-alert-info"><i class="fas fa-circle-info"></i><div>El enlace incluye tu código y lo carga automáticamente en el registro.</div></div><div class="af-field" style="margin-top:14px"><label class="af-label" for="referralInvitePreview"><i class="fas fa-message"></i> Vista previa del mensaje</label><textarea id="referralInvitePreview" class="af-control" rows="13" readonly><?= htmlspecialchars($inviteMessage) ?></textarea><span class="af-help">WhatsApp conserva las negritas marcadas con asteriscos y los iconos incluidos.</span></div></div>
        <div class="af-modal-footer"><button type="button" class="af-btn af-btn-secondary" data-af-close><i class="fas fa-xmark"></i> Cancelar</button><button type="button" id="copyReferralInvite" class="af-btn af-btn-primary" <?= $inviteMessage === '' ? 'disabled' : '' ?>><i class="fas fa-copy"></i> Copiar mensaje</button><a id="shareReferralWhatsapp" class="af-btn af-btn-success" href="<?= htmlspecialchars($whatsappShareUrl) ?>" target="_blank" rel="noopener" <?= $whatsappShareUrl === '' ? 'aria-disabled="true"' : '' ?>><i class="fab fa-whatsapp"></i> Abrir WhatsApp</a></div>
    </section>
</div>

<style>
.af-referral-credit-note{margin:14px 18px 0}.referral-credit-btn{min-height:34px;padding:6px 10px;font-size:11px;white-space:nowrap}.referral-credit-form{display:grid;gap:13px;text-align:left}.referral-credit-summary{display:grid;grid-template-columns:1fr 1fr;gap:9px}.referral-credit-summary span{padding:10px;border:1px solid #e2e8f0;border-radius:10px;background:#f8fafc}.referral-credit-summary small,.referral-credit-summary strong{display:block}.referral-credit-summary small{font-size:9px;text-transform:uppercase;font-weight:800;color:#64748b}.referral-credit-summary strong{margin-top:4px;color:#172033;font-size:12px}.referral-credit-form label{display:block;margin-bottom:6px;color:#263247;font-size:12px;font-weight:800}.referral-credit-form .swal2-input,.referral-credit-form .swal2-textarea{width:100%;margin:0;box-sizing:border-box}.referral-credit-warning{padding:10px 12px;border:1px solid #bfdbfe;border-radius:10px;background:#eff6ff;color:#1e40af;font-size:11px;line-height:1.5}@media(max-width:640px){.referral-credit-summary{grid-template-columns:1fr}}
</style>
<script>
document.addEventListener('DOMContentLoaded',()=>{
 const list=new AfenixAdmin.UnifiedList({table:'#referralTable',search:'#referralSearch',perPage:'#referralPerPage',filters:[{selector:'#referralStatus',data:'benefit'}],summary:'#referralPageSummary',pagination:'#referralPagination',empty:'#referralEmpty'});
 document.getElementById('clearReferralFilters').addEventListener('click',()=>{document.getElementById('referralSearch').value='';document.getElementById('referralStatus').value='';document.getElementById('referralPerPage').value='100';list.currentPage=1;list.render();});

 const shareModal=new AfenixAdmin.ModalController('#referralShareModal',{warnDirty:false});
 const toast=(title)=>Swal.fire({toast:true,position:'top-end',icon:'success',title,showConfirmButton:false,timer:1600});
 const escapeHtml=(value)=>String(value??'').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;').replace(/'/g,'&#039;');
 const csrf=<?= json_encode(Security::csrfToken(), JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) ?>;
 const ownBalance=<?= json_encode($ownBalance) ?>;
 const currencySymbol=<?= json_encode($currencySymbol, JSON_UNESCAPED_UNICODE) ?>;

 async function copyFrom(selector,title){const field=document.querySelector(selector);const value=field?.value?.trim()||'';if(!value)return;await AfenixAdmin.copy(value);toast(title)}
 document.getElementById('copyReferralCode')?.addEventListener('click',()=>copyFrom('#referralCode','Código copiado'));
 document.getElementById('copyReferralCodeTop')?.addEventListener('click',()=>copyFrom('#referralCode','Código copiado'));
 document.getElementById('copyReferralLink')?.addEventListener('click',()=>copyFrom('#referralLink','Enlace copiado'));
 document.getElementById('copyReferralInvite')?.addEventListener('click',()=>copyFrom('#referralInvitePreview','Mensaje copiado'));
 document.getElementById('openReferralShareModal')?.addEventListener('click',(event)=>shareModal.open(event.currentTarget));

 document.getElementById('referralTable')?.addEventListener('click',async(event)=>{
   const button=event.target.closest('.referral-credit-btn');
   if(!button)return;
   const recipientName=button.dataset.name||'Referido';
   const recipientBalance=Number(button.dataset.balance||0);
   const request=await Swal.fire({
     title:'<span style="display:flex;align-items:center;gap:9px"><i class="fas fa-coins" style="color:#dc2626"></i> Recargar saldo al referido</span>',
     html:`<div class="referral-credit-form">
       <div class="referral-credit-summary"><span><small>Referido</small><strong>${escapeHtml(recipientName)}</strong></span><span><small>Saldo actual</small><strong>${escapeHtml(currencySymbol)} ${recipientBalance.toFixed(2)}</strong></span><span><small>Tu saldo disponible</small><strong>${escapeHtml(currencySymbol)} ${Number(ownBalance).toFixed(2)}</strong></span><span><small>Operación</small><strong>Transferencia interna</strong></span></div>
       <div class="referral-credit-warning"><i class="fas fa-circle-info"></i> El monto se descontará de tu monedero y se acreditará al referido.</div>
       <div><label for="referralCreditAmount">Monto a transferir (${currencySymbol})</label><input id="referralCreditAmount" class="swal2-input" type="number" min="0.01" max="${Number(ownBalance).toFixed(2)}" step="0.01" inputmode="decimal" placeholder="Ejemplo: 20.00"></div>
       <div><label for="referralCreditDetail">Detalle opcional</label><textarea id="referralCreditDetail" class="swal2-textarea" maxlength="180" placeholder="Ejemplo: saldo para renovar el plan mensual"></textarea></div>
     </div>`,
     showCancelButton:true,confirmButtonText:'<i class="fas fa-arrow-right-arrow-left"></i> Transferir saldo',cancelButtonText:'Cancelar',confirmButtonColor:'#dc2626',focusConfirm:false,width:590,
     didOpen:()=>document.getElementById('referralCreditAmount')?.focus(),
     preConfirm:()=>{const amount=Number(document.getElementById('referralCreditAmount')?.value||0);const detail=String(document.getElementById('referralCreditDetail')?.value||'').trim();if(!Number.isFinite(amount)||amount<=0){Swal.showValidationMessage('Escribe un monto mayor que cero.');return false}if(amount>Number(ownBalance)+0.0001){Swal.showValidationMessage('El monto supera tu saldo disponible.');return false}return{amount,detail}}
   });
   if(!request.isConfirmed||!request.value)return;
   Swal.fire({title:'Transfiriendo saldo',text:'Estamos registrando ambos movimientos de monedero.',allowOutsideClick:false,allowEscapeKey:false,didOpen:()=>Swal.showLoading()});
   try{
     const body=new URLSearchParams({action:'transfer_referral_credit',id_referido:button.dataset.id,monto:String(request.value.amount),descripcion:request.value.detail,_csrf:csrf});
     const response=await fetch('mis_referidos.php',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded;charset=UTF-8'},body,credentials:'same-origin'});
     const result=await response.json().catch(()=>({success:false,message:'El servidor devolvió una respuesta no válida.'}));
     if(!response.ok||!result.success)throw new Error(result.message||'No se pudo completar la transferencia.');
     await Swal.fire({icon:'success',title:'Saldo recargado',html:`${result.message}<br><strong>Tu nuevo saldo: ${currencySymbol} ${Number(result.sender_balance).toFixed(2)}</strong>`,confirmButtonColor:'#dc2626'});
     location.reload();
   }catch(error){Swal.fire('No se pudo recargar',error.message||'Ocurrió un error inesperado.','error')}
 });
});
</script>
<?php require_once __DIR__ . '/admin_footer.php'; ?>
