<?php

/**
 * 文件功能：职务权限判断服务
 * 负责把当前用户的在职职务权限转换为统一布尔判断，
 * 供控制器和 Blade 视图复用。
 */

namespace App\Services;

use App\Models\User;
use App\Support\PositionPermissionRegistry;

/**
 * 类功能：统一提供用户职务权限读取与校验方法。
 */
class PositionPermissionService
{
    /**
     * 返回当前用户拥有的全部聊天室权限码。
     *
     * 规则：所有用户都仅按当前在职职务的 permissions 生效。
     *
     * @return list<string>
     */
    public function permissionsForUser(?User $user): array
    {
        if (! $user) {
            return [];
        }

        $position = $user->activePosition?->position;
        if (! $position) {
            return [];
        }

        return array_values(array_intersect(
            PositionPermissionRegistry::codes(),
            $position->permissions ?? [],
        ));
    }

    /**
     * 返回当前用户全部权限的布尔映射表。
     *
     * @return array<string, bool>
     */
    public function permissionMapForUser(?User $user): array
    {
        $permissionMap = array_fill_keys(PositionPermissionRegistry::codes(), false);

        foreach ($this->permissionsForUser($user) as $permission) {
            $permissionMap[$permission] = true;
        }

        return $permissionMap;
    }

    /**
     * 判断用户是否拥有指定权限码。
     */
    public function hasPermission(?User $user, string $permission): bool
    {
        if (! in_array($permission, PositionPermissionRegistry::codes(), true)) {
            return false;
        }

        return in_array($permission, $this->permissionsForUser($user), true);
    }

    /**
     * 判断用户是否至少拥有一项指定权限。
     *
     * @param  list<string>  $permissions
     */
    public function hasAnyPermission(?User $user, array $permissions): bool
    {
        foreach ($permissions as $permission) {
            if ($this->hasPermission($user, $permission)) {
                return true;
            }
        }

        return false;
    }
}
