<?php
declare(strict_types=1);

/**
 * 角色管理
 * 页面: admin/role/index
 * 数据接口: admin/role/grid (查) / role/save (增改) / role/remove (删)
 * 角色-权限分配: role/grantsOf / role/grant / role/revoke
 */
class roleAction extends Action
{
    use GridActions;

    protected function gridModel(): Model
    {
        return new Role();
    }

    public function index()
    {
        View::set([
            'pageTitle' => lg('角色'),
            'sites'     => (new Site())->listAll(),
        ]);
        View::put();
    }

    /**
     * 某个角色当前的所有权限绑定，请求体: { roleId }
     */
    public function grantsOf()
    {
        $roleId = (int) ($this->request['roleId'] ?? 0);
        $rows = (new Role())->permissionsOf($roleId);

        foreach ($rows as &$row) {
            $row['sys_role_permission_types'] = json_decode($row['sys_role_permission_types'], true) ?: [];
            $row['sys_role_permission_extra_values'] = $row['sys_role_permission_extra_values']
                ? (json_decode($row['sys_role_permission_extra_values'], true) ?: [])
                : [];
        }

        $this->success($rows);
    }

    /**
     * 给角色授予/更新一个权限码的配置，请求体: { roleId, code, types: [], dataScope, extraValues: {} }
     */
    public function grant()
    {
        $roleId = (int) ($this->request['roleId'] ?? 0);
        $code = (string) ($this->request['code'] ?? '');
        $types = array_values((array) ($this->request['types'] ?? []));
        $dataScope = (int) ($this->request['dataScope'] ?? 1);
        $extraValues = $this->request['extraValues'] ?? null;

        if ($roleId <= 0 || $code === '') {
            $this->error(1, lg('参数不完整'));
        }

        (new Role())->savePermission($roleId, $code, $types, $dataScope, is_array($extraValues) ? $extraValues : null);
        $this->success();
    }

    /**
     * 撤销角色对某个权限码的授予，请求体: { roleId, code }
     */
    public function revoke()
    {
        $roleId = (int) ($this->request['roleId'] ?? 0);
        $code = (string) ($this->request['code'] ?? '');

        (new Role())->removePermission($roleId, $code);
        $this->success();
    }
}
