package com.czg.controller.admin;

import com.czg.account.dto.PageDTO;
import com.czg.account.dto.role.*;
import com.czg.account.entity.SysRole;
import com.czg.account.service.SysRoleService;
import com.czg.annotation.SaAdminCheckPermission;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.mybatisflex.core.paginate.Page;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 *
 * 角色管理
 *
 * @author Administrator
 */
@RestController
@RequestMapping("/admin/role")
public class RoleController {

    @Resource
    private SysRoleService roleService;

    /**
     * 获取角色列表
     * 权限标识: role:list
     *
     * @param pageDTO 分页信息
     * @return 分页数据
     */
    @SaAdminCheckPermission(parentName = "角色管理接口", value = "role:list", name = "角色列表")
    @GetMapping("/list")
    public CzgResult<Page<SysRole>> getList(PageDTO pageDTO, String key, String startTime, String endTime) {
        return CzgResult.success(roleService.getList(StpKit.USER.getShopId(), pageDTO, key, startTime, endTime));
    }

    /**
     * 获取角色对应的菜单
     * 权限标识: role:menu
     *
     * @param id   角色id
     * @param type 0管理端 1收银机
     * @return 分页数据
     */
    @SaAdminCheckPermission(parentName = "角色管理接口", value = "role:menu", name = "角色菜单")
    @GetMapping("/menu")
    public CzgResult<List<Long>> getRoleMenu(@RequestParam Integer id, @RequestParam Integer type) {
        return CzgResult.success(roleService.getRoleMenu(StpKit.USER.getShopId(), id, type));
    }

    /**
     * 新增角色
     * 权限标识: role:add
     *
     * @param roleAddDTO 角色信息
     * @return 是否成功
     */
    @SaAdminCheckPermission(parentName = "角色管理接口", value = "role:add", name = "角色添加")
    @PostMapping
    public CzgResult<Boolean> add(@RequestBody @Validated RoleAddDTO roleAddDTO) {
        return CzgResult.success(roleService.add(roleAddDTO));
    }

    /**
     * 权限编辑
     *
     * @param rolePermissionDTO 权限编辑
     * @return 是否成功
     */
    @PutMapping("/permission")
    public CzgResult<Boolean> editPermission(@RequestBody @Validated RolePermissionDTO rolePermissionDTO) {
        return CzgResult.success(roleService.editPermission(StpKit.USER.getShopId(), rolePermissionDTO));
    }

    /**
     * 编辑角色
     * 权限标识: role:edit
     *
     * @param roleEditDTO 角色信息
     * @return 是否成功
     */
    @SaAdminCheckPermission(parentName = "角色管理接口", value = "role:edit", name = "角色编辑")
    @PutMapping
    public CzgResult<Boolean> edit(@RequestBody @Validated RoleEditDTO roleEditDTO) {
        return CzgResult.success(roleService.edit(roleEditDTO));
    }

    /**
     * 删除角色
     * 权限标识: role:edit
     *
     * @param roleRemoveDTO 角色信息
     * @return 是否成功
     */
    @SaAdminCheckPermission(parentName = "角色管理接口", value = "role:remove", name = "角色删除")
    @DeleteMapping
    public CzgResult<Boolean> remove(@RequestBody @Validated RoleRemoveDTO roleRemoveDTO) {
        if (roleRemoveDTO.id() == 1L || roleRemoveDTO.id() == 2L || roleRemoveDTO.id() == 3L) {
            return CzgResult.failure("默认角色不可删除");
        }
        return CzgResult.success(roleService.removeById(roleRemoveDTO.id()));
    }

    /**
     * 根据模板保存角色
     */
    @PostMapping("/saveByTemplate")
    public CzgResult<Boolean> saveByTemplate(@Validated @RequestBody RoleSaveTemplateDTO dto) {
        return CzgResult.success(roleService.saveByTemplate(StpKit.USER.getShopId(), dto));
    }

}
