package org.xyzh.system.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.xyzh.api.system.service.DeptRoleService;
import org.xyzh.api.system.vo.PermissionVO;
import org.xyzh.api.system.vo.UserDeptRoleVO;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageRequest;
import org.xyzh.common.dto.sys.TbSysDeptDTO;
import org.xyzh.common.dto.sys.TbSysRoleDTO;

@RestController
@RequestMapping("/system/deptRole")
public class DeptRoleController {

    private static final Logger logger = LoggerFactory.getLogger(DeptRoleController.class);

    @Autowired
    private DeptRoleService deptRoleService;

    // ================= 部门角色相关接口 =================
    /**
     * @description    创建部门
     * @param    deptDTO    部门DTO
     * @return    ResultDomain<TbSysDeptDTO>    创建结果
     * @author    yslg
     * @since 2025-11-10
     */
    @PostMapping("/dept")
    @PreAuthorize("hasAuthority('system:dept:create')")
    public ResultDomain<TbSysDeptDTO> createDept(@RequestBody TbSysDeptDTO deptDTO) {
        return deptRoleService.insertDept(deptDTO);
    }


    /**
     * @description    更新部门
     * @param    deptDTO    部门DTO
     * @return    ResultDomain<TbSysDeptDTO>    更新结果
     * @author    yslg
     * @since 2025-11-10
     */
    @PutMapping("/dept")
    @PreAuthorize("hasAuthority('system:dept:edit')")
    public ResultDomain<TbSysDeptDTO> updateDept(@RequestBody TbSysDeptDTO deptDTO) {
        return deptRoleService.updateDept(deptDTO);
    }

    /**
     * @description    删除部门
     * @param    deptDTO    部门DTO
     * @return    ResultDomain<Boolean>    删除结果
     * @author    yslg
     * @since 2025-11-10
     */
    @DeleteMapping("/dept")
    @PreAuthorize("hasAuthority('system:dept:delete')")
    public ResultDomain<Boolean> deleteDept(@RequestBody TbSysDeptDTO deptDTO) {
        return deptRoleService.deleteDept(deptDTO);
    }

    /**
     * @description    根据条件查询部门分页列表
     * @param    PageRequest<UserDeptRoleVO>    pageRequest    分页请求
     * @return    ResultDomain<UserDeptRoleVO>    分页列表
     * @author    yslg
     * @since 2025-11-10
     */
    @GetMapping("/dept/page")
    @PreAuthorize("hasAuthority('system:dept:view')")
    public ResultDomain<UserDeptRoleVO> getDeptPage(@RequestBody PageRequest<UserDeptRoleVO> pageRequest) {
        return deptRoleService.getDeptPage(pageRequest);
    }

    /**
     * @description    根据条件查询部门列表
     * @param    filter    部门VO
     * @return    ResultDomain<UserDeptRoleVO>    部门列表
     * @author    yslg
     * @since 2025-11-10
     */
    @GetMapping("/dept/list")
    @PreAuthorize("hasAuthority('system:dept:view')")
    public ResultDomain<UserDeptRoleVO> getDeptList(@RequestBody UserDeptRoleVO filter) {
        return deptRoleService.getDeptList(filter);
    }

    // ================= 角色相关接口 =================
    /**
     * @description    创建角色
     * @param    roleDTO    角色DTO
     * @return    ResultDomain<TbSysRoleDTO>    创建结果
     * @author    yslg
     * @since 2025-11-10
     */
    @PostMapping("/role")
    @PreAuthorize("hasAuthority('system:role:create')")
    public ResultDomain<TbSysRoleDTO> createRole(@RequestBody TbSysRoleDTO roleDTO) {
        return deptRoleService.insertRole(roleDTO);
    }

    /**
     * @description    更新角色
     * @param    roleDTO    角色DTO
     * @return    ResultDomain<TbSysRoleDTO>    更新结果
     * @author    yslg
     * @since 2025-11-10
     */
    @PutMapping("/role")
    @PreAuthorize("hasAuthority('system:role:edit')")
    public ResultDomain<TbSysRoleDTO> updateRole(@RequestBody TbSysRoleDTO roleDTO) {
        return deptRoleService.updateRole(roleDTO);
    }

    /**
     * @description    删除角色
     * @param    roleDTO    角色DTO
     * @return    ResultDomain<Boolean>    删除结果
     * @author    yslg
     * @since 2025-11-10
     */
    @DeleteMapping("/role")
    @PreAuthorize("hasAuthority('system:role:delete')")
    public ResultDomain<Boolean> deleteRole(@RequestBody TbSysRoleDTO roleDTO) {
        return deptRoleService.deleteRole(roleDTO);
    }

    /**
     * @description    根据条件查询角色分页列表
     * @param    PageRequest<UserDeptRoleVO>    pageRequest    分页请求
     * @return    ResultDomain<UserDeptRoleVO>    分页列表
     * @author    yslg
     * @since 2025-11-10
     */
    @GetMapping("/role/page")
    @PreAuthorize("hasAuthority('system:role:view')")
    public ResultDomain<UserDeptRoleVO> getRolePage(@RequestBody PageRequest<UserDeptRoleVO> pageRequest) {
        return deptRoleService.getRolePage(pageRequest);
    }

    /**
     * @description    根据条件查询角色列表
     * @param    filter    角色VO
     * @return    ResultDomain<UserDeptRoleVO>    角色列表
     * @author    yslg
     * @since 2025-11-10
     */
    @GetMapping("/role/list")
    @PreAuthorize("hasAuthority('system:role:view')")
    public ResultDomain<UserDeptRoleVO> getRoleList(@RequestBody UserDeptRoleVO filter) {
        return deptRoleService.getRoleList(filter);
    }

    // ================== 角色权限相关接口 ==================
    /**
     * @description    给一个角色设置权限
     * @param    
     * @return    返回值描述
     * @author    yslg
     * @since 2025-11-11
     */
    @PostMapping("/rolePermission/bind")
    @PreAuthorize("hasAuthority('system:permission:manage')")
    public ResultDomain<PermissionVO> getRolePermission(@RequestBody PermissionVO permissionVO) {
        return deptRoleService.setRolePermission(permissionVO);
    }

    /**
     * @description    获取一个角色的权限列表
     * @param    
     * @return    返回值描述
     * @author    yslg
     * @since 2025-11-11
     */
    @PostMapping("/rolePermission/list")
    @PreAuthorize("hasAuthority('system:permission:view')")
    public ResultDomain<PermissionVO> getRolePermissionList(@RequestBody PermissionVO permissionVO) {
        return deptRoleService.getRolePermissionList(permissionVO);
    }
}
