package com.yfd.platform.system.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.annotation.Log;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.datasource.DataSource;
import com.yfd.platform.system.domain.SysUser;
import com.yfd.platform.system.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.Map;

/**
 * <p>
 * 用户信息 前端控制器
 * </p>
 *
 * @author zhengsl
 * @since 2022-09-20
 */
@RestController
@RequestMapping("/system/user")
@Api(tags = "系统用户")
public class UserController {

    @Resource
    private IUserService userService;

    @Log(module = "系统用户", value = "新增系统用户")
    @PostMapping("/addUser")
    @ApiOperation("新增系统用户")
    @ResponseBody
    public ResponseResult addUser(@RequestBody SysUser user, String roleids) {
        String institutionId = userService.getUserInfo().getInstitutionId();
        if (StrUtil.isNotEmpty(institutionId)) {
            user.setInstitutionId(institutionId);
        }
        Map reslut = userService.addUser(user, roleids);
        return ResponseResult.successData(reslut);
    }

    @Log(module = "系统用户", value = "修改用户信息")
    @PostMapping("/updateUser")
    @ApiOperation("修改用户信息")
    @ResponseBody
    public ResponseResult updateUser(@RequestBody SysUser user,
                                     String roleids) {
        if (StrUtil.isEmpty(user.getId())) {
            return ResponseResult.error("没有用户ID");
        }
        //填写 当前用户名称
        user.setLastmodifier(userService.getUsername());
        //填写 当前日期
        user.setLastmodifydate(new Timestamp(System.currentTimeMillis()));
        Map reslut = userService.updateById(user, roleids);
        return ResponseResult.successData(reslut);
    }

    @GetMapping("/queryUsers")
    @ApiOperation("查询用户信息")
    @ResponseBody
    public ResponseResult queryUsers(String orgid,
                                     String nickname, Page<SysUser> page) {

        Page<Map<String, Object>> mapPage = userService.queryUsers(orgid,
                nickname, page);
        return ResponseResult.successData(mapPage);
    }

    /***********************************
     * 用途说明：用户分配角色
     * 参数说明
     *idMap     用户id与角色id
     * 返回值说明: 判断是否添加成功
     ************************************/
    @Log(module = "系统用户", value = "用户分配角色")
    @PostMapping("/setUserRoles")
    @ApiOperation("用户分配角色")
    @ResponseBody
    public ResponseResult setUserRoles(String roleid, String userids) {
        boolean ok = userService.setUserRoles(roleid, userids);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：根据id删除用户
     * 参数说明
     *id         用户id
     * 返回值说明: 判断是否删除成功
     ************************************/
    @Log(module = "系统用户", value = "根据ID删除用户")
    @PostMapping("/deleteById")
    @ApiOperation("根据ID删除用户")
    @ResponseBody
    public ResponseResult deleteById(String id) {
        userService.deleteById(id);
        return ResponseResult.success();
    }

    /***********************************
     * 用途说明：根据ID批量删除用户
     * 参数说明
     *ids        用户id集合
     * 返回值说明: 判断是否删除成功
     ************************************/
    @Log(module = "系统用户", value = "根据ID批量删除用户")
    @PostMapping("/deleteUserByIds")
    @ApiOperation("根据ID批量删除用户")
    @ResponseBody
    public ResponseResult deleteUserByIds(String id) {
        if (StrUtil.isBlank(id)) {
            return ResponseResult.error("参数为空");
        }
        boolean ok = userService.deleteUserByIds(id);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：重置用户密码(管理员)
     * 参数说明
     *id        重置密码的 用户id
     * 返回值说明: 判断是否重置成功
     ************************************/
    @Log(module = "系统用户", value = "重置用户密码")
    @PostMapping("/resetPassword")
    @ApiOperation("重置用户密码")
    @ResponseBody
    @DataSource
    public ResponseResult resetPassword(String id) throws Exception {
        if (StrUtil.isBlank(id)) {
            ResponseResult.error("参数为空");
        }
        boolean ok = userService.resetPassword(id);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：设置账号状态(管理员)
     * 参数说明
     *id        用户id
     * status   设置状态
     * 返回值说明: 判断是否设置成功
     ************************************/
    @Log(module = "系统用户", value = "设置账号状态")
    @PostMapping("/setStatus")
    @ApiOperation("设置账号状态")
    @ResponseBody
    public ResponseResult setStatus(@RequestParam String id,
                                    @RequestParam String status) {
        boolean ok = userService.setStatus(id, status);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：修改头像(管理员)
     * 参数说明
     * multipartFile   文件对象
     * status   设置状态
     * 返回值说明: 文件名
     ************************************/
    @ApiOperation("修改头像")
    @PostMapping(value = "/updateAvatar")
    public ResponseResult updateAvatar(String id, MultipartFile multipartFile) {
        if (multipartFile == null) {
            ResponseResult.error("参数为空");
        }
        boolean ok = userService.uploadAvatar(id, multipartFile);
        return ResponseResult.success();
    }

    @GetMapping("/queryUserRole")
    @ApiOperation("查询用户权限信息")
    @ResponseBody
    public ResponseResult queryUserRole(String userId) {
        Map<String, Object> map = userService.queryUserRole(userId);
        return ResponseResult.successData(map);
    }
}
