<?php

declare(strict_types=1);

require_once __DIR__ . '/init.php';
require_once dirname(__DIR__) . '/lib/CryptoService.php';

if (!es_superadmin()) {
    http_response_code(403);
    exit('Acceso denegado');
}

$settings = [
    // Identidad y archivos
    'marca_nombre' => ['default' => 'Ave Fénix', 'type' => 'texto'],
    'marca_nombre_corto' => ['default' => 'Fénix', 'type' => 'texto'],
    'marca_eslogan' => ['default' => 'Gestión profesional de consultas', 'type' => 'texto'],
    'marca_descripcion' => ['default' => 'Plataforma de consultas y administración de servicios digitales.', 'type' => 'texto'],
    'marca_logo' => ['default' => 'assets/img/logo.png', 'type' => 'archivo'],
    'marca_favicon' => ['default' => 'assets/img/logo.png', 'type' => 'archivo'],
    'marca_fondo_login' => ['default' => 'assets/img/fondo.jpg', 'type' => 'archivo'],
    'marca_footer' => ['default' => '© Ave Fénix. Todos los derechos reservados.', 'type' => 'texto'],
    'marca_copyright' => ['default' => 'Ave Fénix', 'type' => 'texto'],
    'marca_header_subtitulo' => ['default' => 'Consulta y entrega de códigos', 'type' => 'texto'],
    'marca_footer_subtitulo' => ['default' => 'Soporte y acceso seguro', 'type' => 'texto'],
    'marca_footer_soporte_texto' => ['default' => 'Soporte', 'type' => 'texto'],
    'marca_footer_icono' => ['default' => '', 'type' => 'archivo'],
    'marca_soporte_mensaje' => ['default' => 'Hola, necesito soporte con la plataforma.', 'type' => 'texto'],

    // Cabecera y pie del panel administrativo
    'marca_admin_header_subtitulo' => ['default' => 'Panel administrativo', 'type' => 'texto'],
    'marca_admin_consultas_titulo' => ['default' => 'Consultas', 'type' => 'texto'],
    'marca_admin_consultas_subtitulo' => ['default' => 'Abrir códigos', 'type' => 'texto'],
    'marca_admin_sitio_titulo' => ['default' => 'Sitio web', 'type' => 'texto'],
    'marca_admin_sitio_subtitulo' => ['default' => 'Vista pública', 'type' => 'texto'],
    'marca_admin_footer_sesion' => ['default' => 'Sesión segura', 'type' => 'texto'],
    'mostrar_marca_desarrollador' => ['default' => '1', 'type' => 'booleano'],

    // Paleta
    'marca_paleta' => ['default' => 'fenix', 'type' => 'texto'],
    'marca_color_primario' => ['default' => '#dc2626', 'type' => 'color'],
    'marca_color_secundario' => ['default' => '#7f1d1d', 'type' => 'color'],
    'marca_color_acento' => ['default' => '#f59e0b', 'type' => 'color'],
    'marca_color_sidebar' => ['default' => '#08111f', 'type' => 'color'],
    'marca_color_fondo' => ['default' => '#f4f7fb', 'type' => 'color'],
    'marca_color_boton' => ['default' => '#dc2626', 'type' => 'color'],
    'marca_color_boton_texto' => ['default' => '#ffffff', 'type' => 'color'],
    'marca_color_header_publico' => ['default' => '#ffffff', 'type' => 'color'],
    'marca_color_header_publico_texto' => ['default' => '#0f172a', 'type' => 'color'],
    'marca_color_header_admin' => ['default' => '#ffffff', 'type' => 'color'],
    'marca_color_header_admin_texto' => ['default' => '#0f172a', 'type' => 'color'],
    'marca_color_footer' => ['default' => '#08111f', 'type' => 'color'],
    'marca_color_footer_texto' => ['default' => '#cbd5e1', 'type' => 'color'],
    'marca_color_iconos_publicos' => ['default' => '#dc2626', 'type' => 'color'],
    'marca_color_iconos_admin' => ['default' => '#dc2626', 'type' => 'color'],

    // Colores específicos de la portada pública y planes
    'marca_index_paleta' => ['default' => 'fenix', 'type' => 'texto'],
    'marca_index_fondo' => ['default' => '#ffffff', 'type' => 'color'],
    'marca_index_superficie' => ['default' => '#ffffff', 'type' => 'color'],
    'marca_index_fondo_suave' => ['default' => '#f6f8fc', 'type' => 'color'],
    'marca_index_texto' => ['default' => '#0b1220', 'type' => 'color'],
    'marca_index_texto_secundario' => ['default' => '#64748b', 'type' => 'color'],
    'marca_index_oscuro' => ['default' => '#08111f', 'type' => 'color'],
    'marca_index_oscuro_secundario' => ['default' => '#111c30', 'type' => 'color'],
    'marca_index_texto_oscuro' => ['default' => '#ffffff', 'type' => 'color'],
    'marca_plan_tarjeta' => ['default' => '#ffffff', 'type' => 'color'],
    'marca_plan_borde' => ['default' => '#dfe6ef', 'type' => 'color'],
    'marca_plan_destacado' => ['default' => '#fff7f7', 'type' => 'color'],
    'marca_plan_precio_fondo' => ['default' => '#f8fafc', 'type' => 'color'],

    // Contacto, legal, SEO y región
    'marca_pais' => ['default' => 'Perú', 'type' => 'texto'],
    'marca_horario_soporte' => ['default' => 'Lunes a sábado de 9:00 a 18:00', 'type' => 'texto'],
    'marca_whatsapp' => ['default' => '', 'type' => 'texto'],
    'marca_seo_titulo' => ['default' => 'Ave Fénix', 'type' => 'texto'],
    'marca_seo_descripcion' => ['default' => 'Sistema profesional de consultas y administración.', 'type' => 'texto'],
    'marca_seo_keywords' => ['default' => 'consultas, streaming, panel administrativo, marca blanca', 'type' => 'texto'],
    'moneda' => ['default' => 'PEN', 'type' => 'texto'],
    'moneda_simbolo' => ['default' => 'S/', 'type' => 'texto'],
    'idioma' => ['default' => 'es', 'type' => 'texto'],
    'zona_horaria' => ['default' => 'America/Lima', 'type' => 'texto'],
    'formato_fecha' => ['default' => 'd/m/Y', 'type' => 'texto'],
    'referidos_activos' => ['default' => '1', 'type' => 'booleano'],

    // Correo saliente para restablecimientos
    'mail_transport' => ['default' => 'auto', 'type' => 'texto'],
    'mail_host' => ['default' => '', 'type' => 'texto'],
    'mail_port' => ['default' => '587', 'type' => 'numero'],
    'mail_encryption' => ['default' => 'tls', 'type' => 'texto'],
    'mail_username' => ['default' => '', 'type' => 'texto'],
    'mail_password_enc' => ['default' => '', 'type' => 'secreto'],
    'mail_from_email' => ['default' => '', 'type' => 'texto'],
    'mail_from_name' => ['default' => 'Ave Fénix', 'type' => 'texto'],
    'mail_verify_peer' => ['default' => '1', 'type' => 'booleano'],

    // Login
    'marca_login_titulo' => ['default' => 'Iniciar sesión', 'type' => 'texto'],
    'marca_login_eyebrow' => ['default' => 'ACCESO SEGURO', 'type' => 'texto'],
    'marca_login_hero_titulo' => ['default' => 'Centraliza tus códigos de acceso y entrégalos de forma automática desde el primer día.', 'type' => 'texto'],
    'marca_login_hero_descripcion' => ['default' => 'Configura buzones, dominios y asuntos para localizar y entregar códigos con rapidez.', 'type' => 'texto'],
    'marca_login_form_titulo' => ['default' => 'Bienvenido de nuevo', 'type' => 'texto'],
    'marca_login_form_descripcion' => ['default' => 'Ingresa con el correo y la contraseña que registraste al crear tu cuenta.', 'type' => 'texto'],
    'marca_login_correo_label' => ['default' => 'Correo electrónico', 'type' => 'texto'],
    'marca_login_correo_placeholder' => ['default' => 'correo@dominio.com', 'type' => 'texto'],
    'marca_login_correo_ayuda' => ['default' => 'Utiliza el correo registrado para administrar tu cuenta.', 'type' => 'texto'],
    'marca_login_clave_label' => ['default' => 'Contraseña', 'type' => 'texto'],
    'marca_login_clave_placeholder' => ['default' => 'Ingresa tu contraseña', 'type' => 'texto'],
    'marca_login_recordar' => ['default' => 'Recordar mi correo', 'type' => 'texto'],
    'marca_login_olvido' => ['default' => '¿Olvidaste tu contraseña?', 'type' => 'texto'],
    'marca_login_boton' => ['default' => 'Iniciar sesión', 'type' => 'texto'],
    'marca_login_sin_cuenta' => ['default' => '¿No tienes cuenta?', 'type' => 'texto'],
    'marca_login_registro' => ['default' => 'Crear una cuenta', 'type' => 'texto'],
    'marca_login_seguridad_titulo' => ['default' => 'Tu acceso está protegido', 'type' => 'texto'],
    'marca_login_seguridad_texto' => ['default' => 'La contraseña no se guarda en cookies ni se muestra dentro del sistema.', 'type' => 'texto'],

    // Registro
    'marca_registro_titulo' => ['default' => 'Crear cuenta', 'type' => 'texto'],
    'marca_registro_eyebrow' => ['default' => 'EMPIEZA TU OPERACIÓN', 'type' => 'texto'],
    'marca_registro_hero_titulo' => ['default' => 'Centraliza tus códigos de acceso y entrégalos de forma automática desde el primer día.', 'type' => 'texto'],
    'marca_registro_hero_descripcion' => ['default' => 'Configura buzones, dominios y asuntos para entregar códigos con rapidez.', 'type' => 'texto'],
    'marca_registro_form_titulo' => ['default' => 'Crear mi cuenta', 'type' => 'texto'],
    'marca_registro_form_descripcion' => ['default' => 'Completa tus datos. Los campos de teléfono y referido son opcionales.', 'type' => 'texto'],
    'marca_registro_nombre_label' => ['default' => 'Nombre completo', 'type' => 'texto'],
    'marca_registro_nombre_placeholder' => ['default' => 'Nombres y apellidos', 'type' => 'texto'],
    'marca_registro_correo_label' => ['default' => 'Correo electrónico', 'type' => 'texto'],
    'marca_registro_correo_placeholder' => ['default' => 'correo@dominio.com', 'type' => 'texto'],
    'marca_registro_telefono_label' => ['default' => 'Teléfono', 'type' => 'texto'],
    'marca_registro_clave_label' => ['default' => 'Contraseña', 'type' => 'texto'],
    'marca_registro_confirmar_label' => ['default' => 'Confirmar contraseña', 'type' => 'texto'],
    'marca_registro_referido_label' => ['default' => 'Código de referido', 'type' => 'texto'],
    'marca_registro_terminos' => ['default' => 'Acepto los términos de uso y la política de privacidad del servicio.', 'type' => 'texto'],
    'marca_registro_boton' => ['default' => 'Crear mi cuenta', 'type' => 'texto'],
    'marca_registro_tiene_cuenta' => ['default' => '¿Ya tienes una cuenta?', 'type' => 'texto'],
    'marca_registro_login' => ['default' => 'Iniciar sesión', 'type' => 'texto'],

    // Recuperación
    'marca_recuperar_titulo' => ['default' => 'Recuperar contraseña', 'type' => 'texto'],
    'marca_recuperar_eyebrow' => ['default' => 'RESTABLECER ACCESO', 'type' => 'texto'],
    'marca_recuperar_hero_titulo' => ['default' => 'Recupera tu cuenta mediante un enlace temporal y seguro.', 'type' => 'texto'],
    'marca_recuperar_hero_descripcion' => ['default' => 'La respuesta visible es siempre la misma para proteger la privacidad.', 'type' => 'texto'],
    'marca_recuperar_form_titulo' => ['default' => '¿Olvidaste tu contraseña?', 'type' => 'texto'],
    'marca_recuperar_form_descripcion' => ['default' => 'Ingresa tu correo y te enviaremos instrucciones para crear una nueva contraseña.', 'type' => 'texto'],
    'marca_recuperar_correo_label' => ['default' => 'Correo electrónico', 'type' => 'texto'],
    'marca_recuperar_correo_placeholder' => ['default' => 'correo@dominio.com', 'type' => 'texto'],
    'marca_recuperar_boton' => ['default' => 'Enviar instrucciones', 'type' => 'texto'],
    'marca_recuperar_volver' => ['default' => 'Iniciar sesión', 'type' => 'texto'],

    // Nueva contraseña
    'marca_reset_titulo' => ['default' => 'Crear nueva contraseña', 'type' => 'texto'],
    'marca_reset_eyebrow' => ['default' => 'ENLACE TEMPORAL', 'type' => 'texto'],
    'marca_reset_hero_titulo' => ['default' => 'Define una contraseña nueva para recuperar el acceso.', 'type' => 'texto'],
    'marca_reset_hero_descripcion' => ['default' => 'El enlace es de un solo uso y queda invalidado al actualizar la contraseña.', 'type' => 'texto'],
    'marca_reset_form_titulo' => ['default' => 'Nueva contraseña', 'type' => 'texto'],
    'marca_reset_form_descripcion' => ['default' => 'Utiliza una combinación segura de al menos 10 caracteres.', 'type' => 'texto'],
    'marca_reset_clave_label' => ['default' => 'Nueva contraseña', 'type' => 'texto'],
    'marca_reset_confirmar_label' => ['default' => 'Confirmar contraseña', 'type' => 'texto'],
    'marca_reset_boton' => ['default' => 'Actualizar contraseña', 'type' => 'texto'],
    'marca_reset_nuevo_enlace' => ['default' => 'Solicitar un enlace nuevo', 'type' => 'texto'],

    // Consulta pública y acceso con ID
    'marca_consulta_titulo_pagina' => ['default' => 'Consulta Pública', 'type' => 'texto'],
    'marca_consulta_titulo' => ['default' => 'Consulta y validación de códigos', 'type' => 'texto'],
    'marca_consulta_subtitulo' => ['default' => 'Selecciona una plataforma e ingresa el correo completo.', 'type' => 'texto'],
    'marca_consulta_correo_label' => ['default' => 'Consultar correo', 'type' => 'texto'],
    'marca_consulta_correo_placeholder' => ['default' => 'Ingresa la cuenta a consultar', 'type' => 'texto'],
    'marca_consulta_boton' => ['default' => 'Consultar', 'type' => 'texto'],
    'marca_consulta_instrucciones_titulo' => ['default' => 'Instrucciones de uso', 'type' => 'texto'],
    'marca_consulta_instruccion_1' => ['default' => 'Selecciona la plataforma de la lista.', 'type' => 'texto'],
    'marca_consulta_instruccion_2' => ['default' => 'Ingresa el correo electrónico completo.', 'type' => 'texto'],
    'marca_consulta_instruccion_3' => ['default' => 'Pulsa el botón Consultar.', 'type' => 'texto'],
    'marca_consulta_instruccion_4' => ['default' => 'Revisa los mensajes encontrados.', 'type' => 'texto'],
    'marca_consulta_instruccion_5' => ['default' => 'Abre el contenido público o ingresa con ID para el contenido privado.', 'type' => 'texto'],
    'marca_consulta_login_eyebrow' => ['default' => 'CONSULTA PRIVADA', 'type' => 'texto'],
    'marca_consulta_login_titulo' => ['default' => 'Ingresa con tu ID de acceso', 'type' => 'texto'],
    'marca_consulta_login_descripcion' => ['default' => 'Utiliza el código entregado por tu administrador para consultar los mensajes autorizados.', 'type' => 'texto'],
    'marca_consulta_login_label' => ['default' => 'ID de consulta o ID de cuenta', 'type' => 'texto'],
    'marca_consulta_login_placeholder' => ['default' => 'Ejemplo: REV-K7M2P941', 'type' => 'texto'],
    'marca_consulta_login_boton' => ['default' => 'Ingresar a la consulta', 'type' => 'texto'],
    'marca_consulta_login_seguridad' => ['default' => 'El ID solo habilita los accesos que tu administrador haya asociado.', 'type' => 'texto'],
    'marca_consulta_login_beneficio_1_titulo' => ['default' => 'Acceso por ID de consulta', 'type' => 'texto'],
    'marca_consulta_login_beneficio_1_texto' => ['default' => 'Ingresa el ID asignado a tu operación para revisar únicamente los mensajes autorizados.', 'type' => 'texto'],
    'marca_consulta_login_beneficio_2_titulo' => ['default' => 'Acceso por ID de cuenta', 'type' => 'texto'],
    'marca_consulta_login_beneficio_2_texto' => ['default' => 'Utiliza el código individual de la cuenta para abrir de forma segura el servicio que te corresponde.', 'type' => 'texto'],

    'marca_registro_beneficio_1_titulo' => ['default' => 'Registro rápido', 'type' => 'texto'],
    'marca_registro_beneficio_1_texto' => ['default' => 'Crea tu cuenta en pocos pasos y entra al panel para comenzar la configuración.', 'type' => 'texto'],
    'marca_registro_beneficio_2_titulo' => ['default' => 'Prueba gratuita incluida', 'type' => 'texto'],
    'marca_registro_beneficio_2_texto' => ['default' => 'Conoce las herramientas disponibles durante el periodo de evaluación configurado para tu cuenta.', 'type' => 'texto'],
    'marca_registro_beneficio_3_titulo' => ['default' => 'Todo listo para organizarte', 'type' => 'texto'],
    'marca_registro_beneficio_3_texto' => ['default' => 'Administra clientes, cuentas, buzones y consultas desde una sola plataforma.', 'type' => 'texto'],


    // Panel comercial compartido por login y recuperación
    'marca_auth_panel_eyebrow' => ['default' => 'PLATAFORMA PROFESIONAL', 'type' => 'texto'],
    'marca_auth_panel_titulo' => ['default' => 'Convierte la entrega de códigos en una operación rápida, ordenada y confiable.', 'type' => 'texto'],
    'marca_auth_panel_descripcion' => ['default' => 'Centraliza cuentas, clientes, buzones, renovaciones y consultas en un sistema preparado para trabajar con tu propia marca.', 'type' => 'texto'],
    'marca_auth_beneficio_1_titulo' => ['default' => 'Acceso centralizado', 'type' => 'texto'],
    'marca_auth_beneficio_1_texto' => ['default' => 'Ingresa de forma segura al panel donde administras tu operación.', 'type' => 'texto'],
    'marca_auth_beneficio_2_titulo' => ['default' => 'Sesión protegida', 'type' => 'texto'],
    'marca_auth_beneficio_2_texto' => ['default' => 'Tus credenciales se validan antes de habilitar herramientas y datos administrativos.', 'type' => 'texto'],
    'marca_auth_beneficio_3_titulo' => ['default' => 'Recuperación segura', 'type' => 'texto'],
    'marca_auth_beneficio_3_texto' => ['default' => 'Recupera el acceso mediante un enlace temporal enviado al correo registrado.', 'type' => 'texto'],
    'marca_auth_panel_nota' => ['default' => 'Acceso protegido, consultas controladas y configuración centralizada para una operación profesional.', 'type' => 'texto'],

    // Portada pública
    'marca_landing_eyebrow' => ['default' => 'Una operación más profesional', 'type' => 'texto'],
    'marca_landing_titulo' => ['default' => 'Gestiona tu negocio de streaming como una empresa.', 'type' => 'texto'],
    'marca_landing_subtitulo' => ['default' => 'Entrega códigos con rapidez, controla cada acceso y mantén tus renovaciones organizadas.', 'type' => 'texto'],
    'marca_landing_cta' => ['default' => 'Obtener el sistema', 'type' => 'texto'],
    'marca_landing_cta_secundario' => ['default' => 'Ver planes', 'type' => 'texto'],
    'marca_landing_solucion_titulo' => ['default' => 'Una sola operación para atender clientes, controlar renovaciones y entregar accesos.', 'type' => 'texto'],
    'marca_landing_solucion_descripcion' => ['default' => 'Conecta tus buzones por IMAP y organiza cuentas, dominios, asuntos y consultas.', 'type' => 'texto'],
    'marca_landing_plataformas_titulo' => ['default' => 'Presenta tus plataformas como una solución premium.', 'type' => 'texto'],
    'marca_landing_plataformas_descripcion' => ['default' => 'Cada servicio puede usar sus propios dominios, asuntos y alias.', 'type' => 'texto'],
    'marca_landing_privacidad_titulo' => ['default' => 'Más control que un bot básico.', 'type' => 'texto'],
    'marca_landing_privacidad_descripcion' => ['default' => 'Organiza clientes, accesos, renovaciones y privacidad desde un solo sistema.', 'type' => 'texto'],
    'marca_landing_planes_titulo' => ['default' => 'Entrega códigos y accesos sin depender de procesos manuales.', 'type' => 'texto'],
    'marca_landing_planes_descripcion' => ['default' => 'Centraliza cuentas, clientes, consultas y renovaciones en un panel profesional.', 'type' => 'texto'],
    'marca_landing_final_titulo' => ['default' => '¿Vas a seguir perdiendo tiempo y cuentas?', 'type' => 'texto'],
    'marca_landing_final_descripcion' => ['default' => 'Centraliza consultas, clientes, renovaciones y accesos desde un panel profesional. Recibe información clara sobre planes, implementación y soporte.', 'type' => 'texto'],
    'marca_landing_final_boton' => ['default' => 'Solicitar información por WhatsApp', 'type' => 'texto'],
    'marca_landing_prueba_1' => ['default' => 'Configuración guiada', 'type' => 'texto'],
    'marca_landing_prueba_2' => ['default' => 'Consulta pública y acceso privado por ID', 'type' => 'texto'],
    'marca_landing_prueba_3' => ['default' => 'Planes, renovaciones y clientes en un solo panel', 'type' => 'texto'],
    'marca_landing_dashboard_eyebrow' => ['default' => 'OPERACIÓN EN TIEMPO REAL', 'type' => 'texto'],
    'marca_landing_dashboard_titulo' => ['default' => 'Todo lo importante, visible y bajo control.', 'type' => 'texto'],
    'marca_landing_dashboard_descripcion' => ['default' => 'Supervisa plataformas, planes, accesos y renovaciones sin depender de procesos dispersos.', 'type' => 'texto'],
    'marca_landing_metrica_plataformas' => ['default' => 'Plataformas configuradas', 'type' => 'texto'],
    'marca_landing_metrica_planes' => ['default' => 'Planes disponibles', 'type' => 'texto'],
    'marca_landing_metrica_accesos' => ['default' => 'Niveles de acceso', 'type' => 'texto'],
    'marca_landing_solucion_eyebrow' => ['default' => 'FLUJO DE TRABAJO', 'type' => 'texto'],
    'marca_landing_paso_1_titulo' => ['default' => 'Conecta tu operación', 'type' => 'texto'],
    'marca_landing_paso_1_texto' => ['default' => 'Configura buzones Gmail o cPanel, dominios, asuntos y alias desde el panel.', 'type' => 'texto'],
    'marca_landing_paso_2_titulo' => ['default' => 'Organiza clientes y cuentas', 'type' => 'texto'],
    'marca_landing_paso_2_texto' => ['default' => 'Asigna servicios, controla vencimientos y prepara renovaciones sin perder contexto.', 'type' => 'texto'],
    'marca_landing_paso_3_titulo' => ['default' => 'Entrega accesos con seguridad', 'type' => 'texto'],
    'marca_landing_paso_3_texto' => ['default' => 'Publica consultas, solicita un ID o habilita códigos individuales según cada caso.', 'type' => 'texto'],
    'marca_landing_plataformas_eyebrow' => ['default' => 'ECOSISTEMA REAL', 'type' => 'texto'],
    'marca_landing_beneficios_eyebrow' => ['default' => 'VENTAJAS OPERATIVAS', 'type' => 'texto'],
    'marca_landing_beneficio_1_titulo' => ['default' => 'Clientes centralizados', 'type' => 'texto'],
    'marca_landing_beneficio_1_texto' => ['default' => 'Administra clientes, revendedores, cuentas asignadas y accesos desde un solo lugar.', 'type' => 'texto'],
    'marca_landing_beneficio_2_titulo' => ['default' => 'Renovaciones ordenadas', 'type' => 'texto'],
    'marca_landing_beneficio_2_texto' => ['default' => 'Visualiza fechas próximas, vencimientos y prepara mensajes de cobranza para WhatsApp.', 'type' => 'texto'],
    'marca_landing_beneficio_3_titulo' => ['default' => 'Privacidad configurable', 'type' => 'texto'],
    'marca_landing_beneficio_3_texto' => ['default' => 'Decide qué contenido es público, cuál requiere login y cuál usa un ID individual.', 'type' => 'texto'],
    'marca_landing_beneficio_4_titulo' => ['default' => 'Alias flexibles', 'type' => 'texto'],
    'marca_landing_beneficio_4_texto' => ['default' => 'Añade variantes de asunto para localizar mensajes aunque cambie el idioma o el título.', 'type' => 'texto'],
    'marca_landing_beneficio_5_titulo' => ['default' => 'Tus propios buzones', 'type' => 'texto'],
    'marca_landing_beneficio_5_texto' => ['default' => 'Conecta Gmail o cPanel mediante IMAP y conserva el control de tus correos.', 'type' => 'texto'],
    'marca_landing_beneficio_6_titulo' => ['default' => 'Operación escalable', 'type' => 'texto'],
    'marca_landing_beneficio_6_texto' => ['default' => 'Organiza cuentas, consultas, dominios, plataformas y planes en una sola solución.', 'type' => 'texto'],
    'marca_landing_privacidad_eyebrow' => ['default' => 'CONTROL Y SEGURIDAD', 'type' => 'texto'],
    'marca_landing_control_1_titulo' => ['default' => 'Consulta pública', 'type' => 'texto'],
    'marca_landing_control_1_texto' => ['default' => 'Permite localizar información autorizada mediante plataforma y correo.', 'type' => 'texto'],
    'marca_landing_control_2_titulo' => ['default' => 'Acceso con ID', 'type' => 'texto'],
    'marca_landing_control_2_texto' => ['default' => 'Protege mensajes privados con un ID de consulta o un código individual de cuenta.', 'type' => 'texto'],
    'marca_landing_control_3_titulo' => ['default' => 'Gestión administrativa', 'type' => 'texto'],
    'marca_landing_control_3_texto' => ['default' => 'Mantén clientes, pagos, vigencias y comunicación conectados con la entrega del servicio.', 'type' => 'texto'],
    'marca_landing_planes_eyebrow' => ['default' => 'PLANES PARA CADA ETAPA', 'type' => 'texto'],
    'marca_landing_final_eyebrow' => ['default' => 'LISTO PARA CRECER', 'type' => 'texto'],
    'marca_footer_accion_consultar_texto' => ['default' => 'Consultar', 'type' => 'texto'],
    'marca_footer_accion_consultar_subtexto' => ['default' => 'Buscar códigos', 'type' => 'texto'],
    'marca_footer_accion_consultar_icono' => ['default' => 'fa-magnifying-glass', 'type' => 'texto'],
    'marca_footer_accion_registro_texto' => ['default' => 'Crear cuenta', 'type' => 'texto'],
    'marca_footer_accion_registro_subtexto' => ['default' => 'Empieza ahora', 'type' => 'texto'],
    'marca_footer_accion_registro_icono' => ['default' => 'fa-user-plus', 'type' => 'texto'],
    'marca_footer_accion_ingreso_texto' => ['default' => 'Ingresar', 'type' => 'texto'],
    'marca_footer_accion_ingreso_subtexto' => ['default' => 'Abrir el panel', 'type' => 'texto'],
    'marca_footer_accion_ingreso_icono' => ['default' => 'fa-right-to-bracket', 'type' => 'texto'],
];

