package com.example.his.api.mis.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.MD5;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel;
import com.example.his.api.common.result.R;
import com.example.his.api.req.MisUser.UserDeleteReq;
import com.example.his.api.req.MisUser.UserEditReq;
import com.example.his.api.req.MisUser.UserExportExcel;
import com.example.his.api.req.MisUser.UserSearchReq;
import com.example.his.api.mis.service.UserService;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RestController
@RequestMapping("/mis/admin")
public class UserController {
    @Resource
    private UserService userService;

    // 用户管理-分页查询
    @PostMapping("/user/searchUserByPage")
    @SaCheckPermission(value = {"ORGANIZE:USER","ORGANIZE:USER:SELECT"}, mode = SaMode.OR)
    public R searchUserByPage(@Valid @RequestBody UserSearchReq userSearchReq) {
        Map param = BeanUtil.beanToMap(userSearchReq);
        PageInfo<HashMap> pageInfo = userService.searchUserByPage(param);
        return R.success(pageInfo);
    }


    // 用户管理-编辑
    @PostMapping("/user/editUser")
    @SaCheckPermission(value = {"ORGANIZE:USER","ORGANIZE:USER:UPDATE","ORGANIZE:USER:INSERT"}, mode = SaMode.OR)
    public R editUser(@Valid @RequestBody UserEditReq userEditReq) {
        Map param = BeanUtil.beanToMap(userEditReq);
        param.replace("role",JSONUtil.parseArray(userEditReq.getRole()).toString());
        if(ObjectUtil.isEmpty(userEditReq.getId())) {
            String username = MapUtil.getStr(param, "username");
            MD5 md5 = MD5.create();
            String password = MapUtil.getStr(param, "password");
            String temp = md5.digestHex(username);
            String tempStart = StrUtil.subWithLength(temp, 0, 6);
            String tempEnd = StrUtil.subSuf(temp, temp.length() - 3);
            password = md5.digestHex(tempStart + password + tempEnd).toUpperCase();
            param.replace("password", password);
            userService.insertUser(param);
        }else {
            userService.updateUser(param);
        }
        return R.success(param);
    }

    // 用户管理-删除
    @GetMapping("/user/deleteUser")
    @SaCheckPermission(value = {"ORGANIZE:USER","ORGANIZE:USER:DELETE"}, mode = SaMode.OR)
    public R deleteUser(@RequestParam(value = "id") Integer id) {
        int rows = userService.deleteUser(id);
        return R.success(rows);
    }

    // 用户管理-批量删除
    @PostMapping("/user/deleteBatchUser")
    @SaCheckPermission(value = {"ORGANIZE:USER","ORGANIZE:USER:DELETE"}, mode = SaMode.OR)
    public R deleteBatchUser(@Valid @RequestBody UserDeleteReq userDeleteReq) {
        Map param = BeanUtil.beanToMap(userDeleteReq);
        int rows = userService.deleteBatchUser(param);
        return R.success(rows);
    }

    // 测试用户导出
    @GetMapping("/user/exportUser")
    @SaCheckPermission(value = {"ORGANIZE:USER","ORGANIZE:USER:EXPORT"}, mode = SaMode.OR)
    public R searchAll(@RequestParam(value = "fileName") String fileName, HttpServletResponse response) throws IOException {
        List<UserExportExcel> list = userService.searchUserAll();
        // 设置文本内省
        response.setContentType("application/vnd.ms-excel");
        // 设置字符编码
        response.setCharacterEncoding("utf-8");
        // 设置响应头
        String resultFileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename=" + resultFileName + ";");
        EasyExcel.write(response.getOutputStream(), UserExportExcel.class).sheet(fileName).doWrite(list);
        return R.success();
    }
}
