<?php

namespace App\Services;

/*
 * PermissionService — единый реестр прав доступа.
 *
 * Роли (по убыванию силы): superadmin → admin → editor → viewer
 * superadmin: все права автоматически
 * admin: всё кроме users.manage (если не выдано явно)
 * editor: управление контентом и автомобилями
 * viewer: только просмотр
 *
 * Индивидуальные overrides (user_permissions) перекрывают роль:
 *   action=allow → разрешает, даже если роль не даёт
 *   action=deny  → запрещает, даже если роль разрешает
 *
 * superadmin НЕ может быть ограничен deny-записями.
 */

use App\Models\User;

class PermissionService
{
    // Все доступные разрешения, сгруппированные по секции
    public static function all(): array
    {
        return [
            'Автомобили' => [
                'cars.view' => 'Просмотр каталога авто',
                'cars.edit' => 'Управление авто (создание / редактирование / удаление)',
            ],
            'Контент сайта' => [
                'pages.view' => 'Просмотр страниц',
                'pages.edit' => 'Редактирование страниц',
                'blocks.view' => 'Просмотр блоков',
                'blocks.edit' => 'Редактирование блоков',
            ],
            'Справочники' => [
                'manuals.view' => 'Просмотр справочников',
                'manuals.edit' => 'Управление справочниками',
            ],
            'Система' => [
                'settings.view' => 'Просмотр настроек',
                'settings.edit' => 'Изменение настроек',
                'users.view' => 'Просмотр пользователей',
                'users.manage' => 'Управление пользователями и правами',
            ],
        ];
    }

    // Плоский список ключей
    public static function keys(): array
    {
        return array_merge(...array_values(array_map('array_keys', static::all())));
    }

    // Права роли по умолчанию
    public static function roleDefaults(string $role): array
    {
        return match ($role) {
            'superadmin' => static::keys(), // все
            'admin' => [
                'cars.view', 'cars.edit',
                'pages.view', 'pages.edit',
                'blocks.view', 'blocks.edit',
                'manuals.view', 'manuals.edit',
                'settings.view', 'settings.edit',
                'users.view',
                // users.manage — только если выдано явно
            ],
            'editor' => [
                'cars.view', 'cars.edit',
                'pages.view', 'pages.edit',
                'blocks.view', 'blocks.edit',
                'manuals.view',
            ],
            'viewer' => [
                'cars.view',
                'pages.view',
                'blocks.view',
                'manuals.view',
            ],
            default => [],
        };
    }

    // Проверка: имеет ли пользователь конкретное право
    public static function userCan(User $user, string $permission): bool
    {
        // superadmin всегда может
        if ($user->role === 'superadmin') {
            return true;
        }

        // Нет роли — нет доступа в админку
        if (! $user->role) {
            return false;
        }

        // Индивидуальный override (кешируется в сессии через preloaded relation)
        $override = $user->userPermissions
            ->firstWhere('permission', $permission);

        if ($override) {
            return $override->action === 'allow';
        }

        // Дефолты роли
        return in_array($permission, static::roleDefaults($user->role), true);
    }

    // Метки ролей для UI
    public static function roleLabels(): array
    {
        return [
            'superadmin' => ['label' => 'Главный администратор', 'color' => 'danger'],
            'admin' => ['label' => 'Администратор',         'color' => 'warning'],
            'editor' => ['label' => 'Редактор',              'color' => 'info'],
            'viewer' => ['label' => 'Наблюдатель',           'color' => 'secondary'],
        ];
    }
}
