<?php

declare(strict_types=1);

require_once __DIR__ . '/init.php';

if (!tiene_permiso('gestionar_mensajes')) {
    $expectsJson = isset($_REQUEST['action']) || Security::expectsJson();
    if ($expectsJson) {
        Security::json(['success' => false, 'message' => 'No tienes permiso para gestionar los mensajes del sistema.'], 403);
    }
    $_SESSION['flash_message'] = ['type' => 'error', 'text' => 'No tienes permiso para ver esta página.'];
    header('Location: index.php');
    exit;
}

/** @return array{key:string,label:string,icon:string,tone:string} */
function afenixx_message_category(string $key): array
{
    if (str_starts_with($key, 'API_TITULO_')) {
        return ['key' => 'titulos', 'label' => 'Títulos de alertas', 'icon' => 'fa-heading', 'tone' => 'blue'];
    }
    if (str_contains($key, 'CUENTA_') || str_contains($key, 'ACCESO_')) {
        return ['key' => 'acceso', 'label' => 'Acceso y cuentas', 'icon' => 'fa-shield-halved', 'tone' => 'warning'];
    }
    if (str_contains($key, 'SUSCRIPCION') || str_contains($key, 'SERVICIO_SUSPENDIDO')) {
        return ['key' => 'suscripcion', 'label' => 'Suscripciones', 'icon' => 'fa-calendar-xmark', 'tone' => 'danger'];
    }
    if (str_starts_with($key, 'API_')) {
        return ['key' => 'api', 'label' => 'Consulta y API', 'icon' => 'fa-code', 'tone' => 'violet'];
    }
    return ['key' => 'sistema', 'label' => 'Sistema', 'icon' => 'fa-gear', 'tone' => 'success'];
}

/** @return string[] */
function afenixx_message_variables(string $key): array
{
    return match ($key) {
        'API_CUENTA_VENDIDA_VENCIDA' => ['{correo}', '{fecha_vencimiento}', '{cliente}'],
        'API_USO_LIMITE_ALCANZADO' => ['{limite}'],
        default => [],
    };
}

$action = trim((string) ($_REQUEST['action'] ?? ''));
if ($action !== '') {
    Security::headers(true);

    if ($action === 'fetch_data') {
        $key = trim((string) ($_GET['clave'] ?? ''));
        if ($key === '' || !preg_match('/^[A-Z0-9_]{2,50}$/', $key)) {
            Security::json(['success' => false, 'message' => 'La clave solicitada no es válida.'], 422);
        }

        $stmt = $pdo->prepare('SELECT clave, contenido, descripcion FROM mensajes_sistema WHERE clave = ? LIMIT 1');
        $stmt->execute([$key]);
        $message = $stmt->fetch(PDO::FETCH_ASSOC);
        if (!$message) {
            Security::json(['success' => false, 'message' => 'No se encontró el mensaje solicitado.'], 404);
        }

        $category = afenixx_message_category($key);
        $message['categoria'] = $category['label'];
        $message['variables'] = afenixx_message_variables($key);
        Security::json(['success' => true, 'data' => $message]);
    }

    if ($action === 'guardar_mensaje') {
        if (strtoupper((string) ($_SERVER['REQUEST_METHOD'] ?? 'GET')) !== 'POST') {
            Security::json(['success' => false, 'message' => 'Método no permitido.'], 405);
        }
        Security::requireCsrf();

        $key = trim((string) ($_POST['clave'] ?? ''));
        $content = trim((string) ($_POST['contenido'] ?? ''));
        if ($key === '' || !preg_match('/^[A-Z0-9_]{2,50}$/', $key)) {
            Security::json(['success' => false, 'message' => 'La clave del mensaje no es válida.'], 422);
        }
        if ($content === '') {
            Security::json(['success' => false, 'message' => 'El contenido del mensaje es obligatorio.'], 422);
        }
        if (mb_strlen($content, 'UTF-8') > 2000) {
            Security::json(['success' => false, 'message' => 'El mensaje no puede superar los 2,000 caracteres.'], 422);
        }

        $stmt = $pdo->prepare('UPDATE mensajes_sistema SET contenido = ? WHERE clave = ?');
        $stmt->execute([$content, $key]);
        if ($stmt->rowCount() === 0) {
            $exists = $pdo->prepare('SELECT COUNT(*) FROM mensajes_sistema WHERE clave = ?');
            $exists->execute([$key]);
            if ((int) $exists->fetchColumn() === 0) {
                Security::json(['success' => false, 'message' => 'El mensaje ya no existe. Recarga la página.'], 404);
            }
        }

        $_SESSION['system_messages'][$key] = $content;
        Security::json([
            'success' => true,
            'message' => 'Mensaje actualizado correctamente. El nuevo texto se usará en las próximas consultas.',
        ]);
    }

    Security::json(['success' => false, 'message' => 'Acción no reconocida.'], 400);
}

