<?php

/**
 * Setup Script: SLM Super Profile
 *
 * Este script crea el perfil SLM Super y la infraestructura básica del sistema:
 * - Perfil SLM Super con acceso completo a configuración
 * - Módulos de configuración (users, profile, modules)
 * - Estructura de menú
 * - Usuario administrador
 *
 * IMPORTANTE: Este debe ser el PRIMER script ejecutado en una instalación nueva.
 */

// Cargar sistema SLM
require_once __DIR__ . '/../appweb/slm.framework/system/config.slm';
require_once __DIR__ . '/../appweb/slm.framework/system/helpers.slm';
require_once __DIR__ . '/../appweb/slm.framework/system/slm_es_control.slm';

echo "\n";
echo "╔════════════════════════════════════════════════════════════╗\n";
echo "║         SETUP: SLM Super Profile & Admin User             ║\n";
echo "╚════════════════════════════════════════════════════════════╝\n";
echo "\n";

/**
 * Crea el perfil SLM Super con acceso completo a módulos de configuración
 */
function createSLMSuperProfile(): string
{
    echo "📋 Creando perfil SLM Super...\n";

    // Verificar si ya existe
    $existing = getObjectWithValue('profile', 'name.keyword', 'SLM Super');
    if ($existing) {
        echo "   ℹ️  Perfil SLM Super ya existe (ID: {$existing['id']})\n";
        return $existing['id'];
    }

    $profile = [
        'name' => 'SLM Super',
        'description' => 'Perfil administrativo con acceso completo a configuración del sistema',
        'status' => 'active',
        'acl' => [],  // Se configurará después de crear los grupos de menú
        'default_view' => 'home.main',
        'slm' => [
            'type' => 'profile',
            'timestamp' => getTimestamp()
        ]
    ];

    $result = setNewObject($profile);

    if (!isset($result['_id'])) {
        throw new Exception("Error al crear perfil SLM Super");
    }

    echo "   ✓ Perfil SLM Super creado (ID: {$result['_id']})\n";
    return $result['_id'];
}

/**
 * Registra un módulo en Elasticsearch
 */
function registerModule(string $name, string $folder): string
{
    echo "   📦 Registrando módulo: {$name}...\n";

    // Verificar si ya existe
    $existing = getObjectWithValue('module', 'folder.keyword', $folder);
    if ($existing) {
        echo "      ℹ️  Módulo ya existe (ID: {$existing['id']})\n";
        return $existing['id'];
    }

    list($directory, $file) = explode('.', $folder);

    $module = [
        'name' => $name,
        'directory' => $directory,
        'file' => $file,
        'folder' => $folder,
        'status' => 'active',
        'slm' => [
            'type' => 'module',
            'timestamp' => getTimestamp()
        ]
    ];

    $result = setNewObject($module);

    if (!isset($result['_id'])) {
        throw new Exception("Error al registrar módulo {$folder}");
    }

    echo "      ✓ Módulo registrado (ID: {$result['_id']})\n";
    return $result['_id'];
}

/**
 * Crea un menú simple
 */
function createSimpleMenu(string $name, string $icon, string $moduleId): string
{
    echo "   🔗 Creando menú simple: {$name}...\n";

    $menu = [
        'name' => $name,
        'icon' => $icon,
        'folder' => $moduleId,
        'display' => 'true',
        'status' => 'active',
        'slm' => [
            'type' => 'simple_menu',
            'timestamp' => getTimestamp()
        ]
    ];

    $result = setNewObject($menu);

    if (!isset($result['_id'])) {
        throw new Exception("Error al crear menú simple {$name}");
    }

    echo "      ✓ Menú simple creado (ID: {$result['_id']})\n";
    return $result['_id'];
}

/**
 * Crea un menú desplegable (dropdown)
 */
function createDropdownMenu(string $name, string $icon, array $moduleIds): string
{
    echo "   📂 Creando menú desplegable: {$name}...\n";

    $modules = [];
    foreach ($moduleIds as $moduleId) {
        $modules[] = [
            'folder' => $moduleId,
            'display' => ['true']
        ];
    }

    $menu = [
        'name' => $name,
        'icon' => $icon,
        'display' => 'true',
        'module' => $modules,
        'status' => 'active',
        'slm' => [
            'type' => 'dropdown_menu',
            'timestamp' => getTimestamp()
        ]
    ];

    $result = setNewObject($menu);

    if (!isset($result['_id'])) {
        throw new Exception("Error al crear menú desplegable {$name}");
    }

    echo "      ✓ Menú desplegable creado (ID: {$result['_id']})\n";
    return $result['_id'];
}

/**
 * Crea un grupo de menú (sidebar section)
 */
function createMenuGroup(string $title, int $order, array $menuItemIds): string
{
    echo "   📁 Creando grupo de menú: {$title}...\n";

    $menuItems = [];
    foreach ($menuItemIds as $itemId) {
        $menuItems[] = ['item' => $itemId];
    }

    $group = [
        'title' => $title,
        'order' => $order,
        'menu' => $menuItems,
        'status' => 'active',
        'display' => 'true',
        'slm' => [
            'type' => 'group_menu',
            'timestamp' => getTimestamp()
        ]
    ];

    $result = setNewObject($group);

    if (!isset($result['_id'])) {
        throw new Exception("Error al crear grupo de menú {$title}");
    }

    echo "      ✓ Grupo de menú creado (ID: {$result['_id']})\n";
    return $result['_id'];
}

/**
 * Actualiza el ACL del perfil SLM Super con los grupos de menú creados
 */
