package io.gisbi.application.system.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import io.gisbi.application.system.domain.Role;
import io.gisbi.application.system.service.IRoleService;
import io.gisbi.application.system.service.IUserService;
import io.gisbi.config.ResponseResult;
import io.gisbi.utils.AuthUtils;
import io.micrometer.common.util.StringUtils;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 角色 前端控制器
 * </p>
 *
 * @author lilin
 * @since 2025-05-08
 */
@RestController
@RequestMapping("/role")
public class RoleController {

    @Resource
    private IRoleService roleService;

    @Resource
    private IUserService userService;

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

    /***********************************
     * 用途说明：更新角色信息
     * 参数说明
     * role    角色对象
     * 返回值说明:  是否修改成功
     ***********************************/
    @PostMapping("/updateRole")
    @ResponseBody
    public ResponseResult updateRole(@RequestBody Role role) {
        if (StrUtil.isBlank(role.getId())) {
            return ResponseResult.error("需要提交角色ID！");
        }
        //更新最近修改人
        role.setLastmodifier(AuthUtils.getUser().getUserId().toString());
        //更新最近修改时间
        role.setLastmodifydate(LocalDateTime.now());
        //根据id更新角色信息
        boolean ok = roleService.updateById(role);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }


    /***********************************
     * 用途说明：查询所有角色
     * 参数说明
     * rolename     角色名称
     * 返回值说明:  查询都有角色
     ***********************************/
    @PostMapping("/listRole")
    @ResponseBody
    public List<Role> listRole(String appId, String rolename) {
        return roleService.listRole(appId,rolename);
    }

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


    /***********************************
     * 用途说明：根据id删除角色
     * 参数说明
     * id        角色id
     * 返回值说明:  是否删除成功
     ***********************************/
    @PostMapping("/deleteRoleById")
    @ResponseBody
    public ResponseResult deleteRoleById(@RequestParam String id) {
        boolean result =  roleService.deleteById(id);
        if (!result) {
            return ResponseResult.error("删除角色失败，可能角色不存在");
        }
        return ResponseResult.success();
    }

    /***********************************
     * 用途说明：根据ID批量删除角色
     * 参数说明
     *ids        用户id集合
     * 返回值说明: 判断是否删除成功
     ************************************/
    @PostMapping("/deleteRoleByIds")
    @ResponseBody
    public ResponseResult deleteRoleByIds(String ids) {
        if (StringUtils.isBlank(ids)) {
            return ResponseResult.error("参数为空");
        }
        boolean ok = roleService.deleteRoleByIds(ids);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

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

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

    }


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

    /***********************************
     * 用途说明：删除角色用户
     * 参数说明
     * roleid      角色id
     * 返回值说明:  是否新增成功
     ***********************************/
    @PostMapping("/deleteRoleUser")
    @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();
        }
    }

}