$errorMessage = '';
try {
    $messages = $pdo->query('SELECT clave, contenido, descripcion FROM mensajes_sistema ORDER BY clave ASC')->fetchAll(PDO::FETCH_ASSOC);
} catch (Throwable $e) {
    error_log('[gestionar_mensajes] ' . $e->getMessage());
    $errorMessage = 'No se pudieron cargar los mensajes del sistema.';
    $messages = [];
}

$categoryCounts = ['api' => 0, 'titulos' => 0, 'acceso' => 0, 'suscripcion' => 0, 'sistema' => 0];
foreach ($messages as &$message) {
    $message['_category'] = afenixx_message_category((string) $message['clave']);
    $message['_variables'] = afenixx_message_variables((string) $message['clave']);
    $categoryCounts[$message['_category']['key']] = ($categoryCounts[$message['_category']['key']] ?? 0) + 1;
}
unset($message);

$titulo_pagina = 'Gestionar Mensajes del Sistema';
require_once __DIR__ . '/admin_header.php';
require_once __DIR__ . '/includes/superadmin_ui_helpers.php';
?>
<div class="sa-page sa-communication-page">
<?php
sa_render_module_hero([
    'icon' => 'fa-bell',
    'eyebrow' => 'COMUNICACIÓN · RESPUESTAS DEL SISTEMA',
    'title' => 'Mensajes',
    'description' => 'Administra los textos que la consulta pública, la consulta privada y la API muestran ante validaciones, vencimientos y errores.',
    'count' => count($messages),
]);
sa_render_summary_cards([
    ['label' => 'Mensajes configurables', 'value' => count($messages), 'icon' => 'fa-message', 'hint' => 'Catálogo completo'],
    ['label' => 'Consulta y API', 'value' => $categoryCounts['api'], 'icon' => 'fa-code', 'tone' => 'is-violet', 'hint' => 'Respuestas de validación'],
    ['label' => 'Acceso y cuentas', 'value' => $categoryCounts['acceso'], 'icon' => 'fa-shield-halved', 'tone' => 'is-amber', 'hint' => 'Avisos de servicio'],
    ['label' => 'Títulos de alertas', 'value' => $categoryCounts['titulos'], 'icon' => 'fa-heading', 'tone' => 'is-blue', 'hint' => 'Encabezados visibles'],
]);
?>

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



