package com.yfd.platform.system.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.yfd.platform.annotation.Log;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.system.domain.LoginUser;
import com.yfd.platform.system.domain.SysRole;
import com.yfd.platform.system.domain.SysUser;
import com.yfd.platform.system.service.ISysRoleService;
import com.yfd.platform.system.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 系统角色 前端控制器
 * </p>
 *
 * @author zhengsl
 * @since 2021-12-15
 */
@RestController
@RequestMapping("/system/role")
@Api(value = "SysRoleController", tags = "系统角色")
public class SysRoleController {

    @Resource
    private ISysRoleService roleService;

    @Resource
    private IUserService userService;

    /***********************************
     * 用途说明：查询所有角色
     * 参数说明
     * roleName     角色名称
     * 返回值说明:  查询都有角色
     ***********************************/
    @PostMapping("/list")
    @ApiOperation("查询所有角色")
    @ResponseBody
    public List<SysRole> list(String rolename) {

        UsernamePasswordAuthenticationToken authentication =
                (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
        LoginUser loginuser = (LoginUser) authentication.getPrincipal();
        SysUser user = loginuser.getUser();
        QueryWrapper<SysRole> queryWrapper = new QueryWrapper<>();

        if(!"admin".equals(user.getUsername())){    // 根据用户id获取角色id
          List<String> roleIds  =  roleService.getRoleUsers(user.getId());
          queryWrapper.in("id", roleIds);
        }

        if (StrUtil.isNotEmpty(rolename)) {
            //根据角色名称模糊查询
            queryWrapper.like("rolename", rolename);
        }
        //根据角色级别，角色编号 正序排序
        queryWrapper.ne("level", "1").orderByAsc("level", "lastmodifydate");




        return roleService.list(queryWrapper);
    }

    /***********************************
     * 用途说明：根据Id获取当个角色
     * 参数说明
     * id         角色表id
     * 返回值说明:  根据id查询到角色详情
     ***********************************/
    @PostMapping("/getOneById")
    @ApiOperation("根据Id获取当个角色")
    @ResponseBody
    public ResponseResult getOneById(String id) {
        SysRole sysRole = roleService.getById(id);
        return ResponseResult.successData(sysRole);
    }

    /***********************************
     * 用途说明：新增角色
     * 参数说明
     * sysRole         新增角色信息
     * 返回值说明:  是否新增成功
     ***********************************/
    @Log(module = "系统角色", value = "新增角色")
    @PostMapping("/addRole")
    @ApiOperation("新增角色")
    @ResponseBody
    public ResponseResult addRole(@RequestBody SysRole sysRole) {
        boolean isOk = roleService.addRole(sysRole);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：分配操作权限
     * 参数说明
     * id          角色id
     * optscope    分配的权限
     * 返回值说明:  是否新增成功
     ***********************************/
    @Log(module = "系统角色", value = "分配操作权限")
    @PostMapping("/setOptScope")
    @ApiOperation("分配操作权限")
    @ResponseBody
    public ResponseResult setOptScope(@RequestParam String id,
                                      @RequestParam String optscope) {
        UpdateWrapper<SysRole> updateWrapper = new UpdateWrapper<>();
        //根据id 更新权限，最近修改人，最近修改时间
        updateWrapper.eq("id", id).set("optscope", optscope).set(
                "lastmodifier", userService.getUsername()).set(
                "lastmodifydate", LocalDateTime.now());
        boolean ok = roleService.update(updateWrapper);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：角色菜单权限
     * 参数说明
     * id          角色id
     * menuIds    权限id字符串
     * 返回值说明:  是否分配成功
     ***********************************/
    @Log(module = "系统角色", value = "角色菜单权限")
    @PostMapping("/setMenuById")
    @ApiOperation("角色菜单权限")
    @ResponseBody
    public ResponseResult setMenuById(String id, String menuIds) {
        if (StrUtil.isBlank(id)) {
            return ResponseResult.error("参数为空");
        }
        if (StrUtil.isBlank(menuIds)) {
            return ResponseResult.success();
        }
        boolean ok = roleService.setMenuById(id, menuIds);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }

    }

    /***********************************
     * 用途说明：设置组织范围
     * 参数说明
     * id          角色id
     * orgscope      组织范围
     * 返回值说明:  是否新增成功
     ***********************************/
    @Log(module = "系统角色", value = "设置组织范围")
    @PostMapping("/setOrgscope")
    @ApiOperation("设置组织范围")
    @ResponseBody
    public ResponseResult setOrgscope(@RequestParam String id,
                                      @RequestParam String orgscope) {
        UpdateWrapper<SysRole> updateWrapper = new UpdateWrapper<>();
        //根据id 更新组织范围，最近修改人，最近修改时间
        updateWrapper.eq("id", id).set("orgscope", orgscope).set(
                "lastmodifier", userService.getUsername()).set(
                "lastmodifydate", LocalDateTime.now());
        boolean ok = roleService.update(updateWrapper);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：设置业务范围
     * 参数说明
     * id           角色id
     * busscope     业务范围
     * 返回值说明:  是否新增成功
     ***********************************/
    @Log(module = "系统角色", value = "设置业务范围")
    @PostMapping("/setBusscope")
    @ApiOperation("设置业务范围")
    @ResponseBody
    public ResponseResult setBusscope(@RequestParam String id,
                                      @RequestParam String busscope) {
        UpdateWrapper<SysRole> updateWrapper = new UpdateWrapper<>();
        //根据id 更新业务范围，最近修改人，最近修改时间
        updateWrapper.eq("id", id).set("busscope", busscope).set(
                "lastmodifier", userService.getUsername()).set(
                "lastmodifydate", LocalDateTime.now());
        boolean ok = roleService.update(updateWrapper);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：角色添加用户
     * 参数说明
     * roleid       角色id
     * userids      用户id组
     * 返回值说明:  是否新增成功
     ***********************************/
    @Log(module = "系统角色", value = "角色添加用户")
    @PostMapping("/setRoleUsers")
    @ApiOperation("角色添加用户")
    @ResponseBody
    public ResponseResult setRoleUsers(String roleid, String userids) {
        boolean isOk = true;
        String[] temp = userids.split(",");
        for (String userid : temp) {
            isOk = isOk && userService.addUserRoles(roleid, userid);
        }
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：删除角色用户
     * 参数说明
     * roleid      角色id
     * 返回值说明:  是否新增成功
     ***********************************/
    @PostMapping("/deleteRoleUser")
    @ApiOperation("删除角色用户")
    @ResponseBody
    public ResponseResult deleteRoleUsers(@RequestParam String roleid,
                                          @RequestParam String userids) {
        //根据角色id、用户id删除
        boolean ok = roleService.deleteRoleUsers(roleid, userids);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：设置角色是否有效
     * 参数说明
     * id       角色id
     *isvaild   是否有效（1 是 0 否 ）
     * 返回值说明:  是否新增成功
     ***********************************/
    @PostMapping("/setIsvaild")
    @ApiOperation("设置角色是否有效")
    @ResponseBody
    public ResponseResult setIsvaild(String id, String isvaild) {
        UpdateWrapper<SysRole> updateWrapper = new UpdateWrapper<>();
        //根据id 更新业务范围，最近修改人，最近修改时间
        updateWrapper.eq("id", id).set("isvaild", isvaild).set("lastmodifier"
                , userService.getUsername()).set("lastmodifydate",
                LocalDateTime.now());
        boolean ok = roleService.update(updateWrapper);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：更新角色信息
     * 参数说明
     *sysRole    角色对象
     * 返回值说明:  是否修改成功
     ***********************************/
    @PostMapping("/updateById")
    @ApiOperation("更新角色信息")
    @ResponseBody
    public ResponseResult updateById(@RequestBody SysRole sysRole) {
        //更新最近修改人
        sysRole.setLastmodifier(userService.getUsername());
        //更新最近修改时间
        sysRole.setLastmodifydate(new Timestamp(System.currentTimeMillis()));
        //根据id更新角色信息
        boolean ok = roleService.updateById(sysRole);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：根据id删除角色
     * 参数说明
     *id        角色id
     * 返回值说明:  是否删除成功
     ***********************************/
    @PostMapping("/deleteById")
    @ApiOperation("根据id删除角色")
    @ResponseBody
    public ResponseResult deleteById(@RequestParam String id) {
        roleService.deleteById(id);
        return ResponseResult.success();
    }

    /***********************************
     * 用途说明：查询已分配的用户
     * 参数说明
     *orgid         所属组织
     *username      用户名称
     *status        状态
     *level         角色级别
     * rolename     角色名称
     * isvaild      角色是否有效
     * 返回值说明:  系统用户角色数据集合
     ***********************************/
    @PostMapping("/listRoleUsers")
    @ApiOperation("查询已分配的用户")
    @ResponseBody
    public List<Map> listRoleUsers(String orgid, String username,
                                   String status, String level,
                                   String rolename, String isvaild) {
        return roleService.listRoleUsers(orgid, username, status, level,
                rolename, isvaild);
    }

}