$palettes = [
    'fenix' => ['label'=>'Fénix','description'=>'Rojo comercial con navegación oscura','colors'=>['#dc2626','#7f1d1d','#f59e0b','#08111f','#f4f7fb','#dc2626','#ffffff','#ffffff','#0f172a','#ffffff','#0f172a','#08111f','#cbd5e1','#dc2626','#dc2626']],
    'oceano' => ['label'=>'Océano','description'=>'Azul confiable, limpio y corporativo','colors'=>['#2563eb','#1e3a8a','#06b6d4','#0f172a','#f1f5f9','#2563eb','#ffffff','#ffffff','#0f172a','#ffffff','#0f172a','#0f172a','#dbeafe','#2563eb','#2563eb']],
    'esmeralda' => ['label'=>'Esmeralda','description'=>'Verde moderno y operativo','colors'=>['#059669','#064e3b','#f59e0b','#052e2b','#f0fdf4','#059669','#ffffff','#ffffff','#0f172a','#ffffff','#0f172a','#052e2b','#d1fae5','#059669','#059669']],
    'violeta' => ['label'=>'Violeta','description'=>'Tecnología y diferenciación','colors'=>['#7c3aed','#4c1d95','#ec4899','#171029','#f5f3ff','#7c3aed','#ffffff','#ffffff','#0f172a','#ffffff','#0f172a','#171029','#ede9fe','#7c3aed','#7c3aed']],
    'medianoche' => ['label'=>'Medianoche','description'=>'Premium oscuro con acento azul','colors'=>['#0f172a','#020617','#38bdf8','#020617','#eef2ff','#0284c7','#ffffff','#0f172a','#f8fafc','#0f172a','#f8fafc','#020617','#cbd5e1','#38bdf8','#38bdf8']],
    'arena' => ['label'=>'Arena','description'=>'Cálido, sobrio y corporativo','colors'=>['#b45309','#78350f','#eab308','#1c1917','#fffbeb','#b45309','#ffffff','#fffdf7','#292524','#fffdf7','#292524','#1c1917','#fde68a','#b45309','#b45309']],
    'coral' => ['label'=>'Coral','description'=>'Energía moderna con contraste suave','colors'=>['#f43f5e','#9f1239','#fb7185','#251015','#fff1f2','#e11d48','#ffffff','#ffffff','#1f1720','#ffffff','#1f1720','#251015','#fecdd3','#f43f5e','#f43f5e']],
    'turquesa' => ['label'=>'Turquesa','description'=>'Fresco, digital y profesional','colors'=>['#0d9488','#134e4a','#22d3ee','#042f2e','#f0fdfa','#0f766e','#ffffff','#ffffff','#0f172a','#ffffff','#0f172a','#042f2e','#ccfbf1','#0d9488','#0d9488']],
    'zafiro' => ['label'=>'Zafiro','description'=>'Azul intenso con acento dorado','colors'=>['#1d4ed8','#172554','#f59e0b','#0b1535','#eff6ff','#1d4ed8','#ffffff','#ffffff','#111827','#ffffff','#111827','#0b1535','#dbeafe','#1d4ed8','#1d4ed8']],
    'rosa' => ['label'=>'Rosa premium','description'=>'Elegante, amable y comercial','colors'=>['#db2777','#831843','#f472b6','#2b1020','#fdf2f8','#db2777','#ffffff','#ffffff','#1f1720','#ffffff','#1f1720','#2b1020','#fbcfe8','#db2777','#db2777']],
    'grafito' => ['label'=>'Grafito','description'=>'Neutral premium con acento lima','colors'=>['#334155','#0f172a','#84cc16','#111827','#f8fafc','#334155','#ffffff','#ffffff','#0f172a','#ffffff','#0f172a','#111827','#cbd5e1','#65a30d','#65a30d']],
    'personalizada' => ['label'=>'Personalizada','description'=>'Define cada color manualmente','colors'=>null],
];


$landingPalettes = [];

/*
|--------------------------------------------------------------------------
| AFENIXX-LANDING-PALETTES-V8
|--------------------------------------------------------------------------
|
| La portada premium y las tarjetas de planes utilizan exactamente las
| mismas 11 familias de "Paletas predeterminadas", más la opción
| Personalizada. Total: 12 combinaciones precargadas.
|
*/
foreach ($palettes as $paletteKey => $palette) {
    if ($paletteKey === 'personalizada') {
        continue;
    }

    $globalColors = array_values((array) ($palette['colors'] ?? []));
    if (count($globalColors) < 15) {
        continue;
    }

    $landingPalettes[$paletteKey] = [
        'label' => (string) ($palette['label'] ?? ucfirst($paletteKey)),
        'description' => (string) ($palette['description'] ?? 'Combinación profesional precargada.'),
        'colors' => [
            $globalColors[4],  // fondo general
            $globalColors[7],  // superficie y tarjetas
            $globalColors[4],  // fondo suave
            $globalColors[8],  // texto principal
            $globalColors[12], // texto secundario
            $globalColors[3],  // panel oscuro
            $globalColors[1],  // panel oscuro alterno
            $globalColors[6],  // texto sobre fondo oscuro
            $globalColors[7],  // tarjeta normal de plan
            $globalColors[12], // borde de plan
            $globalColors[4],  // plan destacado
            $globalColors[4],  // bloque de precio
        ],
    ];
}

