<?php

/**
 * Migration: gnexus-auth integration tables
 * Date: 2026-06-06
 */

return function(\Fury\Modules\ThinBuilder\ThinBuilder $tb) {

    // 1. shserv_users
    $tb->query("
        CREATE TABLE IF NOT EXISTS shserv_users (
            id INT AUTO_INCREMENT PRIMARY KEY,
            gauth_user_id VARCHAR(64) NOT NULL UNIQUE,
            email VARCHAR(255) NOT NULL,
            display_name VARCHAR(255),
            avatar_url VARCHAR(500),
            system_role VARCHAR(32) NOT NULL DEFAULT 'user',
            status VARCHAR(32) NOT NULL DEFAULT 'active',
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            INDEX idx_gauth (gauth_user_id),
            INDEX idx_email (email),
            INDEX idx_role (system_role),
            INDEX idx_status (status)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ");

    // 2. shserv_roles
    $tb->query("
        CREATE TABLE IF NOT EXISTS shserv_roles (
            id INT AUTO_INCREMENT PRIMARY KEY,
            slug VARCHAR(32) NOT NULL UNIQUE,
            name VARCHAR(64) NOT NULL,
            is_system TINYINT(1) NOT NULL DEFAULT 0,
            default_permissions JSON,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ");

    // 3. shserv_permissions
    $tb->query("
        CREATE TABLE IF NOT EXISTS shserv_permissions (
            id INT AUTO_INCREMENT PRIMARY KEY,
            slug VARCHAR(64) NOT NULL UNIQUE,
            name VARCHAR(128) NOT NULL,
            description TEXT,
            default_for_roles JSON,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ");

    // 4. shserv_user_permissions
    $tb->query("
        CREATE TABLE IF NOT EXISTS shserv_user_permissions (
            id INT AUTO_INCREMENT PRIMARY KEY,
            user_id INT NOT NULL,
            permission_slug VARCHAR(64) NOT NULL,
            granted TINYINT(1) NOT NULL DEFAULT 1,
            set_by_user_id INT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            UNIQUE KEY uk_user_perm (user_id, permission_slug),
            INDEX idx_user (user_id),
            FOREIGN KEY (user_id) REFERENCES shserv_users(id) ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ");

    // 5. shserv_groups
    $tb->query("
        CREATE TABLE IF NOT EXISTS shserv_groups (
            id INT AUTO_INCREMENT PRIMARY KEY,
            gauth_group_id VARCHAR(64) NOT NULL UNIQUE,
            slug VARCHAR(64) NOT NULL,
            name VARCHAR(128) NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ");

    // 6. shserv_group_members
    $tb->query("
        CREATE TABLE IF NOT EXISTS shserv_group_members (
            id INT AUTO_INCREMENT PRIMARY KEY,
            group_id INT NOT NULL,
            user_id INT NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            UNIQUE KEY uk_membership (group_id, user_id),
            FOREIGN KEY (group_id) REFERENCES shserv_groups(id) ON DELETE CASCADE,
            FOREIGN KEY (user_id) REFERENCES shserv_users(id) ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ");

    // 7. shserv_group_permissions
    $tb->query("
        CREATE TABLE IF NOT EXISTS shserv_group_permissions (
            id INT AUTO_INCREMENT PRIMARY KEY,
            group_id INT NOT NULL,
            permission_slug VARCHAR(64) NOT NULL,
            granted TINYINT(1) NOT NULL DEFAULT 1,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            UNIQUE KEY uk_group_perm (group_id, permission_slug),
            FOREIGN KEY (group_id) REFERENCES shserv_groups(id) ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ");

    // 8. shserv_sessions
    $tb->query("
        CREATE TABLE IF NOT EXISTS shserv_sessions (
            id INT AUTO_INCREMENT PRIMARY KEY,
            user_id INT NOT NULL,
            session_token VARCHAR(128) NOT NULL UNIQUE,
            refresh_token VARCHAR(255),
            access_token VARCHAR(255),
            expires_at TIMESTAMP NULL,
            ip_address VARCHAR(45),
            user_agent VARCHAR(255),
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            INDEX idx_token (session_token),
            FOREIGN KEY (user_id) REFERENCES shserv_users(id) ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ");

    // 9. shserv_audit
    $tb->query("
        CREATE TABLE IF NOT EXISTS shserv_audit (
            id INT AUTO_INCREMENT PRIMARY KEY,
            actor_user_id INT NOT NULL,
            action VARCHAR(64) NOT NULL,
            target_type VARCHAR(32),
            target_id INT,
            old_value JSON,
            new_value JSON,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            INDEX idx_actor (actor_user_id),
            INDEX idx_action (action),
            INDEX idx_created (created_at)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ");

    // Seed roles
    $roles = [
        ['superadmin', 'Суперадминистратор', 1, json_encode(['*'])],
        ['admin', 'Администратор', 1, json_encode(['devices.*', 'areas.*', 'scripts.*', 'firmware.*', 'admin.users', 'admin.roles', 'admin.audit', 'settings.edit'])],
        ['user', 'Пользователь', 1, json_encode(['devices.view', 'devices.scan', 'devices.control', 'devices.setup', 'areas.view', 'scripts.view', 'scripts.run'])],
        ['guest', 'Гость', 0, json_encode(['devices.view'])],
    ];
    $stmt = $tb->prepare("
        INSERT IGNORE INTO shserv_roles (slug, name, is_system, default_permissions)
        VALUES (?, ?, ?, ?)
    ");
    foreach ($roles as $role) {
        $stmt->execute($role);
    }

    // Seed permissions
    $permissions = [
        ['devices.view', 'Просмотр устройств', 'Просмотр списка устройств и их статуса', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => true])],
        ['devices.scan', 'Сканирование сети', 'Поиск новых устройств в локальной сети', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => false])],
        ['devices.control', 'Управление устройствами', 'Включение/выключение, изменение состояния каналов', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => false])],
        ['devices.setup', 'Добавление устройств', 'Регистрация новых устройств в системе', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => false])],
        ['devices.edit', 'Редактирование устройств', 'Изменение имени, зоны, схемы каналов', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])],
        ['devices.delete', 'Удаление устройств', 'Удаление устройств из системы', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])],
        ['areas.view', 'Просмотр зон', 'Просмотр списка зон', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => true])],
        ['areas.manage', 'Управление зонами', 'Создание, редактирование, удаление зон', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])],
        ['scripts.view', 'Просмотр скриптов', 'Просмотр списка скриптов автоматизации', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => false])],
        ['scripts.edit', 'Редактирование скриптов', 'Создание и изменение скриптов', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])],
        ['scripts.run', 'Запуск скриптов', 'Ручной запуск скриптов автоматизации', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => false])],
        ['firmware.view', 'Просмотр прошивок', 'Просмотр списка доступных прошивок', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])],
        ['firmware.upload', 'Загрузка прошивок', 'Загрузка новых версий прошивок', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])],
        ['admin.users', 'Управление пользователями', 'Просмотр и редактирование пользователей', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])],
        ['admin.roles', 'Управление ролями', 'Назначение ролей и прав', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])],
        ['admin.audit', 'Просмотр аудита', 'Просмотр журнала действий', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])],
        ['settings.edit', 'Настройки системы', 'Изменение глобальных настроек', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])],
    ];
    $stmt = $tb->prepare("
        INSERT IGNORE INTO shserv_permissions (slug, name, description, default_for_roles)
        VALUES (?, ?, ?, ?)
    ");
    foreach ($permissions as $perm) {
        $stmt->execute($perm);
    }

    return true;
};