function updateProfileACL(string $profileId, array $groupIds, array $moduleMap): void
{
    echo "🔐 Actualizando ACL del perfil SLM Super...\n";

    $acl = [];

    foreach ($groupIds as $groupId) {
        $acl[$groupId] = [];

        // Agregar permisos para cada módulo en este grupo
        foreach ($moduleMap[$groupId] as $folder) {
            $acl[$groupId][$folder] = ['read', 'create', 'update', 'delete'];
        }
    }

    $updateData = ['acl' => $acl];
    $result = updateObjectByID($profileId, $updateData);

    if (isset($result['result']) && $result['result'] === 'updated') {
        echo "   ✓ ACL actualizado correctamente\n";
    } else {
        throw new Exception("Error al actualizar ACL del perfil");
    }
}

/**
 * Crea el usuario administrador con perfil SLM Super
 */
function createAdminUser(string $profileId): string
{
    echo "👤 Creando usuario administrador...\n";

    // Verificar si ya existe
    $email = 'admin@example.com';
    $existing = getObjectWithValue('user', 'email.keyword', $email);
    if ($existing) {
        echo "   ℹ️  Usuario admin ya existe (ID: {$existing['id']})\n";
        echo "   📧 Email: {$email}\n";
        return $existing['id'];
    }

    $password = 'admin123';  // Cambiar en producción

    $user = [
        'name' => 'ADMINISTRADOR',
        'lastname' => 'SISTEMA',
        'email' => $email,
        'password' => md5($password),
        'email_confirmed' => true,
        'country_code' => '52',
        'telephone_number' => '5500000000',
        'profile' => $profileId,
        'status' => 'active',
        'slm' => [
            'type' => 'user',
            'timestamp' => getTimestamp()
        ]
    ];

    $result = setNewObject($user);

    if (!isset($result['_id'])) {
        throw new Exception("Error al crear usuario administrador");
    }

    echo "   ✓ Usuario administrador creado (ID: {$result['_id']})\n";
    echo "   📧 Email: {$email}\n";
    echo "   🔑 Password: {$password}\n";

    return $result['_id'];
}

/**
 * Proceso principal
 */
try {
    // PASO 1: Crear perfil SLM Super
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    echo "PASO 1: Crear Perfil SLM Super\n";
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    $profileId = createSLMSuperProfile();
    echo "\n";

    // PASO 2: Registrar módulos
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    echo "PASO 2: Registrar Módulos de Configuración\n";
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";

    $homeModuleId = registerModule('Inicio', 'home.main');
    $usersModuleId = registerModule('Usuarios', 'config.users');
    $profileModuleId = registerModule('Perfiles de usuario', 'config.profile');
    $modulesModuleId = registerModule('Módulos', 'config.modules');

    echo "\n";

    // PASO 3: Crear estructura de menú
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    echo "PASO 3: Crear Estructura de Menú\n";
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";

    // Menú simple: Inicio
    $homeMenuId = createSimpleMenu('Inicio', 'home', $homeModuleId);

    // Menú desplegable: Configuración
    $configMenuId = createDropdownMenu(
        'Configuración',
        'settings',
        [$profileModuleId, $usersModuleId, $modulesModuleId]
    );

    // Grupo de menú: Principal
    $mainGroupId = createMenuGroup('Menú', 0, [$homeMenuId]);

    // Grupo de menú: Configuración
    $configGroupId = createMenuGroup('Configuración', 99, [$configMenuId]);

    echo "\n";

    // PASO 4: Actualizar ACL del perfil
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    echo "PASO 4: Configurar Permisos (ACL)\n";
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";

    $moduleMap = [
        $mainGroupId => ['home.main'],
        $configGroupId => ['config.profile', 'config.users', 'config.modules']
    ];

    updateProfileACL($profileId, [$mainGroupId, $configGroupId], $moduleMap);
    echo "\n";

    // PASO 5: Crear usuario administrador
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    echo "PASO 5: Crear Usuario Administrador\n";
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    $userId = createAdminUser($profileId);
    echo "\n";

    // Resumen
    echo "╔════════════════════════════════════════════════════════════╗\n";
    echo "║                    ✓ SETUP COMPLETADO                      ║\n";
    echo "╚════════════════════════════════════════════════════════════╝\n";
    echo "\n";
    echo "📊 Resumen:\n";
    echo "   • Perfil SLM Super: {$profileId}\n";
    echo "   • Usuario Admin: {$userId}\n";
    echo "   • Módulos registrados: 4 (home, users, profile, modules)\n";
    echo "   • Grupos de menú: 2 (Principal, Configuración)\n";
    echo "\n";
    echo "🚀 Próximos pasos:\n";
    echo "   1. Acceder al sistema con las credenciales del admin\n";
    echo "   2. Navegar a Configuración → Perfiles para ver el perfil\n";
    echo "   3. Navegar a Configuración → Usuarios para gestionar usuarios\n";
    echo "   4. Navegar a Configuración → Módulos para registrar nuevos módulos\n";
    echo "\n";
    echo "📚 Documentación:\n";
    echo "   • docs/es_MX/03-profile-user-module-menu.md\n";
    echo "   • docs/es_MX/06-user-specific-permissions.md\n";
    echo "   • docs/es_MX/05-modules-complete-guide.md\n";
    echo "\n";

} catch (Exception $e) {
    echo "\n";
    echo "╔════════════════════════════════════════════════════════════╗\n";
    echo "║                      ✗ ERROR                               ║\n";
    echo "╚════════════════════════════════════════════════════════════╝\n";
    echo "\n";
    echo "Error: " . $e->getMessage() . "\n";
    echo "Trace: " . $e->getTraceAsString() . "\n";
    echo "\n";
    exit(1);
}