$landingPalettes['personalizada'] = [
    'label' => 'Personalizada',
    'description' => 'Ajusta manualmente cada color de la portada y los planes.',
    'colors' => null,
];

function af_brand_upload(string $field, string $prefix, int $maxBytes, array $allowedMime): ?string
{
    if (empty($_FILES[$field]) || ($_FILES[$field]['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_NO_FILE) return null;
    if ($_FILES[$field]['error'] !== UPLOAD_ERR_OK) throw new RuntimeException('No se pudo cargar el archivo.');
    if ((int) $_FILES[$field]['size'] > $maxBytes) throw new RuntimeException('El archivo supera el tamaño permitido.');
    $tmp = (string) $_FILES[$field]['tmp_name'];
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $mime = (string) $finfo->file($tmp);
    if (!isset($allowedMime[$mime])) throw new RuntimeException('El formato del archivo no está permitido.');
    $relativeDir = 'assets/img/branding';
    $absoluteDir = dirname(__DIR__) . '/' . $relativeDir;
    if (!is_dir($absoluteDir) && !mkdir($absoluteDir, 0755, true) && !is_dir($absoluteDir)) throw new RuntimeException('No se pudo crear la carpeta de marca.');
    $filename = $prefix . '-' . date('Ymd-His') . '-' . bin2hex(random_bytes(3)) . '.' . $allowedMime[$mime];
    if (!move_uploaded_file($tmp, $absoluteDir . '/' . $filename)) throw new RuntimeException('No se pudo guardar el archivo.');
    return $relativeDir . '/' . $filename;
}

function af_brand_favicon_upload(string $field, int $maxBytes = 2097152): ?string
{
    if (empty($_FILES[$field]) || ($_FILES[$field]['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_NO_FILE) {
        return null;
    }
    if ($_FILES[$field]['error'] !== UPLOAD_ERR_OK) {
        throw new RuntimeException('No se pudo cargar el favicon.');
    }
    if ((int) $_FILES[$field]['size'] > $maxBytes) {
        throw new RuntimeException('El favicon supera el tamaño permitido de 2 MB.');
    }

    $tmp = (string) $_FILES[$field]['tmp_name'];
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $mime = (string) $finfo->file($tmp);
    $allowed = [
        'image/png' => 'png',
        'image/jpeg' => 'jpg',
        'image/webp' => 'webp',
        'image/x-icon' => 'ico',
        'image/vnd.microsoft.icon' => 'ico',
        'image/svg+xml' => 'svg',
    ];
    if (!isset($allowed[$mime])) {
        throw new RuntimeException('El favicon debe ser PNG, JPG, WebP, ICO o SVG.');
    }

    $relativeDir = 'assets/img/branding';
    $absoluteDir = dirname(__DIR__) . '/' . $relativeDir;
    if (!is_dir($absoluteDir) && !mkdir($absoluteDir, 0755, true) && !is_dir($absoluteDir)) {
        throw new RuntimeException('No se pudo crear la carpeta de marca.');
    }

    $stamp = date('Ymd-His') . '-' . bin2hex(random_bytes(3));
    if (in_array($mime, ['image/x-icon', 'image/vnd.microsoft.icon', 'image/svg+xml'], true)) {
        $extension = $allowed[$mime];
        $filename = 'favicon-' . $stamp . '.' . $extension;
        if (!move_uploaded_file($tmp, $absoluteDir . '/' . $filename)) {
            throw new RuntimeException('No se pudo guardar el favicon.');
        }
        return $relativeDir . '/' . $filename;
    }

    $loaders = [
        'image/png' => 'imagecreatefrompng',
        'image/jpeg' => 'imagecreatefromjpeg',
        'image/webp' => 'imagecreatefromwebp',
    ];
    $loader = $loaders[$mime] ?? '';
    if ($loader === '' || !function_exists($loader) || !function_exists('imagecreatetruecolor')) {
        if ($mime === 'image/png') {
            $filename = 'favicon-' . $stamp . '.png';
            if (!move_uploaded_file($tmp, $absoluteDir . '/' . $filename)) {
                throw new RuntimeException('No se pudo guardar el favicon PNG.');
            }
            return $relativeDir . '/' . $filename;
        }
        throw new RuntimeException('El servidor necesita la extensión GD para convertir JPG o WebP a favicon. Puedes subir un PNG o ICO.');
    }

    $source = @$loader($tmp);
    if (!$source) {
        throw new RuntimeException('No fue posible leer la imagen seleccionada para el favicon.');
    }

    $sourceWidth = imagesx($source);
    $sourceHeight = imagesy($source);
    $canvasSize = 64;
    $canvas = imagecreatetruecolor($canvasSize, $canvasSize);
    imagealphablending($canvas, false);
    imagesavealpha($canvas, true);
    $transparent = imagecolorallocatealpha($canvas, 0, 0, 0, 127);
    imagefilledrectangle($canvas, 0, 0, $canvasSize, $canvasSize, $transparent);

    $scale = min($canvasSize / max(1, $sourceWidth), $canvasSize / max(1, $sourceHeight));
    $targetWidth = max(1, (int) round($sourceWidth * $scale));
    $targetHeight = max(1, (int) round($sourceHeight * $scale));
    $targetX = (int) floor(($canvasSize - $targetWidth) / 2);
    $targetY = (int) floor(($canvasSize - $targetHeight) / 2);
    imagecopyresampled($canvas, $source, $targetX, $targetY, 0, 0, $targetWidth, $targetHeight, $sourceWidth, $sourceHeight);

    $filename = 'favicon-' . $stamp . '.png';
    $absolutePath = $absoluteDir . '/' . $filename;
    if (!imagepng($canvas, $absolutePath, 9)) {
        imagedestroy($source);
        imagedestroy($canvas);
        throw new RuntimeException('No se pudo generar el favicon optimizado.');
    }
    imagedestroy($source);
    imagedestroy($canvas);

    return $relativeDir . '/' . $filename;
}

function af_brand_table_exists(PDO $pdo, string $table): bool
{
    $stmt = $pdo->prepare('SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?');
    $stmt->execute([$table]);
    return (int) $stmt->fetchColumn() > 0;
}

function af_brand_column_exists(PDO $pdo, string $table, string $column): bool
{
    $stmt = $pdo->prepare('SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = ? AND column_name = ?');
    $stmt->execute([$table, $column]);
    return (int) $stmt->fetchColumn() > 0;
}

$cfg = [];
try {
    foreach ($pdo->query('SELECT clave, valor FROM configuracion_sistema') as $row) $cfg[$row['clave']] = (string) $row['valor'];
} catch (Throwable $e) {
    error_log('Error leyendo configuración de marca: ' . $e->getMessage());
}
foreach ($settings as $key => $meta) if (!array_key_exists($key, $cfg)) $cfg[$key] = $meta['default'];
if (!isset($landingPalettes[(string) ($cfg['marca_index_paleta'] ?? '')])) {
    $cfg['marca_index_paleta'] = 'personalizada';
}

$success_message = '';
$errors = [];
$activeTab = trim((string) ($_GET['tab'] ?? 'identidad'));
if (!in_array($activeTab, ['identidad','paleta','textos','seo','puesta'], true)) $activeTab = 'identidad';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    Security::requireCsrf();
    $action = trim((string) ($_POST['action'] ?? 'save_brand'));

    if ($action === 'launch_reset') {
        $activeTab = 'puesta';
        $phrase = trim((string) ($_POST['confirm_phrase'] ?? ''));
        $password = (string) ($_POST['current_password'] ?? '');
        if ($phrase !== 'PUESTA EN MARCHA') $errors[] = 'Escribe exactamente PUESTA EN MARCHA para confirmar.';
        if (!isset($_POST['confirm_cleanup'])) $errors[] = 'Confirma que comprendes la eliminación de datos.';

        try {
            $stmt = $pdo->prepare('SELECT clave FROM usuarios WHERE id = ? LIMIT 1');
            $stmt->execute([(int) ($_SESSION['admin']['uid'] ?? 0)]);
            $currentHash = (string) ($stmt->fetchColumn() ?: '');
            if ($currentHash === '' || !password_verify($password, $currentHash)) $errors[] = 'La contraseña del Superadmin no es correcta.';
        } catch (Throwable $e) {
            $errors[] = 'No fue posible validar la contraseña actual.';
        }

        if (!$errors) {
            try {
                $superRoleStmt = $pdo->query("SELECT id FROM roles WHERE nombre_rol = 'Superadmin' LIMIT 1");
                $superRoleId = (int) $superRoleStmt->fetchColumn();
                $superIdsStmt = $pdo->prepare('SELECT id FROM usuarios WHERE id_rol = ? ORDER BY id');
                $superIdsStmt->execute([$superRoleId]);
                $superIds = array_map('intval', $superIdsStmt->fetchAll(PDO::FETCH_COLUMN));
                if (!$superIds || !in_array((int) $_SESSION['admin']['uid'], $superIds, true)) throw new RuntimeException('No se encontró una cuenta Superadmin válida.');
                $ownerId = (int) $_SESSION['admin']['uid'];
                $placeholders = implode(',', array_fill(0, count($superIds), '?'));

                $pdo->beginTransaction();
                if (af_brand_column_exists($pdo, 'plataformas', 'id_propietario_admin')) $pdo->prepare('UPDATE plataformas SET id_propietario_admin = ?')->execute([$ownerId]);
                if (af_brand_column_exists($pdo, 'plataformas', 'id_admin_propietario')) $pdo->prepare('UPDATE plataformas SET id_admin_propietario = ?')->execute([$ownerId]);
                if (af_brand_column_exists($pdo, 'plataformas', 'id_buzon_entrada_publico')) $pdo->exec('UPDATE plataformas SET id_buzon_entrada_publico = NULL');
                if (af_brand_column_exists($pdo, 'asuntos', 'id_propietario_admin')) $pdo->prepare('UPDATE asuntos SET id_propietario_admin = ?')->execute([$ownerId]);
                if (af_brand_column_exists($pdo, 'asuntos', 'id_admin_propietario')) $pdo->prepare('UPDATE asuntos SET id_admin_propietario = ?')->execute([$ownerId]);

                $deleteOrder = [
                    'asociacion_asunto','permisos_consulta','asociaciones','dominio_asunto',
                    'historial_renovaciones_cuenta','configuracion_renovacion_admin','correos_servicios','dominios','configuraciones_imap',
                    'consultas','beneficios_referidos','renovaciones_credito','pagos','movimientos_credito','monederos',
                    'uso_consultas','pruebas_gratuitas','password_resets','usuarios_codigo_consulta_backup','suscripciones'
                ];
                foreach ($deleteOrder as $table) if (af_brand_table_exists($pdo, $table)) $pdo->exec('DELETE FROM `' . $table . '`');

                $pdo->prepare("DELETE FROM usuarios WHERE id NOT IN ($placeholders)")->execute($superIds);
                $pdo->prepare("UPDATE usuarios SET id_rol_previo = NULL, id_admin_propietario = NULL, id_creador = NULL, id_referidor = NULL WHERE id IN ($placeholders)")->execute($superIds);
                if (af_brand_table_exists($pdo, 'monederos')) {
                    $walletStmt = $pdo->prepare('INSERT INTO monederos (id_usuario, saldo) VALUES (?, 0) ON DUPLICATE KEY UPDATE saldo = 0');
                    foreach ($superIds as $id) $walletStmt->execute([$id]);
                }
                $pdo->commit();
                $_SESSION['flash_message'] = ['type'=>'success','text'=>'Puesta en marcha completada. Se conservaron los Superadmin, plataformas, asuntos y configuración global.'];
                header('Location: configurar_marca.php?tab=puesta');
                exit;
            } catch (Throwable $e) {
                if ($pdo->inTransaction()) $pdo->rollBack();
                error_log('Puesta en marcha: ' . $e->getMessage());
                $errors[] = 'No se pudo completar la limpieza. No se aplicaron cambios parciales.';
            }
        }
    } elseif ($action === 'save_brand') {
        $activeTab = trim((string) ($_POST['active_tab'] ?? 'identidad'));
        $posted = [];
        foreach ($settings as $key => $meta) {
            if ($key === 'mail_password_enc') {
                $posted[$key] = (string) ($cfg[$key] ?? '');
                continue;
            }
            $posted[$key] = $meta['type'] === 'booleano'
                ? (isset($_POST[$key]) ? '1' : '0')
                : trim((string) ($_POST[$key] ?? $cfg[$key]));
        }

        $newMailPassword = trim((string) ($_POST['mail_password'] ?? ''));
        if (isset($_POST['mail_clear_password'])) {
            $posted['mail_password_enc'] = '';
        } elseif ($newMailPassword !== '') {
            try {
                $posted['mail_password_enc'] = CryptoService::encrypt($newMailPassword);
            } catch (Throwable $e) {
                $errors[] = 'No se pudo cifrar la contraseña SMTP. Comprueba APP_KEY.';
            }
        }

        $colorSettingKeys = [
            'marca_color_primario','marca_color_secundario','marca_color_acento','marca_color_sidebar','marca_color_fondo',
            'marca_color_boton','marca_color_boton_texto','marca_color_header_publico','marca_color_header_publico_texto',
            'marca_color_header_admin','marca_color_header_admin_texto','marca_color_footer','marca_color_footer_texto',
            'marca_color_iconos_publicos','marca_color_iconos_admin'
        ];
        foreach ($colorSettingKeys as $key) {
            if (!preg_match('/^#[0-9a-fA-F]{6}$/', (string) $posted[$key])) $errors[] = 'Revisa los colores de la paleta.';
        }
        if ($posted['mail_from_email'] !== '' && !filter_var($posted['mail_from_email'], FILTER_VALIDATE_EMAIL)) {
            $errors[] = 'Revisa el correo remitente configurado para los restablecimientos.';
        }
        if (!in_array($posted['mail_transport'], ['auto','smtp','mail'], true)) $posted['mail_transport'] = 'auto';
        if (!in_array($posted['mail_encryption'], ['tls','ssl','none'], true)) $posted['mail_encryption'] = 'tls';
        $posted['mail_port'] = (string) max(1, min(65535, (int) $posted['mail_port']));
        $posted['moneda'] = strtoupper(substr(preg_replace('/[^A-Za-z]/', '', (string) $posted['moneda']), 0, 5));
        if ($posted['moneda'] === '') $posted['moneda'] = 'PEN';
        if (!isset($palettes[$posted['marca_paleta']])) $posted['marca_paleta'] = 'personalizada';
        if (!isset($landingPalettes[$posted['marca_index_paleta']])) $posted['marca_index_paleta'] = 'personalizada';

        try {
            if ($path = af_brand_upload('upload_logo','logo',4*1024*1024,['image/png'=>'png','image/jpeg'=>'jpg','image/webp'=>'webp','image/svg+xml'=>'svg'])) $posted['marca_logo'] = $path;
            if ($path = af_brand_favicon_upload('upload_favicon')) $posted['marca_favicon'] = $path;
            if ($path = af_brand_upload('upload_fondo_login','login-bg',8*1024*1024,['image/png'=>'png','image/jpeg'=>'jpg','image/webp'=>'webp'])) $posted['marca_fondo_login'] = $path;
            if ($path = af_brand_upload('upload_footer_icon','footer-icon',3*1024*1024,['image/png'=>'png','image/jpeg'=>'jpg','image/webp'=>'webp','image/svg+xml'=>'svg'])) $posted['marca_footer_icono'] = $path;
        } catch (Throwable $e) {
            $errors[] = $e->getMessage();
        }

        if (!$errors) {
            try {
                $pdo->beginTransaction();
                $stmt = $pdo->prepare('INSERT INTO configuracion_sistema (clave, valor, tipo) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE valor = VALUES(valor), tipo = VALUES(tipo)');
                foreach ($settings as $key => $meta) {
                    $stmt->execute([$key, $posted[$key], $meta['type']]);
                    $cfg[$key] = $posted[$key];
                }
                foreach (['marca_url_facebook','marca_url_instagram','marca_url_tiktok','marca_url_youtube'] as $legacyKey) $stmt->execute([$legacyKey, '', 'texto']);
                $pdo->commit();
                $success_message = 'La marca, la paleta y la configuración pública fueron actualizadas.';

                if (isset($_POST['test_mail_after_save'])) {
                    require_once dirname(__DIR__) . '/lib/MailService.php';
                    $testDestination = filter_var(
                        trim((string) ($_POST['mail_from_email'] ?? '')),
                        FILTER_VALIDATE_EMAIL
                    );
                    if (!$testDestination) {
                        $errors[] = 'Ingresa un correo válido para la prueba de envío.';
                    } else {
                        $mailConfig = require dirname(__DIR__) . '/config_mail.php';
                        $mailer = new MailService($mailConfig);
                        $testHtml = '<div style="font-family:Arial,sans-serif;padding:24px"><h2>Correo configurado correctamente</h2><p>Este mensaje confirma que el envío de restablecimientos está operativo en ' . htmlspecialchars((string) $cfg['marca_nombre'], ENT_QUOTES, 'UTF-8') . '.</p></div>';
                        if ($mailer->sendHtml((string) $testDestination, 'Prueba de correo - ' . (string) $cfg['marca_nombre'], $testHtml)) {
                            $success_message .= ' El correo de prueba fue enviado.';
                        } else {
                            $errors[] = 'La configuración se guardó, pero la prueba falló: ' . $mailer->getLastError();
                        }
                    }
                }
            } catch (Throwable $e) {
                if ($pdo->inTransaction()) $pdo->rollBack();
                error_log('Guardar marca: ' . $e->getMessage());
                $errors[] = 'No se pudo guardar la configuración.';
            }
        }
    }
}

$cleanupCounts = ['Usuarios no Superadmin'=>0,'Suscripciones'=>0,'Pagos'=>0,'Dominios'=>0,'Buzones'=>0,'Cuentas'=>0];
try {
    $cleanupCounts['Usuarios no Superadmin'] = (int) $pdo->query("SELECT COUNT(*) FROM usuarios u LEFT JOIN roles r ON r.id=u.id_rol WHERE COALESCE(r.nombre_rol,'') <> 'Superadmin'")->fetchColumn();
    foreach (['suscripciones'=>'Suscripciones','pagos'=>'Pagos','dominios'=>'Dominios','configuraciones_imap'=>'Buzones','correos_servicios'=>'Cuentas'] as $table=>$label) if (af_brand_table_exists($pdo,$table)) $cleanupCounts[$label]=(int)$pdo->query('SELECT COUNT(*) FROM `'.$table.'`')->fetchColumn();
} catch (Throwable $e) { error_log('Conteo puesta en marcha: '.$e->getMessage()); }

// Diagnóstico del correo realmente utilizado por el sistema.
$mailRuntimeConfig = [];
$mailEnvironmentActive = false;
$mailConfigurationSource = 'Sin configurar';
$mailRuntimeReady = false;
$mailRuntimeNote = 'Completa una cuenta SMTP o configura las variables MAIL_* del servidor.';
try {
    foreach (['MAIL_TRANSPORT','MAIL_HOST','MAIL_PORT','MAIL_ENCRYPTION','MAIL_USERNAME','MAIL_PASSWORD','MAIL_FROM_ADDRESS','MAIL_FROM_NAME'] as $mailEnvKey) {
        $mailEnvValue = getenv($mailEnvKey);
        if ($mailEnvValue !== false && trim((string) $mailEnvValue) !== '') {
            $mailEnvironmentActive = true;
            break;
        }
    }

    $mailRuntimeConfig = require dirname(__DIR__) . '/config_mail.php';
    $runtimeTransport = strtolower(trim((string) ($mailRuntimeConfig['transport'] ?? 'auto')));
    $runtimeHost = trim((string) ($mailRuntimeConfig['host'] ?? ''));
    $runtimeUser = trim((string) ($mailRuntimeConfig['username'] ?? ''));
    $runtimePassword = (string) ($mailRuntimeConfig['password'] ?? '');
    $runtimeFrom = trim((string) ($mailRuntimeConfig['from_email'] ?? ''));

    if ($mailEnvironmentActive) {
        $mailConfigurationSource = 'Variables del servidor';
        $mailRuntimeNote = 'Las variables MAIL_* tienen prioridad sobre lo guardado en Marca Blanca.';
    } elseif ($cfg['mail_host'] !== '' || $cfg['mail_username'] !== '' || $cfg['mail_from_email'] !== '' || $cfg['mail_password_enc'] !== '') {
        $mailConfigurationSource = 'Marca Blanca';
        $mailRuntimeNote = 'El sistema está leyendo la configuración guardada en configuracion_sistema.';
    } elseif ($runtimeTransport === 'mail') {
        $mailConfigurationSource = 'Función mail()';
        $mailRuntimeNote = function_exists('mail') ? 'El servidor permite usar mail().' : 'La función mail() no está disponible en este servidor.';
    }

    $smtpReady = $runtimeHost !== '' && $runtimeUser !== '' && $runtimePassword !== '' && filter_var($runtimeFrom, FILTER_VALIDATE_EMAIL);
    $mailFunctionReady = in_array($runtimeTransport, ['auto','mail'], true) && function_exists('mail') && filter_var($runtimeFrom, FILTER_VALIDATE_EMAIL);
    $mailRuntimeReady = $smtpReady || $mailFunctionReady;
} catch (Throwable $e) {
    error_log('Diagnóstico de correo en Marca Blanca: ' . $e->getMessage());
    $mailRuntimeNote = 'No fue posible verificar la configuración de correo en este momento.';
}

$titulo_pagina = 'Configuración de marca blanca';
require_once __DIR__ . '/admin_header.php';
require_once __DIR__ . '/includes/superadmin_ui_helpers.php';

function wb_field_help(string $name): string
{
    $specific = [
        'marca_nombre' => 'Se muestra como nombre principal en cabeceras, formularios, correos y pie público.',
        'marca_nombre_corto' => 'Se usa en espacios compactos del panel, navegación y vista previa.',
        'marca_eslogan' => 'Aparece debajo del nombre comercial en presentaciones y tarjetas públicas.',
        'marca_descripcion' => 'Resume qué ofrece el sistema; se utiliza en la presentación comercial y metadatos públicos.',
        'marca_logo' => 'Ruta del logotipo que se muestra en cabeceras, accesos y panel administrativo.',
        'marca_favicon' => 'Archivo mostrado en la pestaña del navegador y en los marcadores del sitio.',
        'marca_fondo_login' => 'Imagen de fondo de login, registro, recuperación y consultas públicas/privadas.',
        'marca_header_subtitulo' => 'Texto pequeño ubicado debajo del nombre en la cabecera pública.',
        'marca_footer' => 'Texto legal centrado en el pie de las páginas públicas.',
        'marca_footer_subtitulo' => 'Texto pequeño que acompaña al nombre y al icono del pie público.',
        'marca_footer_soporte_texto' => 'Nombre visible del botón de soporte del pie público.',
        'marca_soporte_mensaje' => 'Mensaje que se completa automáticamente al abrir WhatsApp desde Soporte.',
        'marca_copyright' => 'Nombre usado en créditos y avisos de propiedad del sistema.',
        'marca_admin_header_subtitulo' => 'Texto pequeño que aparece debajo del título de cada módulo en la cabecera administrativa.',
        'marca_admin_consultas_titulo' => 'Título del acceso rápido que abre la consulta de códigos desde la cabecera del panel.',
        'marca_admin_consultas_subtitulo' => 'Texto pequeño ubicado debajo del acceso rápido a Consultas.',
        'marca_admin_sitio_titulo' => 'Título del acceso rápido que abre la página pública desde la cabecera administrativa.',
        'marca_admin_sitio_subtitulo' => 'Texto pequeño ubicado debajo del acceso rápido al sitio público.',
        'marca_admin_footer_sesion' => 'Texto fijo del extremo derecho del pie administrativo. El nombre del rol se agrega automáticamente.',
        'marca_whatsapp' => 'Número del botón Soporte en los pies públicos, con código de país. Si lo dejas vacío, se utilizará el teléfono registrado del usuario Superadmin.',
        'marca_horario_soporte' => 'Horario visible de atención y soporte.',
        'marca_pais' => 'País base utilizado como referencia comercial y regional.',
        'marca_seo_titulo' => 'Título que usan buscadores y pestañas cuando una página no tiene uno específico.',
        'marca_seo_descripcion' => 'Resumen que pueden mostrar Google y otros buscadores en sus resultados.',
        'marca_seo_keywords' => 'Palabras internas de referencia SEO separadas por comas.',
        'moneda_simbolo' => 'Símbolo mostrado delante de precios, pagos, créditos y reportes.',
        'marca_auth_panel_eyebrow' => 'Etiqueta pequeña ubicada encima del panel comercial de los formularios.',
        'marca_auth_panel_titulo' => 'Título grande del panel comercial junto a login, registro, recuperación y consulta privada.',
        'marca_auth_panel_descripcion' => 'Párrafo comercial que explica el valor del sistema junto a los formularios públicos.',
        'marca_auth_panel_nota' => 'Mensaje final de confianza o seguridad en el panel comercial.',
    ];
    if (isset($specific[$name])) {
        return $specific[$name];
    }

    $areas = [
        'marca_login_' => 'inicio de sesión',
        'marca_registro_' => 'registro de nuevas cuentas',
        'marca_recuperar_' => 'solicitud de recuperación de contraseña',
        'marca_reset_' => 'creación de una nueva contraseña',
        'marca_consulta_login_' => 'acceso privado con ID',
        'marca_consulta_' => 'consulta pública',
        'marca_landing_' => 'portada principal',
        'marca_auth_beneficio_' => 'panel comercial de los formularios',
    ];
    $area = 'sección pública correspondiente';
    foreach ($areas as $prefix => $areaName) {
        if (str_starts_with($name, $prefix)) {
            $area = $areaName;
            break;
        }
    }

    if (str_ends_with($name, '_label')) return 'Se muestra como etiqueta visible de un campo en ' . $area . '.';
    if (str_ends_with($name, '_placeholder')) return 'Texto de ejemplo que aparece dentro del campo en ' . $area . ' antes de escribir.';
    if (str_ends_with($name, '_ayuda')) return 'Texto pequeño de orientación colocado debajo del campo en ' . $area . '.';
    if (str_ends_with($name, '_eyebrow')) return 'Etiqueta superior breve que introduce el contenido de ' . $area . '.';
    if (str_contains($name, '_hero_titulo')) return 'Título comercial del panel visual que acompaña a ' . $area . '.';
    if (str_contains($name, '_hero_descripcion')) return 'Descripción comercial situada debajo del título visual de ' . $area . '.';
    if (str_contains($name, '_form_titulo')) return 'Título principal de la tarjeta o formulario de ' . $area . '.';
    if (str_contains($name, '_form_descripcion')) return 'Explicación breve ubicada debajo del título del formulario de ' . $area . '.';
    if (str_ends_with($name, '_titulo')) return 'Título visible de ' . $area . '.';
    if (str_ends_with($name, '_subtitulo')) return 'Texto de apoyo situado debajo del título en ' . $area . '.';
    if (str_ends_with($name, '_descripcion') || str_ends_with($name, '_texto')) return 'Texto explicativo visible en ' . $area . '.';
    if (str_ends_with($name, '_boton') || str_ends_with($name, '_cta') || str_ends_with($name, '_cta_secundario')) return 'Texto que se muestra dentro del botón de acción en ' . $area . '.';
    if (str_contains($name, 'beneficio_')) return 'Contenido de una ventaja destacada en el panel comercial de los formularios.';
    if (str_ends_with($name, '_nota') || str_ends_with($name, '_seguridad')) return 'Mensaje de confianza o seguridad visible en ' . $area . '.';
    if (str_ends_with($name, '_volver') || str_ends_with($name, '_login') || str_ends_with($name, '_registro') || str_ends_with($name, '_olvido')) return 'Texto del enlace de navegación mostrado en ' . $area . '.';
    if (str_ends_with($name, '_recordar') || str_ends_with($name, '_terminos') || str_ends_with($name, '_tiene_cuenta') || str_ends_with($name, '_sin_cuenta')) return 'Texto auxiliar visible dentro de ' . $area . '.';
    if (str_contains($name, 'instruccion_')) return 'Paso visible dentro de las instrucciones de la consulta pública.';
    return 'Este valor se muestra en ' . $area . '.';
}

function wb_field(string $name, string $label, array $cfg, string $type='text', bool $full=false, int $rows=2, string $help=''): void
{
    $value = (string) ($cfg[$name] ?? '');
    $help = $help !== '' ? $help : wb_field_help($name);
    echo '<div class="wb-field'.($full?' is-full':'').'"><label for="'.htmlspecialchars($name).'">'.htmlspecialchars($label).'</label>';
    if ($type === 'textarea') echo '<textarea id="'.htmlspecialchars($name).'" name="'.htmlspecialchars($name).'" rows="'.$rows.'">'.htmlspecialchars($value).'</textarea>';
    else echo '<input type="'.htmlspecialchars($type).'" id="'.htmlspecialchars($name).'" name="'.htmlspecialchars($name).'" value="'.htmlspecialchars($value).'">';
    if ($help !== '') echo '<small>'.htmlspecialchars($help).'</small>';
    echo '</div>';
}
?>
<style>
.wb-page{width:min(1480px,100%);max-width:1480px;margin:14px auto 0;display:grid;gap:12px}.wb-page>.sa-module-hero,.wb-page>.sa-summary-grid{margin:0;width:100%}
.wb-shell{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:12px;align-items:start}.wb-main{min-width:0}.wb-toolbar{position:sticky;top:70px;z-index:18;display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;padding:7px 8px;border:1px solid #dfe7f1;border-radius:14px;background:rgba(255,255,255,.97);box-shadow:0 8px 22px rgba(15,23,42,.05);backdrop-filter:blur(10px)}.wb-tabs{display:flex;min-width:0;gap:4px;overflow:auto}.wb-tab{min-height:36px;padding:0 11px;border:0;border-radius:9px;background:transparent;color:#64748b;font-size:10px;font-weight:900;white-space:nowrap;cursor:pointer}.wb-tab.is-active{background:#feecee;color:#c92832;box-shadow:inset 0 0 0 1px #fecdd3}.wb-toolbar-actions{display:flex;flex:0 0 auto;gap:7px}.wb-toolbar-actions .sa-btn{min-height:36px;padding:0 12px;white-space:nowrap}
/* Evita que admin-module-polish convierta Marca Blanca en un formulario de filtros. */
#brandSettingsForm,#brandSettingsForm.legacy-filter-form{display:block!important;width:100%!important;padding:0!important;margin:0!important;border:0!important;border-radius:0!important;background:transparent!important;box-shadow:none!important}
#brandSettingsForm.legacy-filter-form>div{margin:0!important}
.wb-panel{display:none;margin-top:10px;padding:1px 1px 14px}.wb-panel.is-active{display:block}.wb-section-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.wb-section{min-width:0;padding:13px;border:1px solid #dfe7f1;border-radius:15px;background:#fff;box-shadow:0 6px 18px rgba(15,23,42,.035)}.wb-section.is-wide{grid-column:1/-1}.wb-section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:9px;margin-bottom:10px;padding-bottom:9px;border-bottom:1px solid #e7edf4}.wb-section-head h2{margin:0;color:#172033;font-size:14px;font-weight:900}.wb-section-head p{margin:2px 0 0;color:#64748b;font-size:9.8px;line-height:1.4}.wb-section-icon{width:32px;height:32px;display:grid;place-items:center;flex:0 0 auto;border-radius:10px;background:#feecee;color:#dc2633}.wb-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.wb-panel[data-wb-panel="identidad"] .wb-section-grid{grid-template-columns:1fr}.wb-panel[data-wb-panel="identidad"] .wb-grid,.wb-section.is-wide .wb-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.wb-field{min-width:0}.wb-field.is-full{grid-column:1/-1}.wb-field label{display:block;margin-bottom:4px;color:#334155;font-size:9.5px;font-weight:900}.wb-field input,.wb-field textarea,.wb-field select{width:100%;padding:7px 9px;border:1px solid #cfd9e6;border-radius:9px;background:#fff;color:#172033;font-size:11px;outline:none}.wb-field input,.wb-field select{height:36px}.wb-field input[type=file]{height:auto;min-height:36px;padding:5px}.wb-field textarea{min-height:66px;resize:vertical;line-height:1.4}.wb-field input:focus,.wb-field textarea:focus,.wb-field select:focus{border-color:#fb7185;box-shadow:0 0 0 3px rgba(239,68,68,.09)}.wb-field small{display:block;margin-top:3px;color:#7b8ba2;font-size:9px;line-height:1.35}.wb-help-box{grid-column:1/-1;padding:9px 10px;border:1px solid #bfdbfe;border-radius:10px;background:#eff6ff;color:#1e40af;font-size:9.5px;line-height:1.45}.wb-toggle{min-height:36px;display:flex;align-items:center;gap:7px;padding:7px 9px;border:1px solid #dbe4ef;border-radius:9px;background:#f8fafc;color:#334155;font-size:10px}.wb-toggle input{width:15px;height:15px}.wb-color{display:grid;grid-template-columns:42px 1fr;gap:6px}.wb-color input[type=color]{padding:3px}.wb-presets{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px}.wb-preset{padding:8px;border:1px solid #dbe4ef;border-radius:11px;background:#fff;text-align:left;cursor:pointer}.wb-preset.is-active{border-color:#fb7185;box-shadow:0 0 0 2px rgba(239,68,68,.08)}.wb-preset strong,.wb-preset small{display:block}.wb-preset strong{margin-top:6px;color:#172033;font-size:10.5px}.wb-preset small{margin-top:2px;color:#64748b;font-size:8.5px}.wb-swatches{display:flex;gap:2px}.wb-swatches i{width:19px;height:15px;border-radius:4px;border:1px solid rgba(15,23,42,.08)}
.wb-mail-presets{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:9px}.wb-mini-btn{height:33px;padding:0 10px;border:1px solid #dbe4ef;border-radius:9px;background:#f8fafc;color:#334155;font-size:9.5px;font-weight:900;cursor:pointer}.wb-mini-btn:hover{border-color:#93c5fd;background:#eff6ff}.wb-mail-status{display:flex;align-items:flex-start;gap:8px;padding:10px 11px;border:1px solid #e2e8f0;border-radius:11px;background:#f8fafc;color:#64748b;font-size:9.5px;line-height:1.45}.wb-mail-status i{margin-top:2px}.wb-mail-status strong,.wb-mail-status span{display:block}.wb-mail-status strong{color:#334155;font-size:10px}.wb-mail-status.is-ready{border-color:#bbf7d0;background:#ecfdf5;color:#166534}.wb-mail-status.is-ready strong{color:#166534}.wb-mail-layout{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.wb-mail-group{min-width:0;padding:11px;border:1px solid #e2e8f0;border-radius:12px;background:#fbfcfe}.wb-mail-group h3{display:flex;align-items:center;gap:7px;margin:0;color:#1e293b;font-size:11px;font-weight:900}.wb-mail-group>p{margin:4px 0 9px;color:#64748b;font-size:9px;line-height:1.4}.wb-mail-step{position:relative;padding-top:13px}.wb-mail-step-number{display:inline-grid;place-items:center;width:22px;height:22px;margin-right:2px;border-radius:7px;background:#fee2e2;color:#b91c1c;font-size:10px;font-weight:950}.wb-mail-group h3 i{color:#dc2633}.wb-mail-group .wb-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.wb-mail-group .wb-field.is-wide{grid-column:1/-1}.wb-mail-test-button{width:100%;height:36px;border-color:#fecdd3;background:#fff1f2;color:#be123c}.wb-mail-runtime{grid-column:1/-1}
.wb-preview{position:sticky;top:128px;overflow:hidden;border:1px solid #dfe7f1;border-radius:16px;background:#fff;box-shadow:0 10px 26px rgba(15,23,42,.07)}.wb-preview-top{height:8px;background:var(--wb-primary,#dc2626)}.wb-preview-body{padding:15px}.wb-logo{width:54px;height:54px;display:grid;place-items:center;overflow:hidden;border:1px solid #e2e8f0;border-radius:14px;background:#fff}.wb-logo img{width:100%;height:100%;object-fit:contain}.wb-preview h3{margin:11px 0 0;color:#172033;font-size:20px;font-weight:900}.wb-preview p{margin:5px 0 0;color:#64748b;font-size:10px;line-height:1.45}.wb-preview-btn{display:inline-flex;align-items:center;gap:6px;margin-top:12px;padding:9px 11px;border-radius:9px;background:var(--wb-button,#dc2626);color:var(--wb-button-text,#fff);font-size:10px;font-weight:900}.wb-preview-meta{display:grid;gap:6px;margin-top:13px;padding-top:12px;border-top:1px solid #e7edf4}.wb-preview-meta span{display:flex;justify-content:space-between;gap:8px;color:#64748b;font-size:9px}.wb-preview-meta strong{color:#172033}
.wb-danger{border-color:#fecdd3;background:linear-gradient(180deg,#fff,#fff7f7)}.wb-cleanup-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px}.wb-cleanup-grid article{padding:9px;border:1px solid #fecdd3;border-radius:10px;background:#fff}.wb-cleanup-grid span,.wb-cleanup-grid strong{display:block}.wb-cleanup-grid span{color:#7f1d1d;font-size:8px;font-weight:900;text-transform:uppercase}.wb-cleanup-grid strong{margin-top:3px;color:#991b1b;font-size:17px}.wb-danger-note{display:flex;gap:8px;margin:10px 0;padding:10px;border:1px solid #fdba74;border-radius:10px;background:#fff7ed;color:#9a3412;font-size:10px;line-height:1.45}.wb-danger-confirm{display:grid;grid-template-columns:1fr 1fr;gap:8px}.wb-danger-check{grid-column:1/-1}.wb-danger-button{height:38px;padding:0 13px;border:0;border-radius:10px;background:#b91c1c;color:#fff;font-size:10.5px;font-weight:900;cursor:pointer}
@media(max-width:1200px){.wb-shell{grid-template-columns:1fr}.wb-preview{position:relative;top:auto}.wb-presets{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:1050px){.wb-mail-layout{grid-template-columns:1fr}.wb-toolbar{position:sticky;top:64px;align-items:stretch;flex-direction:column}.wb-toolbar-actions{justify-content:flex-end}.wb-section-grid,.wb-grid,.wb-panel[data-wb-panel="identidad"] .wb-grid,.wb-section.is-wide .wb-grid,.wb-danger-confirm,.wb-mail-layout{grid-template-columns:1fr 1fr}.wb-presets{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:620px){.wb-section-grid,.wb-grid,.wb-panel[data-wb-panel="identidad"] .wb-grid,.wb-section.is-wide .wb-grid,.wb-danger-confirm,.wb-mail-layout,.wb-mail-group .wb-grid{grid-template-columns:1fr}.wb-section.is-wide,.wb-field.is-full,.wb-field.is-wide,.wb-danger-check{grid-column:auto}.wb-toolbar{position:relative;top:auto}.wb-toolbar-actions{display:grid;grid-template-columns:1fr 1fr}.wb-toolbar-actions .sa-btn{width:100%}.wb-presets,.wb-cleanup-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* AFENIXX-WB-PRESETS-20260724 */
.wb-panel[data-wb-panel="paleta"] .wb-presets{
    grid-template-columns:repeat(4,minmax(0,1fr));
    gap:9px;
}

.wb-panel[data-wb-panel="paleta"] .wb-preset{
    position:relative;
    min-height:104px;
    display:flex;
    flex-direction:column;
    justify-content:flex-start;
    padding:10px;
    overflow:hidden;
    border-radius:13px;
    transition:
        transform .18s ease,
        border-color .18s ease,
        box-shadow .18s ease;
}

.wb-panel[data-wb-panel="paleta"] .wb-preset:hover{
    transform:translateY(-3px);
    border-color:#fda4af;
    box-shadow:0 13px 27px rgba(15,23,42,.09);
}

.wb-panel[data-wb-panel="paleta"] .wb-preset.is-active{
    border-color:#fb7185;
    box-shadow:
        0 0 0 2px rgba(239,68,68,.09),
        0 14px 30px rgba(15,23,42,.08);
}

.wb-panel[data-wb-panel="paleta"] .wb-swatches{
    width:100%;
    height:23px;
    overflow:hidden;
    gap:3px;
    border-radius:7px;
}

.wb-panel[data-wb-panel="paleta"] .wb-swatches i{
    flex:1;
    width:auto;
    height:23px;
    border-radius:4px;
}

.wb-panel[data-wb-panel="paleta"] .wb-preset strong{
    margin-top:9px;
    font-size:11px;
}

.wb-panel[data-wb-panel="paleta"] .wb-preset small{
    margin-top:4px;
    font-size:8.7px;
    line-height:1.35;
}

@media(max-width:1100px){
    .wb-panel[data-wb-panel="paleta"] .wb-presets{
        grid-template-columns:repeat(3,minmax(0,1fr));
    }
}

@media(max-width:760px){
    .wb-panel[data-wb-panel="paleta"] .wb-presets{
        grid-template-columns:repeat(2,minmax(0,1fr));
    }
}
</style>
<div class="sa-page wb-page">
<?php
sa_render_module_hero(['icon'=>'fa-swatchbook','eyebrow'=>'CENTRO DE MARCA','title'=>'Marca blanca','description'=>'']);
sa_render_summary_cards([
    ['label'=>'Marca comercial','value'=>$cfg['marca_nombre'] ?: 'Sin definir','icon'=>'fa-signature','hint'=>'Identidad pública'],
    ['label'=>'Paleta activa','value'=>$palettes[$cfg['marca_paleta']]['label'] ?? 'Personalizada','icon'=>'fa-palette','tone'=>'is-violet','hint'=>'Colores globales'],
    ['label'=>'Moneda','value'=>$cfg['moneda'],'icon'=>'fa-coins','tone'=>'is-green','hint'=>$cfg['moneda_simbolo'].' · '.$cfg['zona_horaria']],
    ['label'=>'Textos editables','value'=>count(array_filter(array_keys($settings),static fn(string $k):bool=>str_starts_with($k,'marca_login_')||str_starts_with($k,'marca_registro_')||str_starts_with($k,'marca_recuperar_')||str_starts_with($k,'marca_reset_')||str_starts_with($k,'marca_landing_'))),'icon'=>'fa-pen-ruler','tone'=>'is-blue','hint'=>'Acceso y portada'],
]);
?>
<?php if ($success_message !== ''): ?><div class="sa-alert sa-alert--success"><i class="fas fa-circle-check"></i><div><strong>Configuración guardada</strong><p><?= htmlspecialchars($success_message) ?></p></div></div><?php endif; ?>
<?php if ($errors): ?><div class="sa-alert sa-alert--danger"><i class="fas fa-triangle-exclamation"></i><div><strong>Revisa la operación</strong><p><?= htmlspecialchars(implode(' ', $errors)) ?></p></div></div><?php endif; ?>

<div class="wb-toolbar"><nav class="wb-tabs" aria-label="Secciones de Marca Blanca">
<?php foreach (['identidad'=>['fa-signature','Identidad'],'paleta'=>['fa-palette','Paleta visual'],'textos'=>['fa-pen-ruler','Textos públicos'],'seo'=>['fa-envelope-circle-check','Contacto, correo y región'],'puesta'=>['fa-rocket','Puesta en marcha']] as $tab=>$meta): ?><button type="button" class="wb-tab <?= $activeTab===$tab?'is-active':'' ?>" data-wb-tab="<?= $tab ?>"><i class="fas <?= $meta[0] ?>"></i> <?= $meta[1] ?></button><?php endforeach; ?>
</nav><div class="wb-toolbar-actions"><a href="configurar_marca.php?tab=<?= htmlspecialchars($activeTab) ?>" id="wbDiscardLink" class="sa-btn sa-btn--secondary"><i class="fas fa-rotate-left"></i> Descartar</a><button type="submit" form="brandSettingsForm" class="sa-btn sa-btn--primary"><i class="fas fa-floppy-disk"></i> Guardar</button></div></div>

<div class="wb-shell">
<div class="wb-main">
<form method="post" enctype="multipart/form-data" id="brandSettingsForm" class="wb-settings-form" data-prevent-double-submit>
<?= Security::csrfField() ?><input type="hidden" name="action" value="save_brand"><input type="hidden" name="active_tab" id="wbActiveTab" value="<?= htmlspecialchars($activeTab) ?>"><input type="hidden" name="marca_paleta" id="marca_paleta" value="<?= htmlspecialchars($cfg['marca_paleta']) ?>"><input type="hidden" name="marca_index_paleta" id="marca_index_paleta" value="<?= htmlspecialchars($cfg['marca_index_paleta']) ?>">

<section class="wb-panel <?= $activeTab==='identidad'?'is-active':'' ?>" data-wb-panel="identidad"><div class="wb-section-grid">
<article class="wb-section"><header class="wb-section-head"><div><h2>Identidad comercial</h2><p>Nombre y descripción que identifican la plataforma.</p></div><span class="wb-section-icon"><i class="fas fa-signature"></i></span></header><div class="wb-grid">
<?php wb_field('marca_nombre','Nombre comercial',$cfg); wb_field('marca_nombre_corto','Nombre corto',$cfg); wb_field('marca_eslogan','Eslogan',$cfg,'text',true); wb_field('marca_descripcion','Descripción comercial',$cfg,'textarea',true,3); wb_field('marca_header_subtitulo','Subtítulo de la cabecera pública',$cfg,'text',true); wb_field('marca_footer','Texto legal del pie',$cfg,'text',true); wb_field('marca_footer_subtitulo','Subtítulo del pie',$cfg); wb_field('marca_footer_soporte_texto','Texto del enlace de soporte',$cfg); wb_field('marca_soporte_mensaje','Mensaje inicial de WhatsApp',$cfg,'textarea',true,2); wb_field('marca_copyright','Titular del copyright',$cfg); ?>
<div class="wb-field"><label>Crédito de desarrollo</label><label class="wb-toggle"><input type="checkbox" name="mostrar_marca_desarrollador" value="1" <?= $cfg['mostrar_marca_desarrollador']==='1'?'checked':'' ?>> Mostrar crédito en el pie</label></div>
</div></article>
<article class="wb-section"><header class="wb-section-head"><div><h2>Recursos gráficos</h2><p>Logo, favicon y fondo utilizado en páginas de acceso.</p></div><span class="wb-section-icon"><i class="fas fa-images"></i></span></header><div class="wb-grid">
<?php wb_field('marca_logo','Ruta del logo',$cfg,'text',true); ?><div class="wb-field is-full"><label for="upload_logo">Cargar nuevo logo</label><input type="file" id="upload_logo" name="upload_logo" accept=".png,.jpg,.jpeg,.webp,.svg,image/*"><small>PNG, JPG, WebP o SVG · máximo 4 MB.</small></div>
<?php wb_field('marca_favicon','Archivo actual del favicon',$cfg); ?><div class="wb-field"><label for="upload_favicon">Cargar o convertir favicon</label><input type="file" id="upload_favicon" name="upload_favicon" accept=".png,.jpg,.jpeg,.webp,.ico,.svg,image/*"><small>Puedes subir PNG, JPG o WebP: el sistema lo adapta a 64×64 en PNG. También acepta ICO y SVG directamente.</small></div>
<?php wb_field('marca_fondo_login','Ruta del fondo de acceso',$cfg,'text',true); ?><div class="wb-field is-full"><label for="upload_fondo_login">Cargar fondo</label><input type="file" id="upload_fondo_login" name="upload_fondo_login" accept=".png,.jpg,.jpeg,.webp,image/*"><small>Recomendado 1920×1080 · máximo 8 MB.</small></div>
<div class="wb-field is-full"><label for="upload_footer_icon">Imagen de TV o streaming del pie</label><input type="file" id="upload_footer_icon" name="upload_footer_icon" accept=".png,.jpg,.jpeg,.webp,.svg,image/png,image/jpeg,image/webp,image/svg+xml"><small>Admite PNG, JPG/JPEG, WebP o SVG · máximo 3 MB. Recomendado: imagen cuadrada de 128×128 o mayor, preferiblemente PNG/WebP con fondo transparente.</small></div>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Cabecera y pie administrativos</h2><p>Edita los textos fijos visibles para Admin, Ayudante y Superadmin. El título del módulo, el nombre del usuario y su rol continúan siendo dinámicos.</p></div><span class="wb-section-icon"><i class="fas fa-window-maximize"></i></span></header><div class="wb-grid">
<?php wb_field('marca_admin_header_subtitulo','Subtítulo general del panel',$cfg); wb_field('marca_admin_footer_sesion','Texto de estado de sesión',$cfg); wb_field('marca_admin_consultas_titulo','Acceso Consultas · título',$cfg); wb_field('marca_admin_consultas_subtitulo','Acceso Consultas · texto pequeño',$cfg); wb_field('marca_admin_sitio_titulo','Acceso Sitio web · título',$cfg); wb_field('marca_admin_sitio_subtitulo','Acceso Sitio web · texto pequeño',$cfg); ?>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Acciones de la cabecera pública</h2><p>Configura los accesos Consultar, Crear cuenta e Ingresar que aparecen en la barra superior de la portada. Ya no se muestran en el pie.</p></div><span class="wb-section-icon"><i class="fas fa-shapes"></i></span></header><div class="wb-grid">
<?php wb_field('marca_footer_accion_consultar_texto','Consultar · texto principal',$cfg); wb_field('marca_footer_accion_consultar_subtexto','Consultar · texto pequeño',$cfg); ?>
<div class="wb-field"><label for="marca_footer_accion_consultar_icono">Consultar · icono</label><select id="marca_footer_accion_consultar_icono" name="marca_footer_accion_consultar_icono"><?php foreach(['fa-magnifying-glass'=>'Lupa','fa-envelope-open-text'=>'Correo','fa-ticket'=>'Código','fa-magnifying-glass-chart'=>'Búsqueda avanzada'] as $v=>$l):?><option value="<?= $v ?>" <?= $cfg['marca_footer_accion_consultar_icono']===$v?'selected':'' ?>><?= htmlspecialchars($l) ?></option><?php endforeach;?></select><small>Icono que acompaña la acción Consultar en la cabecera pública.</small></div>
<?php wb_field('marca_footer_accion_registro_texto','Crear cuenta · texto principal',$cfg); wb_field('marca_footer_accion_registro_subtexto','Crear cuenta · texto pequeño',$cfg); ?>
<div class="wb-field"><label for="marca_footer_accion_registro_icono">Crear cuenta · icono</label><select id="marca_footer_accion_registro_icono" name="marca_footer_accion_registro_icono"><?php foreach(['fa-user-plus'=>'Usuario nuevo','fa-rocket'=>'Cohete','fa-wand-magic-sparkles'=>'Inicio rápido','fa-circle-plus'=>'Agregar'] as $v=>$l):?><option value="<?= $v ?>" <?= $cfg['marca_footer_accion_registro_icono']===$v?'selected':'' ?>><?= htmlspecialchars($l) ?></option><?php endforeach;?></select><small>Icono de la llamada a crear una cuenta.</small></div>
<?php wb_field('marca_footer_accion_ingreso_texto','Ingresar · texto principal',$cfg); wb_field('marca_footer_accion_ingreso_subtexto','Ingresar · texto pequeño',$cfg); ?>
<div class="wb-field"><label for="marca_footer_accion_ingreso_icono">Ingresar · icono</label><select id="marca_footer_accion_ingreso_icono" name="marca_footer_accion_ingreso_icono"><?php foreach(['fa-right-to-bracket'=>'Ingresar','fa-gauge-high'=>'Panel','fa-key'=>'Llave','fa-shield-halved'=>'Acceso seguro'] as $v=>$l):?><option value="<?= $v ?>" <?= $cfg['marca_footer_accion_ingreso_icono']===$v?'selected':'' ?>><?= htmlspecialchars($l) ?></option><?php endforeach;?></select><small>Icono del acceso al panel administrativo.</small></div>
</div></article>
</div></section>

<section class="wb-panel <?= $activeTab==='paleta'?'is-active':'' ?>" data-wb-panel="paleta"><div class="wb-section-grid">
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Paletas predeterminadas</h2><p>Aplica una combinación profesional o selecciona Personalizada para ajustar cada color.</p></div><span class="wb-section-icon"><i class="fas fa-swatchbook"></i></span></header><div class="wb-presets">
<?php foreach ($palettes as $key=>$palette): ?><button type="button" class="wb-preset <?= $cfg['marca_paleta']===$key?'is-active':'' ?>" data-palette="<?= htmlspecialchars($key) ?>" <?= $palette['colors'] ? 'data-colors="'.htmlspecialchars(json_encode($palette['colors'])).'"' : '' ?>><span class="wb-swatches"><?php foreach (array_slice(($palette['colors'] ?: [$cfg['marca_color_primario'],$cfg['marca_color_secundario'],$cfg['marca_color_acento'],$cfg['marca_color_sidebar'],$cfg['marca_color_fondo'],$cfg['marca_color_boton']]),0,6) as $color): ?><i style="background:<?= htmlspecialchars($color) ?>"></i><?php endforeach; ?></span><strong><?= htmlspecialchars($palette['label']) ?></strong><small><?= htmlspecialchars($palette['description']) ?></small></button><?php endforeach; ?>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Ajuste personalizado</h2><p>Los cambios se reflejan inmediatamente en la vista previa.</p></div><span class="wb-section-icon"><i class="fas fa-eye-dropper"></i></span></header><div class="wb-grid">
<?php foreach ([
'marca_color_primario'=>'Color principal','marca_color_secundario'=>'Color secundario','marca_color_acento'=>'Color de acento','marca_color_sidebar'=>'Menú lateral','marca_color_fondo'=>'Fondo del panel',
'marca_color_boton'=>'Botones principales','marca_color_boton_texto'=>'Texto de botones','marca_color_header_publico'=>'Cabecera pública','marca_color_header_publico_texto'=>'Texto cabecera pública',
'marca_color_header_admin'=>'Cabecera administrativa','marca_color_header_admin_texto'=>'Texto cabecera administrativa','marca_color_footer'=>'Pie de página','marca_color_footer_texto'=>'Texto del pie',
'marca_color_iconos_publicos'=>'Iconos públicos','marca_color_iconos_admin'=>'Iconos administrativos'
] as $key=>$label): ?><div class="wb-field"><label for="<?= $key ?>"><?= $label ?></label><div class="wb-color"><input type="color" id="<?= $key ?>_picker" value="<?= htmlspecialchars($cfg[$key]) ?>" data-color-target="<?= $key ?>"><input id="<?= $key ?>" name="<?= $key ?>" value="<?= htmlspecialchars($cfg[$key]) ?>" pattern="^#[0-9A-Fa-f]{6}$" required></div></div><?php endforeach; ?>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Colores de la portada premium y planes</h2><p>Elige una de las mismas 11 familias de Paletas predeterminadas o usa Personalizada. Son 12 combinaciones precargadas en total.</p></div><span class="wb-section-icon"><i class="fas fa-display"></i></span></header>
<div class="wb-presets">
<?php foreach ($landingPalettes as $key=>$palette): ?><button type="button" class="wb-preset <?= $cfg['marca_index_paleta']===$key?'is-active':'' ?>" data-index-palette="<?= htmlspecialchars($key) ?>" <?= $palette['colors'] ? 'data-index-colors="'.htmlspecialchars(json_encode($palette['colors'])).'"' : '' ?>><span class="wb-swatches"><?php foreach (array_slice(($palette['colors'] ?: [$cfg['marca_index_fondo'],$cfg['marca_index_superficie'],$cfg['marca_index_fondo_suave'],$cfg['marca_index_texto'],$cfg['marca_index_oscuro'],$cfg['marca_plan_destacado']]),0,6) as $color): ?><i style="background:<?= htmlspecialchars($color) ?>"></i><?php endforeach; ?></span><strong><?= htmlspecialchars($palette['label']) ?></strong><small><?= htmlspecialchars($palette['description']) ?></small></button><?php endforeach; ?>
</div>
<div class="wb-help-box" style="margin:10px 0">Seleccionar una combinación rellena los campos inferiores. Puedes modificar después cualquier tono y se guardará como una configuración personalizada.</div>
<div class="wb-grid">
<?php
$landingColorFields = [
    'marca_index_fondo' => ['Fondo general de la portada','Color base detrás de todas las secciones públicas.'],
    'marca_index_superficie' => ['Superficies y tarjetas','Fondo de tarjetas, bloques de confianza y secciones claras.'],
    'marca_index_fondo_suave' => ['Secciones de fondo suave','Fondo de plataformas, planes y separadores visuales.'],
    'marca_index_texto' => ['Texto principal','Títulos y contenido de mayor importancia en la portada.'],
    'marca_index_texto_secundario' => ['Texto secundario','Descripciones, ayudas y datos complementarios.'],
    'marca_index_oscuro' => ['Panel oscuro principal','Primer color del panel operativo y la sección de seguridad.'],
    'marca_index_oscuro_secundario' => ['Panel oscuro secundario','Segundo color del degradado en las secciones oscuras.'],
    'marca_index_texto_oscuro' => ['Texto sobre fondo oscuro','Títulos y contenido visible encima de paneles oscuros.'],
    'marca_plan_tarjeta' => ['Tarjeta de plan','Fondo normal de cada plan público.'],
    'marca_plan_borde' => ['Borde de planes','Líneas, divisores y contorno de las tarjetas de precios.'],
    'marca_plan_destacado' => ['Plan destacado','Tono de fondo utilizado para resaltar el plan recomendado.'],
    'marca_plan_precio_fondo' => ['Bloque de precio','Fondo de precios, modalidad y capacidad incluida.'],
];
foreach ($landingColorFields as $fieldName => [$fieldLabel,$fieldHelp]) {
    wb_field($fieldName,$fieldLabel,$cfg,'color',false,2,$fieldHelp);
}
?>
</div></article>
</div></section>

<section class="wb-panel <?= $activeTab==='textos'?'is-active':'' ?>" data-wb-panel="textos"><div class="wb-section-grid">
<article class="wb-section"><header class="wb-section-head"><div><h2>Inicio de sesión</h2><p>Encabezado, formulario y llamadas a la acción.</p></div><span class="wb-section-icon"><i class="fas fa-right-to-bracket"></i></span></header><div class="wb-grid">
<?php wb_field('marca_login_titulo','Título de página',$cfg); wb_field('marca_login_eyebrow','Texto superior',$cfg); wb_field('marca_login_hero_titulo','Título principal',$cfg,'textarea',true,2); wb_field('marca_login_hero_descripcion','Descripción principal',$cfg,'textarea',true,2); wb_field('marca_login_form_titulo','Título del formulario',$cfg); wb_field('marca_login_form_descripcion','Descripción del formulario',$cfg,'textarea',true,2); wb_field('marca_login_correo_label','Etiqueta del correo',$cfg); wb_field('marca_login_correo_placeholder','Placeholder del correo',$cfg); wb_field('marca_login_correo_ayuda','Ayuda del correo',$cfg,'text',true); wb_field('marca_login_clave_label','Etiqueta de contraseña',$cfg); wb_field('marca_login_clave_placeholder','Placeholder de contraseña',$cfg); wb_field('marca_login_recordar','Texto Recordar',$cfg); wb_field('marca_login_olvido','Enlace de recuperación',$cfg); wb_field('marca_login_boton','Botón principal',$cfg); wb_field('marca_login_sin_cuenta','Texto sin cuenta',$cfg); wb_field('marca_login_registro','Enlace de registro',$cfg); wb_field('marca_login_seguridad_titulo','Título de seguridad',$cfg); wb_field('marca_login_seguridad_texto','Texto de seguridad',$cfg,'textarea',true,2); ?>
</div></article>
<article class="wb-section"><header class="wb-section-head"><div><h2>Registro</h2><p>Textos del alta de nuevos administradores.</p></div><span class="wb-section-icon"><i class="fas fa-user-plus"></i></span></header><div class="wb-grid">
<?php wb_field('marca_registro_titulo','Título de página',$cfg); wb_field('marca_registro_eyebrow','Texto superior',$cfg); wb_field('marca_registro_hero_titulo','Título principal',$cfg,'textarea',true,2); wb_field('marca_registro_hero_descripcion','Descripción principal',$cfg,'textarea',true,2); wb_field('marca_registro_beneficio_1_titulo','Beneficio 1 · título',$cfg); wb_field('marca_registro_beneficio_1_texto','Beneficio 1 · descripción',$cfg,'textarea',true,2); wb_field('marca_registro_beneficio_2_titulo','Beneficio 2 · título',$cfg); wb_field('marca_registro_beneficio_2_texto','Beneficio 2 · descripción',$cfg,'textarea',true,2); wb_field('marca_registro_beneficio_3_titulo','Beneficio 3 · título',$cfg); wb_field('marca_registro_beneficio_3_texto','Beneficio 3 · descripción',$cfg,'textarea',true,2); wb_field('marca_registro_form_titulo','Título del formulario',$cfg); wb_field('marca_registro_form_descripcion','Descripción del formulario',$cfg,'textarea',true,2); wb_field('marca_registro_nombre_label','Etiqueta del nombre',$cfg); wb_field('marca_registro_nombre_placeholder','Placeholder del nombre',$cfg); wb_field('marca_registro_correo_label','Etiqueta del correo',$cfg); wb_field('marca_registro_correo_placeholder','Placeholder del correo',$cfg); wb_field('marca_registro_telefono_label','Etiqueta del teléfono',$cfg); wb_field('marca_registro_clave_label','Etiqueta de contraseña',$cfg); wb_field('marca_registro_confirmar_label','Etiqueta de confirmación',$cfg); wb_field('marca_registro_referido_label','Etiqueta de referido',$cfg); wb_field('marca_registro_terminos','Aceptación de términos',$cfg,'textarea',true,2); wb_field('marca_registro_boton','Botón principal',$cfg); wb_field('marca_registro_tiene_cuenta','Texto con cuenta',$cfg); wb_field('marca_registro_login','Enlace de login',$cfg); ?>
</div></article>
<article class="wb-section"><header class="wb-section-head"><div><h2>Solicitar recuperación</h2><p>Página donde se solicita el enlace temporal.</p></div><span class="wb-section-icon"><i class="fas fa-envelope-open-text"></i></span></header><div class="wb-grid">
<?php wb_field('marca_recuperar_titulo','Título de página',$cfg); wb_field('marca_recuperar_eyebrow','Texto superior',$cfg); wb_field('marca_recuperar_hero_titulo','Título principal',$cfg,'textarea',true,2); wb_field('marca_recuperar_hero_descripcion','Descripción principal',$cfg,'textarea',true,2); wb_field('marca_recuperar_form_titulo','Título del formulario',$cfg); wb_field('marca_recuperar_form_descripcion','Descripción del formulario',$cfg,'textarea',true,2); wb_field('marca_recuperar_correo_label','Etiqueta del correo',$cfg); wb_field('marca_recuperar_correo_placeholder','Placeholder del correo',$cfg); wb_field('marca_recuperar_boton','Botón principal',$cfg); wb_field('marca_recuperar_volver','Enlace para volver',$cfg); ?>
</div></article>
<article class="wb-section"><header class="wb-section-head"><div><h2>Nueva contraseña</h2><p>Página que recibe el enlace de recuperación.</p></div><span class="wb-section-icon"><i class="fas fa-key"></i></span></header><div class="wb-grid">
<?php wb_field('marca_reset_titulo','Título de página',$cfg); wb_field('marca_reset_eyebrow','Texto superior',$cfg); wb_field('marca_reset_hero_titulo','Título principal',$cfg,'textarea',true,2); wb_field('marca_reset_hero_descripcion','Descripción principal',$cfg,'textarea',true,2); wb_field('marca_reset_form_titulo','Título del formulario',$cfg); wb_field('marca_reset_form_descripcion','Descripción del formulario',$cfg,'textarea',true,2); wb_field('marca_reset_clave_label','Etiqueta de contraseña',$cfg); wb_field('marca_reset_confirmar_label','Etiqueta de confirmación',$cfg); wb_field('marca_reset_boton','Botón principal',$cfg); wb_field('marca_reset_nuevo_enlace','Botón de nuevo enlace',$cfg); ?>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Panel comercial de login y recuperación</h2><p>Contenido que aparece junto al inicio de sesión, solicitud de recuperación y creación de una nueva contraseña. Registro y acceso con ID tienen beneficios propios.</p></div><span class="wb-section-icon"><i class="fas fa-bullhorn"></i></span></header><div class="wb-grid">
<?php wb_field('marca_auth_panel_eyebrow','Texto superior',$cfg); wb_field('marca_auth_panel_titulo','Título comercial',$cfg,'textarea',true,2); wb_field('marca_auth_panel_descripcion','Descripción comercial',$cfg,'textarea',true,3); wb_field('marca_auth_beneficio_1_titulo','Beneficio 1 · título',$cfg); wb_field('marca_auth_beneficio_1_texto','Beneficio 1 · descripción',$cfg,'textarea',true,2); wb_field('marca_auth_beneficio_2_titulo','Beneficio 2 · título',$cfg); wb_field('marca_auth_beneficio_2_texto','Beneficio 2 · descripción',$cfg,'textarea',true,2); wb_field('marca_auth_beneficio_3_titulo','Beneficio 3 · título',$cfg); wb_field('marca_auth_beneficio_3_texto','Beneficio 3 · descripción',$cfg,'textarea',true,2); wb_field('marca_auth_panel_nota','Nota de confianza',$cfg,'textarea',true,2); ?>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Consulta pública</h2><p>Títulos, instrucciones y formulario que aparecen sobre la imagen de fondo.</p></div><span class="wb-section-icon"><i class="fas fa-magnifying-glass"></i></span></header><div class="wb-grid">
<?php wb_field('marca_consulta_titulo_pagina','Título de página',$cfg); wb_field('marca_consulta_titulo','Título principal',$cfg); wb_field('marca_consulta_subtitulo','Descripción principal',$cfg,'textarea',true,2); wb_field('marca_consulta_correo_label','Etiqueta del correo',$cfg); wb_field('marca_consulta_correo_placeholder','Placeholder del correo',$cfg); wb_field('marca_consulta_boton','Botón de consulta',$cfg); wb_field('marca_consulta_instrucciones_titulo','Título de instrucciones',$cfg); wb_field('marca_consulta_instruccion_1','Instrucción 1',$cfg,'text',true); wb_field('marca_consulta_instruccion_2','Instrucción 2',$cfg,'text',true); wb_field('marca_consulta_instruccion_3','Instrucción 3',$cfg,'text',true); wb_field('marca_consulta_instruccion_4','Instrucción 4',$cfg,'text',true); wb_field('marca_consulta_instruccion_5','Instrucción 5',$cfg,'text',true); ?>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Acceso con ID</h2><p>Textos del formulario de consulta privada.</p></div><span class="wb-section-icon"><i class="fas fa-key"></i></span></header><div class="wb-grid">
<?php wb_field('marca_consulta_login_eyebrow','Texto superior',$cfg); wb_field('marca_consulta_login_titulo','Título principal',$cfg); wb_field('marca_consulta_login_descripcion','Descripción',$cfg,'textarea',true,2); wb_field('marca_consulta_login_beneficio_1_titulo','Ventaja 1 · título',$cfg); wb_field('marca_consulta_login_beneficio_1_texto','Ventaja 1 · descripción',$cfg,'textarea',true,2); wb_field('marca_consulta_login_beneficio_2_titulo','Ventaja 2 · título',$cfg); wb_field('marca_consulta_login_beneficio_2_texto','Ventaja 2 · descripción',$cfg,'textarea',true,2); wb_field('marca_consulta_login_label','Etiqueta del ID',$cfg); wb_field('marca_consulta_login_placeholder','Placeholder del ID',$cfg); wb_field('marca_consulta_login_boton','Botón principal',$cfg); wb_field('marca_consulta_login_seguridad','Texto de seguridad',$cfg,'textarea',true,2); ?>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Portada premium · presentación</h2><p>Controla el mensaje principal, las pruebas de confianza y el panel visual del inicio público.</p></div><span class="wb-section-icon"><i class="fas fa-house"></i></span></header><div class="wb-grid">
<?php wb_field('marca_landing_eyebrow','Texto superior',$cfg); wb_field('marca_landing_cta','Botón principal',$cfg); wb_field('marca_landing_titulo','Título principal',$cfg,'textarea',true,2); wb_field('marca_landing_subtitulo','Descripción principal',$cfg,'textarea',true,3); wb_field('marca_landing_cta_secundario','Botón secundario',$cfg); wb_field('marca_landing_prueba_1','Prueba de confianza 1',$cfg); wb_field('marca_landing_prueba_2','Prueba de confianza 2',$cfg); wb_field('marca_landing_prueba_3','Prueba de confianza 3',$cfg); wb_field('marca_landing_dashboard_eyebrow','Panel visual · texto superior',$cfg); wb_field('marca_landing_dashboard_titulo','Panel visual · título',$cfg,'textarea',true,2); wb_field('marca_landing_dashboard_descripcion','Panel visual · descripción',$cfg,'textarea',true,2); wb_field('marca_landing_metrica_plataformas','Métrica de plataformas · etiqueta',$cfg); wb_field('marca_landing_metrica_planes','Métrica de planes · etiqueta',$cfg); wb_field('marca_landing_metrica_accesos','Métrica de accesos · etiqueta',$cfg); ?>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Portada premium · flujo y plataformas</h2><p>Edita los pasos del proceso y los encabezados que acompañan al catálogo real de plataformas.</p></div><span class="wb-section-icon"><i class="fas fa-diagram-project"></i></span></header><div class="wb-grid">
<?php wb_field('marca_landing_solucion_eyebrow','Solución · texto superior',$cfg); wb_field('marca_landing_solucion_titulo','Solución · título',$cfg,'textarea',true,2); wb_field('marca_landing_solucion_descripcion','Solución · descripción',$cfg,'textarea',true,2); wb_field('marca_landing_paso_1_titulo','Paso 1 · título',$cfg); wb_field('marca_landing_paso_1_texto','Paso 1 · descripción',$cfg,'textarea',true,2); wb_field('marca_landing_paso_2_titulo','Paso 2 · título',$cfg); wb_field('marca_landing_paso_2_texto','Paso 2 · descripción',$cfg,'textarea',true,2); wb_field('marca_landing_paso_3_titulo','Paso 3 · título',$cfg); wb_field('marca_landing_paso_3_texto','Paso 3 · descripción',$cfg,'textarea',true,2); wb_field('marca_landing_plataformas_eyebrow','Plataformas · texto superior',$cfg); wb_field('marca_landing_plataformas_titulo','Plataformas · título',$cfg,'textarea',true,2); wb_field('marca_landing_plataformas_descripcion','Plataformas · descripción',$cfg,'textarea',true,2); ?>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Portada premium · beneficios</h2><p>Seis ventajas operativas que venden el valor del sistema sin depender de textos fijos.</p></div><span class="wb-section-icon"><i class="fas fa-gem"></i></span></header><div class="wb-grid">
<?php wb_field('marca_landing_beneficios_eyebrow','Beneficios · texto superior',$cfg); for($i=1;$i<=6;$i++){ wb_field('marca_landing_beneficio_'.$i.'_titulo','Beneficio '.$i.' · título',$cfg); wb_field('marca_landing_beneficio_'.$i.'_texto','Beneficio '.$i.' · descripción',$cfg,'textarea',false,2); } ?>
</div></article>
<article class="wb-section is-wide"><header class="wb-section-head"><div><h2>Portada premium · control, planes y cierre</h2><p>Configura seguridad, encabezado de planes y la llamada final a la acción.</p></div><span class="wb-section-icon"><i class="fas fa-shield-halved"></i></span></header><div class="wb-grid">
<?php wb_field('marca_landing_privacidad_eyebrow','Control · texto superior',$cfg); wb_field('marca_landing_privacidad_titulo','Control · título',$cfg,'textarea',true,2); wb_field('marca_landing_privacidad_descripcion','Control · descripción',$cfg,'textarea',true,2); for($i=1;$i<=3;$i++){ wb_field('marca_landing_control_'.$i.'_titulo','Control '.$i.' · título',$cfg); wb_field('marca_landing_control_'.$i.'_texto','Control '.$i.' · descripción',$cfg,'textarea',false,2); } wb_field('marca_landing_planes_eyebrow','Planes · texto superior',$cfg); wb_field('marca_landing_planes_titulo','Planes · título',$cfg,'textarea',true,2); wb_field('marca_landing_planes_descripcion','Planes · descripción',$cfg,'textarea',true,2); wb_field('marca_landing_final_eyebrow','Cierre · texto superior',$cfg); wb_field('marca_landing_final_titulo','Cierre · título',$cfg,'textarea',true,2); wb_field('marca_landing_final_descripcion','Cierre · descripción',$cfg,'textarea',true,2); wb_field('marca_landing_final_boton','Cierre · botón',$cfg); ?>
</div></article>
</div></section>

<section class="wb-panel <?= $activeTab==='seo'?'is-active':'' ?>" data-wb-panel="seo"><div class="wb-section-grid">
<article class="wb-section"><header class="wb-section-head"><div><h2>Contacto y región</h2><p>Configura el WhatsApp del botón Soporte. Si queda vacío, el sistema toma automáticamente el teléfono del Superadmin.</p></div><span class="wb-section-icon"><i class="fas fa-headset"></i></span></header><div class="wb-grid">
<?php wb_field('marca_whatsapp','WhatsApp de soporte',$cfg); wb_field('marca_pais','País',$cfg); wb_field('marca_horario_soporte','Horario de atención',$cfg,'text',true); ?>
</div></article>
<article class="wb-section"><header class="wb-section-head"><div><h2>SEO y región</h2><p>Metadatos y formatos globales de la plataforma.</p></div><span class="wb-section-icon"><i class="fas fa-globe"></i></span></header><div class="wb-grid">
<?php wb_field('marca_seo_titulo','Título SEO',$cfg,'text',true); wb_field('marca_seo_descripcion','Descripción SEO',$cfg,'textarea',true,3); wb_field('marca_seo_keywords','Palabras clave',$cfg,'text',true); ?>
<div class="wb-field"><label for="moneda">Moneda (código ISO o manual)</label><input id="moneda" name="moneda" list="wbCurrencyCodes" maxlength="5" value="<?= htmlspecialchars($cfg['moneda']) ?>" placeholder="PEN"><datalist id="wbCurrencyCodes"><?php foreach(['PEN','USD','EUR','MXN','COP','ARS','CLP','BRL','BOB','PYG','UYU','VES','DOP','GTQ','HNL','CRC','PAB','GBP','CAD','AUD','JPY'] as $currencyCode):?><option value="<?= $currencyCode ?>"><?php endforeach;?></datalist><small>Define el código monetario utilizado en precios, pagos, créditos y reportes. Puedes escribir otro código ISO manualmente.</small></div>
<?php wb_field('moneda_simbolo','Símbolo monetario',$cfg); ?>
<div class="wb-field"><label for="idioma">Idioma base</label><select id="idioma" name="idioma"><option value="es" <?= $cfg['idioma']==='es'?'selected':'' ?>>Español</option><option value="en" <?= $cfg['idioma']==='en'?'selected':'' ?>>English</option><option value="pt" <?= $cfg['idioma']==='pt'?'selected':'' ?>>Português</option></select><small>Define la preferencia regional del sitio. No traduce automáticamente el panel ni los textos que escribas.</small></div>
<div class="wb-field"><label for="zona_horaria">Zona horaria</label><select id="zona_horaria" name="zona_horaria"><?php foreach(['America/Lima'=>'Lima (UTC-5)','America/Bogota'=>'Bogotá (UTC-5)','America/Mexico_City'=>'Ciudad de México','America/Santiago'=>'Santiago','America/Argentina/Buenos_Aires'=>'Buenos Aires','America/Sao_Paulo'=>'São Paulo','America/New_York'=>'Nueva York','Europe/Madrid'=>'Madrid'] as $v=>$l):?><option value="<?= htmlspecialchars($v) ?>" <?= $cfg['zona_horaria']===$v?'selected':'' ?>><?= htmlspecialchars($l) ?></option><?php endforeach;?></select><small>Se aplica como zona de referencia para fechas de vencimiento, reportes y registros.</small></div>
<div class="wb-field"><label for="formato_fecha">Formato de fecha</label><select id="formato_fecha" name="formato_fecha"><option value="d/m/Y" <?= $cfg['formato_fecha']==='d/m/Y'?'selected':'' ?>>DD/MM/AAAA</option><option value="Y-m-d" <?= $cfg['formato_fecha']==='Y-m-d'?'selected':'' ?>>AAAA-MM-DD</option><option value="m/d/Y" <?= $cfg['formato_fecha']==='m/d/Y'?'selected':'' ?>>MM/DD/AAAA</option></select><small>Determina cómo se muestran las fechas en formularios, tablas y reportes.</small></div>
<div class="wb-field"><label>Programa de referidos</label><label class="wb-toggle"><input type="checkbox" name="referidos_activos" value="1" <?= $cfg['referidos_activos']==='1'?'checked':'' ?>> Mostrar y habilitar referidos</label><small>Activa o desactiva las funciones y enlaces del programa de referidos.</small></div>
<div class="wb-help-box"><strong>¿Qué cambia al seleccionar idioma?</strong> Se actualiza la etiqueta <code>lang</code>, la preferencia regional y algunos formatos. Los textos configurados en “Textos públicos” permanecen exactamente como los escribas.</div>
</div></article>
<article class="wb-section is-wide wb-mail-section"><header class="wb-section-head"><div><h2>Correo de restablecimiento</h2><p>Configura la única cuenta que enviará enlaces de recuperación y avisos automáticos. El sistema reutiliza config_mail.php y MailService.</p></div><span class="wb-section-icon"><i class="fas fa-envelope-circle-check"></i></span></header>
<div class="wb-mail-layout">
<div class="wb-mail-status wb-mail-runtime <?= $mailRuntimeReady ? 'is-ready' : '' ?>"><i class="fas <?= $mailRuntimeReady ? 'fa-circle-check' : 'fa-circle-exclamation' ?>"></i><div><strong><?= $mailRuntimeReady ? 'Correo operativo' : 'Correo pendiente de configurar' ?> · Fuente: <?= htmlspecialchars($mailConfigurationSource) ?></strong><span><?= htmlspecialchars($mailRuntimeNote) ?><?php if (!empty($mailRuntimeConfig['host'])): ?> Servidor activo: <?= htmlspecialchars((string) $mailRuntimeConfig['host']) ?>.<?php endif; ?><?php if (!empty($mailRuntimeConfig['from_email'])): ?> Remitente: <?= htmlspecialchars((string) $mailRuntimeConfig['from_email']) ?>.<?php endif; ?></span></div></div>

<section class="wb-mail-group wb-mail-step"><h3><span class="wb-mail-step-number">1</span> Elige el tipo de correo</h3><p>Selecciona Gmail o el correo creado en cPanel. Los botones completan los valores habituales y luego puedes ajustarlos.</p>
<div class="wb-mail-presets"><button type="button" class="wb-mini-btn" data-mail-preset="gmail"><i class="fab fa-google"></i> Configurar Gmail</button><button type="button" class="wb-mini-btn" data-mail-preset="domain"><i class="fas fa-at"></i> Configurar correo de dominio</button></div>
<div class="wb-grid">
<div class="wb-field is-wide"><label for="mail_transport">Forma de envío</label><select id="mail_transport" name="mail_transport"><option value="auto" <?= $cfg['mail_transport']==='auto'?'selected':'' ?>>Automático: SMTP y respaldo del servidor</option><option value="smtp" <?= $cfg['mail_transport']==='smtp'?'selected':'' ?>>Usar solamente SMTP</option><option value="mail" <?= $cfg['mail_transport']==='mail'?'selected':'' ?>>Usar mail() del servidor</option></select><small>Para Gmail o cPanel selecciona SMTP. “Automático” intenta usar la mejor opción disponible.</small></div>
<div class="wb-field is-wide"><label for="mail_encryption">Seguridad de la conexión</label><select id="mail_encryption" name="mail_encryption"><option value="tls" <?= $cfg['mail_encryption']==='tls'?'selected':'' ?>>TLS / STARTTLS, normalmente puerto 587</option><option value="ssl" <?= $cfg['mail_encryption']==='ssl'?'selected':'' ?>>SSL, normalmente puerto 465</option><option value="none" <?= $cfg['mail_encryption']==='none'?'selected':'' ?>>Sin cifrado, no recomendado</option></select><small>Debe coincidir con la información entregada por Gmail o por “Conectar dispositivos” en cPanel.</small></div>
</div></section>

<section class="wb-mail-group wb-mail-step"><h3><span class="wb-mail-step-number">2</span> Ingresa el acceso SMTP</h3><p>Estos datos permiten que el servidor inicie sesión en la cuenta que enviará los correos.</p><div class="wb-grid">
<div class="wb-field is-wide"><label for="mail_host">Servidor SMTP</label><input id="mail_host" name="mail_host" value="<?= htmlspecialchars($cfg['mail_host']) ?>" placeholder="smtp.gmail.com o mail.tudominio.com"><small>Dirección del servidor de salida. En Gmail usa smtp.gmail.com.</small></div>
<div class="wb-field af-v12-smtp-pair"><label for="mail_port">Puerto SMTP</label><input type="number" min="1" max="65535" id="mail_port" name="mail_port" value="<?= htmlspecialchars($cfg['mail_port']) ?>"><small>Normalmente 587 con TLS o 465 con SSL.</small></div>
<div class="wb-field af-v12-smtp-pair"><label for="mail_username">Correo o usuario</label><input id="mail_username" name="mail_username" autocomplete="username" value="<?= htmlspecialchars($cfg['mail_username']) ?>" placeholder="correo@dominio.com"><small>Generalmente es la dirección completa de correo.</small></div>
<div class="wb-field is-wide"><label for="mail_password">Contraseña SMTP o clave de aplicación</label><input type="password" id="mail_password" name="mail_password" autocomplete="new-password" placeholder="<?= $cfg['mail_password_enc']!==''?'Ya existe una contraseña guardada; déjala vacía para conservarla':'Ingresa la contraseña o clave de aplicación' ?>"><small>Se guarda cifrada. Gmail requiere una contraseña de aplicación; no uses la contraseña normal.</small></div>
</div></section>

<section class="wb-mail-group wb-mail-step"><h3><span class="wb-mail-step-number">3</span> Define el remitente y prueba</h3><p>Configura el nombre que verá el usuario y envía una prueba antes de utilizar la recuperación de contraseña.</p><div class="wb-grid">
<div class="wb-field is-wide"><label for="mail_from_email">Correo que aparecerá como remitente</label><input type="email" id="mail_from_email" name="mail_from_email" value="<?= htmlspecialchars($cfg['mail_from_email']) ?>" placeholder="no-reply@tudominio.com"><small>Conviene que sea el mismo correo usado como usuario SMTP para evitar rechazos.</small></div>
<div class="wb-field is-wide"><label for="mail_from_name">Nombre visible del remitente</label><input id="mail_from_name" name="mail_from_name" value="<?= htmlspecialchars($cfg['mail_from_name'] ?: $cfg['marca_nombre']) ?>"><small>Ejemplo: Ave Fénix Soporte. Se verá en la bandeja de entrada del destinatario.</small></div>
<div class="wb-field"><label>Validar identidad del servidor SMTP</label><label class="wb-toggle"><input type="checkbox" name="mail_verify_peer" value="1" <?= $cfg['mail_verify_peer']==='1'?'checked':'' ?>> Verificar certificado TLS (recomendado)</label><small>Comprueba que el servidor de correo sea auténtico y que la conexión cifrada no haya sido interceptada. Déjalo activo; desactívalo únicamente si tu proveedor usa un certificado propio y te lo indica expresamente.</small></div>
<div class="wb-field"><label>Contraseña SMTP almacenada</label><label class="wb-toggle"><input type="checkbox" name="mail_clear_password" value="1"> Borrar la contraseña guardada al guardar</label><small>No es una opción de seguridad diaria. Márcala solo para eliminar la clave cifrada porque cambiarás de correo, ingresarás una contraseña nueva o dejarás de usar SMTP. Si todo funciona, déjala desmarcada.</small></div>

<div class="wb-field is-wide"><label>Comprobar antes de publicar</label><button type="submit" name="test_mail_after_save" value="1" class="wb-mini-btn wb-mail-test-button"><i class="fas fa-paper-plane"></i> Guardar y enviar correo de prueba</button><small>Guarda toda la configuración de Marca Blanca y realiza un envío real al correo indicado.</small></div>
</div></section>

<div class="wb-help-box wb-mail-runtime"><strong>Datos rápidos:</strong> Gmail usa <code>smtp.gmail.com</code>, puerto <code>587</code>, TLS y contraseña de aplicación. En cPanel abre “Cuentas de correo → Conectar dispositivos” y copia servidor, puerto y cifrado.</div>
</div></article>
</div></section>

<section class="wb-panel <?= $activeTab==='puesta'?'is-active':'' ?>" data-wb-panel="puesta"><div class="wb-section-grid"><article class="wb-section wb-danger is-wide"><header class="wb-section-head"><div><h2>Puesta en marcha</h2><p>Limpia los datos de demostración antes de entregar una instalación nueva.</p></div><span class="wb-section-icon"><i class="fas fa-rocket"></i></span></header>
<div class="wb-cleanup-grid"><?php foreach($cleanupCounts as $label=>$value):?><article><span><?= htmlspecialchars($label) ?></span><strong><?= number_format($value) ?></strong></article><?php endforeach;?></div>
<div class="wb-danger-note"><i class="fas fa-triangle-exclamation"></i><div><strong>Acción irreversible.</strong> Se conservan usuarios con rol Superadmin, plataformas, asuntos, alias, planes, roles, permisos, mensajes, plantillas y configuración de marca. Se eliminan los demás usuarios y todos los datos operativos: pagos, suscripciones, créditos, buzones, dominios, cuentas, historiales operativos, asociaciones y pruebas.</div></div>
</article></div></section>

</form>

<form method="post" id="launchResetForm" class="wb-panel <?= $activeTab==='puesta'?'is-active':'' ?>" data-wb-reset-form style="margin-top:12px">
<?= Security::csrfField() ?><input type="hidden" name="action" value="launch_reset">
<article class="wb-section wb-danger"><header class="wb-section-head"><div><h2>Confirmar limpieza operativa</h2><p>Se requiere la contraseña del Superadmin y una frase exacta.</p></div><span class="wb-section-icon"><i class="fas fa-lock"></i></span></header><div class="wb-danger-confirm">
<div class="wb-field"><label for="current_password">Contraseña actual</label><input type="password" id="current_password" name="current_password" autocomplete="current-password" required></div>
<div class="wb-field"><label for="confirm_phrase">Escribe PUESTA EN MARCHA</label><input id="confirm_phrase" name="confirm_phrase" autocomplete="off" required></div>
<label class="wb-toggle wb-danger-check"><input type="checkbox" name="confirm_cleanup" value="1" required> Comprendo que los datos eliminados no podrán recuperarse desde el sistema.</label>
<div class="wb-danger-check"><button type="submit" class="wb-danger-button"><i class="fas fa-trash-can"></i> Ejecutar puesta en marcha</button></div>
</div></article></form>
</div>

<aside class="wb-preview" style="--wb-primary:<?= htmlspecialchars($cfg['marca_color_primario']) ?>;--wb-button:<?= htmlspecialchars($cfg['marca_color_boton']) ?>;--wb-button-text:<?= htmlspecialchars($cfg['marca_color_boton_texto']) ?>"><div class="wb-preview-top" id="wbPreviewTop"></div><div class="wb-preview-body"><div class="wb-logo"><img id="wbPreviewLogo" src="../<?= htmlspecialchars(ltrim($cfg['marca_logo'],'/')) ?>" alt="Logo" onerror="this.style.display='none'"></div><h3 id="wbPreviewName"><?= htmlspecialchars($cfg['marca_nombre']) ?></h3><p id="wbPreviewSlogan"><?= htmlspecialchars($cfg['marca_eslogan']) ?></p><span class="wb-preview-btn"><i class="fas fa-arrow-right"></i><span id="wbPreviewCta"><?= htmlspecialchars($cfg['marca_landing_cta']) ?></span></span><div class="wb-preview-meta"><span>Paleta <strong id="wbPreviewPalette"><?= htmlspecialchars($palettes[$cfg['marca_paleta']]['label'] ?? 'Personalizada') ?></strong></span><span>Moneda <strong id="wbPreviewCurrency"><?= htmlspecialchars($cfg['moneda_simbolo'].' '.$cfg['moneda']) ?></strong></span><span>Idioma <strong><?= htmlspecialchars(strtoupper($cfg['idioma'])) ?></strong></span></div></div></aside>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
    const tabs=[...document.querySelectorAll('[data-wb-tab]')], panels=[...document.querySelectorAll('[data-wb-panel]')], activeInput=document.getElementById('wbActiveTab');
    const activate = name => { tabs.forEach(t=>t.classList.toggle('is-active',t.dataset.wbTab===name)); panels.forEach(p=>p.classList.toggle('is-active',p.dataset.wbPanel===name)); if(activeInput)activeInput.value=name; const discard=document.getElementById('wbDiscardLink');if(discard)discard.href='configurar_marca.php?tab='+encodeURIComponent(name); const reset=document.querySelector('[data-wb-reset-form]'); if(reset)reset.classList.toggle('is-active',name==='puesta'); };
    tabs.forEach(tab=>tab.addEventListener('click',()=>activate(tab.dataset.wbTab)));

    const colorKeys=['marca_color_primario','marca_color_secundario','marca_color_acento','marca_color_sidebar','marca_color_fondo','marca_color_boton','marca_color_boton_texto','marca_color_header_publico','marca_color_header_publico_texto','marca_color_header_admin','marca_color_header_admin_texto','marca_color_footer','marca_color_footer_texto','marca_color_iconos_publicos','marca_color_iconos_admin'];
    const paletteInput=document.getElementById('marca_paleta'), previewPalette=document.getElementById('wbPreviewPalette');
    document.querySelectorAll('[data-palette]').forEach(button=>button.addEventListener('click',()=>{
        document.querySelectorAll('[data-palette]').forEach(b=>b.classList.toggle('is-active',b===button));
        paletteInput.value=button.dataset.palette; previewPalette.textContent=button.querySelector('strong')?.textContent||'Personalizada';
        if(button.dataset.colors){const colors=JSON.parse(button.dataset.colors);colorKeys.forEach((key,index)=>{const input=document.getElementById(key),picker=document.getElementById(key+'_picker');input.value=colors[index];picker.value=colors[index];input.dispatchEvent(new Event('input',{bubbles:true}));});}
    }));
    const indexColorKeys=['marca_index_fondo','marca_index_superficie','marca_index_fondo_suave','marca_index_texto','marca_index_texto_secundario','marca_index_oscuro','marca_index_oscuro_secundario','marca_index_texto_oscuro','marca_plan_tarjeta','marca_plan_borde','marca_plan_destacado','marca_plan_precio_fondo'];
    const indexPaletteInput=document.getElementById('marca_index_paleta');
    document.querySelectorAll('[data-index-palette]').forEach(button=>button.addEventListener('click',()=>{
        document.querySelectorAll('[data-index-palette]').forEach(b=>b.classList.toggle('is-active',b===button));
        indexPaletteInput.value=button.dataset.indexPalette;
        if(button.dataset.indexColors){const colors=JSON.parse(button.dataset.indexColors);indexColorKeys.forEach((key,index)=>{const input=document.getElementById(key),picker=document.getElementById(key+'_picker');if(!input||!picker)return;input.value=colors[index];picker.value=colors[index];});}
    }));
    document.querySelectorAll('[data-color-target]').forEach(picker=>{const input=document.getElementById(picker.dataset.colorTarget);if(!input)return;picker.addEventListener('input',()=>{input.value=picker.value;input.dispatchEvent(new Event('input',{bubbles:true}));});input.addEventListener('input',()=>{if(/^#[0-9a-f]{6}$/i.test(input.value))picker.value=input.value;if(colorKeys.includes(input.id)){paletteInput.value='personalizada';document.querySelectorAll('[data-palette]').forEach(b=>b.classList.toggle('is-active',b.dataset.palette==='personalizada'));previewPalette.textContent='Personalizada';}if(indexColorKeys.includes(input.id)){indexPaletteInput.value='personalizada';document.querySelectorAll('[data-index-palette]').forEach(b=>b.classList.toggle('is-active',b.dataset.indexPalette==='personalizada'));}});});
    const primary=document.getElementById('marca_color_primario'),buttonColor=document.getElementById('marca_color_boton'),buttonText=document.getElementById('marca_color_boton_texto'),previewTop=document.getElementById('wbPreviewTop'),previewButton=document.querySelector('.wb-preview-btn'); primary?.addEventListener('input',()=>{previewTop.style.background=primary.value;}); buttonColor?.addEventListener('input',()=>{previewButton.style.background=buttonColor.value;}); buttonText?.addEventListener('input',()=>{previewButton.style.color=buttonText.value;});
    const bindText=(inputId,previewId,fallback)=>{const input=document.getElementById(inputId),preview=document.getElementById(previewId);input?.addEventListener('input',()=>preview.textContent=input.value||fallback);};
    bindText('marca_nombre','wbPreviewName','Nombre de marca');bindText('marca_eslogan','wbPreviewSlogan','Eslogan');bindText('marca_landing_cta','wbPreviewCta','Acción principal');
    const currency=document.getElementById('moneda'),symbol=document.getElementById('moneda_simbolo'),currencyPreview=document.getElementById('wbPreviewCurrency');const currencySymbols={PEN:'S/',USD:'$',EUR:'€',MXN:'$',COP:'$',ARS:'$',CLP:'$',BRL:'R$',BOB:'Bs',PYG:'₲',UYU:'$',VES:'Bs',DOP:'RD$',GTQ:'Q',HNL:'L',CRC:'₡',PAB:'B/.',GBP:'£',CAD:'C$',AUD:'A$',JPY:'¥'};const syncCurrency=()=>{const code=(currency.value||'').toUpperCase();currency.value=code;if(currencySymbols[code]&&(!symbol.dataset.manual||symbol.dataset.manual==='0'))symbol.value=currencySymbols[code];currencyPreview.textContent=(symbol.value||'')+' '+code;};currency?.addEventListener('input',syncCurrency);symbol?.addEventListener('input',()=>{symbol.dataset.manual='1';syncCurrency();});
    const logo=document.getElementById('marca_logo'),previewLogo=document.getElementById('wbPreviewLogo');logo?.addEventListener('input',()=>{if(logo.value){previewLogo.style.display='';previewLogo.src=/^(https?:|data:|\/)/.test(logo.value)?logo.value:'../'+logo.value.replace(/^\.\//,'');}});document.getElementById('upload_logo')?.addEventListener('change',e=>{const file=e.target.files?.[0];if(file){previewLogo.style.display='';previewLogo.src=URL.createObjectURL(file);}});

    document.querySelectorAll('[data-mail-preset]').forEach(button=>button.addEventListener('click',()=>{
        const gmail=button.dataset.mailPreset==='gmail',host=document.getElementById('mail_host'),port=document.getElementById('mail_port'),enc=document.getElementById('mail_encryption'),transport=document.getElementById('mail_transport'),user=document.getElementById('mail_username'),from=document.getElementById('mail_from_email');
        transport.value='smtp';
        if(gmail){host.value='smtp.gmail.com';port.value='587';enc.value='tls';}
        else{const parts=location.hostname.replace(/^www\./,'').split('.');const domain=parts.length>2?parts.slice(-2).join('.'):parts.join('.');host.value='mail.'+domain;port.value='465';enc.value='ssl';}
        if(user.value&&!from.value)from.value=user.value;
    }));
    document.getElementById('launchResetForm')?.addEventListener('submit',event=>{event.preventDefault();Swal.fire({title:'¿Ejecutar puesta en marcha?',html:'Se eliminarán usuarios no Superadmin y todos los datos operativos.<br><strong>Esta acción es irreversible.</strong>',icon:'warning',showCancelButton:true,confirmButtonText:'Sí, limpiar instalación',cancelButtonText:'Cancelar',confirmButtonColor:'#b91c1c'}).then(result=>{if(result.isConfirmed)event.target.submit();});});
});
</script>

<!-- AFENIXX-V11-ASSETS -->
<link rel="stylesheet" href="../assets/css/afenixx_v11.css?v=2026.07.24-v11">
<script src="../assets/js/afenixx_v11.js?v=2026.07.24-v11"></script>
<?php require_once __DIR__ . '/admin_footer.php'; ?>

<!-- AFENIXX-V12-ASSETS -->
<link rel="stylesheet" href="../assets/css/afenixx_v12.css?v=2026.07.24-v12">
<script src="../assets/js/afenixx_v12.js?v=2026.07.24-v12"></script>
