<?php
/**
 * HuSNS - 管理员角色模型
 * 
 * @author  HYR
 * @QQ      281900864
 * @website https://huyourui.com
 * @license MIT
 */
class AdminRoleModel extends Model
{
    protected $table = 'admin_roles';
    
    /**
     * 获取所有可用权限列表
     * @return array
     */
    public function getAvailablePermissions()
    {
        return [
            'system' => [
                'name' => '系统管理',
                'permissions' => [
                    'admin.settings' => '系统设置',
                    'admin.backup' => '数据备份',
                    'admin.upgrade' => '系统升级',
                ]
            ],
            'content' => [
                'name' => '内容管理',
                'permissions' => [
                    'admin.posts' => '帖子管理',
                    'admin.comments' => '评论管理',
                    'admin.topics' => '话题管理',
                ]
            ],
            'user' => [
                'name' => '用户管理',
                'permissions' => [
                    'admin.users' => '用户列表',
                    'admin.user.edit' => '编辑用户',
                    'admin.user.delete' => '删除用户',
                ]
            ],
            'circle' => [
                'name' => '圈子管理',
                'permissions' => [
                    'admin.circles' => '圈子列表',
                    'admin.circle.edit' => '编辑圈子',
                    'admin.circle.delete' => '删除圈子',
                    'admin.circle.members' => '成员管理',
                ]
            ],
            'report' => [
                'name' => '举报管理',
                'permissions' => [
                    'admin.reports' => '举报列表',
                    'admin.report.handle' => '处理举报',
                ]
            ],
            'filter' => [
                'name' => '敏感词管理',
                'permissions' => [
                    'admin.filter' => '敏感词列表',
                    'admin.filter.edit' => '编辑敏感词',
                    'admin.filter.import' => '导入敏感词',
                ]
            ],
            'stats' => [
                'name' => '数据统计',
                'permissions' => [
                    'admin.statistics' => '数据统计',
                ]
            ],
            'admin' => [
                'name' => '管理员管理',
                'permissions' => [
                    'admin.roles' => '角色管理',
                    'admin.roles.edit' => '编辑角色',
                    'admin.admin_users' => '管理员列表',
                ]
            ],
        ];
    }
    
    /**
     * 获取所有角色
     * @return array
     */
    public function getAllRoles()
    {
        return $this->db->fetchAll("SELECT * FROM __PREFIX__admin_roles WHERE status = 1 ORDER BY id ASC");
    }
    
    /**
     * 获取角色详情
     * @param int $id 角色ID
     * @return array|null
     */
    public function getRole($id)
    {
        $role = $this->find($id);
        
        if ($role) {
            $role['permissions'] = !empty($role['permissions']) ? json_decode($role['permissions'], true) : [];
        }
        
        return $role;
    }
    
    /**
     * 创建角色
     * @param array $data 角色数据
     * @return int|bool
     */
    public function createRole($data)
    {
        return $this->insert([
            'name' => $data['name'],
            'description' => $data['description'] ?? '',
            'permissions' => json_encode($data['permissions'] ?? []),
            'status' => 1,
            'created_at' => time(),
            'updated_at' => time()
        ]);
    }
    
    /**
     * 更新角色
     * @param int $id 角色ID
     * @param array $data 角色数据
     * @return bool
     */
    public function updateRole($id, $data)
    {
        return $this->update($id, [
            'name' => $data['name'],
            'description' => $data['description'] ?? '',
            'permissions' => json_encode($data['permissions'] ?? []),
            'updated_at' => time()
        ]);
    }
    
    /**
     * 删除角色
     * @param int $id 角色ID
     * @return bool
     */
    public function deleteRole($id)
    {
        // 不能删除超级管理员角色
        if ($id == 1) {
            return false;
        }
        
        // 删除关联关系
        $this->db->delete('admin_role_users', 'role_id = ?', [$id]);
        
        return $this->delete($id);
    }
    
    /**
     * 获取用户的角色列表
     * @param int $userId 用户ID
     * @return array
     */
    public function getUserRoles($userId)
    {
        $sql = "SELECT r.* FROM __PREFIX__admin_role_users ru 
                INNER JOIN __PREFIX__admin_roles r ON ru.role_id = r.id 
                WHERE ru.user_id = ? AND r.status = 1";
        
        return $this->db->fetchAll($sql, [$userId]);
    }
    
    /**
     * 获取用户的权限列表
     * @param int $userId 用户ID
     * @return array
     */
    public function getUserPermissions($userId)
    {
        $roles = $this->getUserRoles($userId);
        $permissions = [];
        
        foreach ($roles as $role) {
            $rolePermissions = !empty($role['permissions']) ? json_decode($role['permissions'], true) : [];
            $permissions = array_merge($permissions, $rolePermissions);
        }
        
        return array_unique($permissions);
    }
    
    /**
     * 检查用户是否有某个权限
     * @param int $userId 用户ID
     * @param string $permission 权限标识
     * @return bool
     */
    public function hasPermission($userId, $permission)
    {
        // 超级管理员拥有所有权限
        $userModel = new UserModel();
        $user = $userModel->find($userId);
        
        if ($user && $user['is_admin'] && $user['id'] == 1) {
            return true;
        }
        
        $permissions = $this->getUserPermissions($userId);
        
        // 检查精确匹配
        if (in_array($permission, $permissions)) {
            return true;
        }
        
        // 检查父级权限（如 admin.*）
        foreach ($permissions as $p) {
            if (strpos($permission, $p) === 0) {
                return true;
            }
        }
        
        return false;
    }
    
    /**
     * 为用户分配角色
     * @param int $userId 用户ID
     * @param int $roleId 角色ID
     * @return bool
     */
    public function assignRole($userId, $roleId)
    {
        return $this->db->insert('admin_role_users', [
            'role_id' => $roleId,
            'user_id' => $userId,
            'created_at' => time()
        ]);
    }
    
    /**
     * 取消用户的角色
     * @param int $userId 用户ID
     * @param int $roleId 角色ID
     * @return bool
     */
    public function revokeRole($userId, $roleId)
    {
        return $this->db->delete('admin_role_users', 'user_id = ? AND role_id = ?', [$userId, $roleId]);
    }
    
    /**
     * 获取角色的用户列表
     * @param int $roleId 角色ID
     * @return array
     */
    public function getRoleUsers($roleId)
    {
        $sql = "SELECT u.* FROM __PREFIX__admin_role_users ru 
                INNER JOIN __PREFIX__users u ON ru.user_id = u.id 
                WHERE ru.role_id = ? AND u.status = 1";
        
        return $this->db->fetchAll($sql, [$roleId]);
    }
}
?>