<section class="sa-records-panel">
    <header class="sa-records-panel__header">
        <div class="sa-records-panel__heading">
            <span class="sa-records-panel__icon"><i class="fas fa-list-ul"></i></span>
            <div><h2>Mensajes configurados</h2><p>Filtra por área y revisa en qué situación se utiliza cada respuesta.</p></div>
        </div>
    </header>

    <div class="sa-records-filters sa-communication-filters">
        <div class="sa-filter-field">
            <label for="messageSearch"><i class="fas fa-magnifying-glass"></i> Buscar</label>
            <div class="sa-filter-control"><i class="fas fa-magnifying-glass"></i><input id="messageSearch" type="search" placeholder="Clave, descripción o contenido"></div>
        </div>
        <div class="sa-filter-field">
            <label for="messageCategory"><i class="fas fa-layer-group"></i> Área</label>
            <select id="messageCategory">
                <option value="">Todas</option>
                <option value="api">Consulta y API</option>
                <option value="acceso">Acceso y cuentas</option>
                <option value="suscripcion">Suscripciones</option>
                <option value="titulos">Títulos de alertas</option>
                <option value="sistema">Sistema</option>
            </select>
        </div>
        <div class="sa-filter-field">
            <label for="messagePerPage"><i class="fas fa-list-ol"></i> Mostrar</label>
            <select id="messagePerPage"><option value="100">100 registros</option><option value="200">200 registros</option><option value="400">400 registros</option><option value="all">Todos</option></select>
        </div>
        <div class="sa-filter-actions"><button type="button" id="clearMessageFilters" class="sa-btn sa-btn--secondary"><i class="fas fa-eraser"></i> Limpiar</button></div>
    </div>

    <div class="sa-records-counter-row"><span><?= count($messages) ?> mensajes registrados</span><div id="messageSummary" class="sa-records-counter"></div></div>
    <div class="sa-records-table-wrap">
        <table id="messageTable" class="sa-records-table">
            <thead><tr><th>Clave y área</th><th>Uso interno</th><th class="sa-content-column sa-preview-column">Contenido visible</th><th class="is-center is-actions-col">Acciones</th></tr></thead>
            <tbody>
            <?php foreach ($messages as $message): ?>
                <?php $category = $message['_category']; $variables = $message['_variables']; ?>
                <tr data-af-row data-category="<?= sa_e($category['key']) ?>" data-search="<?= sa_e($message['clave'] . ' ' . $category['label'] . ' ' . ($message['descripcion'] ?? '') . ' ' . $message['contenido']) ?>">
                    <td>
                        <span class="sa-table-primary sa-code-key"><i class="fas fa-key"></i><?= sa_e($message['clave']) ?></span>
                        <span class="sa-table-secondary"><i class="fas <?= sa_e($category['icon']) ?>"></i> <?= sa_e($category['label']) ?></span>
                    </td>
                    <td>
                        <span class="sa-message-description"><?= sa_e((string) ($message['descripcion'] ?? 'Sin descripción interna.')) ?></span>
                        <?php if ($variables): ?><span class="sa-table-secondary">Variables: <?= sa_e(implode(', ', $variables)) ?></span><?php endif; ?>
                    </td>
                    <td class="sa-content-column sa-preview-column"><span class="sa-message-content-preview" title="<?= sa_e($message['contenido']) ?>"><?= sa_e($message['contenido']) ?></span></td>
                    <td class="is-center is-actions-col"><div class="sa-record-actions"><button type="button" class="sa-icon-action sa-icon-action--edit js-edit-message" data-key="<?= sa_e($message['clave']) ?>" title="Editar mensaje"><i class="fas fa-pen"></i></button></div></td>
                </tr>
            <?php endforeach; ?>
            </tbody>
        </table>
        <div id="messageEmpty" class="sa-inline-empty" hidden><i class="fas fa-message"></i><strong>No hay mensajes que coincidan</strong><span>Prueba con otros filtros o limpia la búsqueda.</span></div>
    </div>
    <footer class="sa-records-footer"><span class="sa-records-footer__note">Los mensajes organizan las respuestas visibles utilizadas por consultas, accesos y procesos del sistema.</span><div id="messagePagination" class="sa-pagination"></div></footer>
</section>
</div>

<div id="messageModal" class="af-modal-backdrop" aria-hidden="true">
    <section class="af-modal af-modal-lg sa-communication-modal sa-message-modal" role="dialog" aria-modal="true" aria-labelledby="messageModalTitle">
        <header class="af-modal-head sa-communication-modal__head">
            <div class="af-modal-title"><span class="af-modal-icon"><i class="fas fa-message"></i></span><div><h2 id="messageModalTitle">Editar mensaje</h2><p>Actualiza el contenido visible y comprueba el resultado antes de guardar.</p></div></div>
            <button type="button" class="af-modal-close" data-af-close aria-label="Cerrar"><i class="fas fa-xmark"></i></button>
        </header>
        <form id="messageForm">
            <?= Security::csrfField() ?>
            <input type="hidden" name="action" value="guardar_mensaje">
            <div class="af-modal-body sa-communication-modal__body">
                <div class="sa-editor-layout sa-editor-layout--message">
                    <section class="sa-editor-panel">
                        <div class="sa-editor-section-title"><span><i class="fas fa-pen-to-square"></i></span><div><strong>Contenido del mensaje</strong><small>Revisa el contexto y edita únicamente el texto visible.</small></div></div>
                        <div class="sa-editor-fields-grid">
                            <div><label class="af-label" for="messageKey"><i class="fas fa-key"></i> Clave</label><input id="messageKey" name="clave" class="af-control" readonly></div>
                            <div><label class="af-label" for="messageArea"><i class="fas fa-layer-group"></i> Área</label><input id="messageArea" class="af-control" readonly></div>
                            <div class="full"><label class="af-label" for="messageDescription"><i class="fas fa-circle-info"></i> Cuándo se utiliza</label><textarea id="messageDescription" class="af-control" rows="2" readonly></textarea></div>
                            <div class="full sa-editor-message-field"><label class="af-label" for="messageContent"><i class="fas fa-align-left"></i> Mensaje *</label><textarea id="messageContent" name="contenido" class="af-control" rows="7" maxlength="2000" required placeholder="Escribe el mensaje que verá el usuario..."></textarea><div class="sa-field-meta"><span id="messageVariables">Sin variables especiales.</span><span id="messageCharacters">0 / 2000</span></div></div>
                        </div>
                    </section>
                    <aside class="sa-editor-preview-panel">
                        <div class="sa-editor-section-title"><span><i class="fas fa-eye"></i></span><div><strong>Vista previa</strong><small>Resultado estimado con datos de ejemplo.</small></div></div>
                        <div class="sa-system-preview">
                            <div class="sa-system-preview__head"><span><i class="fas fa-bell"></i> Mensaje del sistema</span><span class="sa-system-preview__status">Vista previa</span></div>
                            <div id="messagePreview" class="sa-system-preview__content"></div>
                        </div>
                    </aside>
                </div>
            </div>
            <footer class="af-modal-footer sa-communication-modal__footer"><button type="button" class="af-btn af-btn-secondary" data-af-close>Cancelar</button><button type="submit" class="af-btn af-btn-primary"><i class="fas fa-floppy-disk"></i> Guardar mensaje</button></footer>
        </form>
    </section>
</div>

<script>
document.addEventListener('DOMContentLoaded', () => {
    const list = new AfenixAdmin.UnifiedList({
        table: '#messageTable', search: '#messageSearch', perPage: '#messagePerPage',
        filters: [{selector: '#messageCategory', data: 'category'}],
        summary: '#messageSummary', pagination: '#messagePagination', empty: '#messageEmpty'
    });

    document.getElementById('clearMessageFilters')?.addEventListener('click', () => {
        document.getElementById('messageSearch').value = '';
        document.getElementById('messageCategory').value = '';
        document.getElementById('messagePerPage').value = '100';
        list.currentPage = 1; list.render();
    });

    const modal = new AfenixAdmin.ModalController('#messageModal');
    const form = document.getElementById('messageForm');
    const content = document.getElementById('messageContent');
    let currentVariables = [];

    const samples = {
        '{correo}': 'cliente@correo.com',
        '{fecha_vencimiento}': '22/07/2026',
        '{cliente}': 'Cliente de ejemplo',
        '{limite}': '100'
    };
    const updatePreview = () => {
        let text = content.value || 'Escribe el contenido del mensaje para visualizarlo aquí.';
        currentVariables.forEach(variable => { text = text.split(variable).join(samples[variable] || variable); });
        document.getElementById('messagePreview').textContent = text;
        document.getElementById('messageCharacters').textContent = `${content.value.length} / 2000`;
    };
    content?.addEventListener('input', updatePreview);

    document.getElementById('messageTable')?.addEventListener('click', async (event) => {
        const button = event.target.closest('.js-edit-message');
        if (!button) return;
        try {
            const result = await AfenixAdmin.request(`gestionar_mensajes.php?action=fetch_data&clave=${encodeURIComponent(button.dataset.key)}`);
            const data = result.data;
            form.reset();
            document.getElementById('messageKey').value = data.clave || '';
            document.getElementById('messageArea').value = data.categoria || 'Sistema';
            document.getElementById('messageDescription').value = data.descripcion || '';
            content.value = data.contenido || '';
            currentVariables = Array.isArray(data.variables) ? data.variables : [];
            document.getElementById('messageVariables').innerHTML = currentVariables.length
                ? `<strong>Variables disponibles:</strong> ${currentVariables.map(v => `<code>${v}</code>`).join(' ')}`
                : 'Este mensaje no utiliza variables especiales.';
            updatePreview(); modal.open(button);
        } catch (error) { Swal.fire('Error', error.message, 'error'); }
    });

    form?.addEventListener('submit', async (event) => {
        event.preventDefault();
        const submit = form.querySelector('button[type="submit"]');
        submit.disabled = true;
        Swal.fire({title: 'Guardando mensaje…', text: 'Aplicando el nuevo contenido.', allowOutsideClick: false, didOpen: () => Swal.showLoading()});
        try {
            const result = await AfenixAdmin.request('gestionar_mensajes.php', {method: 'POST', body: new FormData(form), headers: {'X-Requested-With': 'XMLHttpRequest'}});
            modal.clean(); modal.close(true);
            await Swal.fire('Mensaje actualizado', result.message, 'success');
            location.reload();
        } catch (error) { Swal.fire('No se pudo guardar', error.message, 'error'); }
        finally { submit.disabled = false; }
    });
});
</script>
<?php require_once __DIR__ . '/admin_footer.php'; ?>
