package org.xyzh.system.controller;

import java.util.List;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.xyzh.api.system.dept.DepartmentService;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.dept.TbSysDept;
import org.xyzh.common.dto.dept.TbSysDeptRole;
import org.xyzh.common.dto.role.TbSysRole;
import org.xyzh.common.vo.DeptRoleVO;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
@RequestMapping("/depts")
public class DeptController {
    private static final Logger logger = LoggerFactory.getLogger(DeptController.class);
    @Autowired
    private DepartmentService deptService;

    /**
     * @description    查询所有部门
     * @return    ResultDomain<TbSysDept> 部门列表
     * @author    yslg
     * @since 2025-10-06
     */
    @PostMapping("/all")
    public ResultDomain<TbSysDept> getAllDepts() {
        return deptService.getAllDepartments();
    }

    /**
     * @description    查询部门列表
     * @param    filter 过滤条件
     * @return    ResultDomain<TbSysDept> 部门列表
     * @author    yslg
     * @since 2025-10-06
     */
    @PostMapping("/list")
    public ResultDomain<TbSysDept> getDeptList(@RequestBody TbSysDept filter) {
        return deptService.getDeptList(filter);
    }

    /**
     * @description    查询部门
     * @param    deptId 部门ID
     * @return    ResultDomain<TbSysDept> 部门信息
     * @author    yslg
     * @since 2025-10-06
     */
    @PostMapping("/id")
    public ResultDomain<TbSysDept> getDeptById(@RequestBody TbSysDept dept) {
        return deptService.getDepartmentById(dept.getDeptID());
    }

    /**
     * @description    创建部门
     * @param    dept 部门信息
     * @return    ResultDomain<TbSysDept> 部门信息
     * @author    yslg
     * @since 2025-10-06
     */
    @PostMapping("/dept")
    public ResultDomain<TbSysDept> createDept(@RequestBody TbSysDept dept) {
        return deptService.createDepartment(dept);
    }

    /**
     * @description    更新部门
     * @param    dept 部门信息
     * @return    ResultDomain<TbSysDept> 部门信息
     * @author    yslg
     * @since 2025-10-06
     */
    @PutMapping("/dept")
    public ResultDomain<TbSysDept> updateDept(@RequestBody TbSysDept dept) {
        return deptService.updateDepartment(dept);
    }

    /**
     * @description    删除部门
     * @param    dept 部门信息
     * @return    ResultDomain<TbSysDept> 部门信息
     * @author    yslg
     * @since 2025-10-06
     */
    @DeleteMapping("/dept")
    public ResultDomain<TbSysDept> deleteDept(@RequestBody TbSysDept dept) {
        return deptService.deleteDepartment(dept.getDeptID());
    }

    /**
     * @description    查询部门绑定角色
     * @param    dept 部门信息
     * @return    ResultDomain<TbSysRole> 角色信息
     * @author    yslg
     * @since 2025-10-06
     */
    @PostMapping("/role")
    public ResultDomain<TbSysRole> getDeptByRole(@RequestBody TbSysDept dept) {
        return deptService.getDeptByRole(dept.getDeptID());
    }

    /**
     * @description    查询部门绑定角色
     * @param    dept 部门信息
     * @return    ResultDomain<TbSysRole> 角色信息
     * @author    yslg
     * @since 2025-10-06
     */
    @PostMapping("/role/list")
    public ResultDomain<TbSysDeptRole> getDeptByRoleList() {
        return deptService.getDeptByRoleList();
    }

    /**
     * @description    绑定部门角色
     * @param    dept 部门信息
     * @return    ResultDomain<TbSysDeptRole> 部门角色信息
     * @author    yslg
     * @since 2025-10-06
     */
    @PostMapping("/bind/role")
    public ResultDomain<TbSysDeptRole> bindDeptRole(@RequestBody DeptRoleVO deptRole) {
        List<String> deptIDs = deptRole.getDepts().stream().map(TbSysDept::getDeptID).collect(Collectors.toList());
        List<String> roleIDs = deptRole.getRoles().stream().map(TbSysRole::getRoleID).collect(Collectors.toList());
        return deptService.bindDeptRole(deptIDs, roleIDs);
    }

    /**
     * @description    解绑部门角色
     * @param    dept 部门信息
     * @return    ResultDomain<TbSysDeptRole> 部门角色信息
     * @author    yslg
     * @since 2025-10-06
     */
    @PostMapping("/unbind/role")
    public ResultDomain<TbSysDeptRole> unbindDeptRole(@RequestBody DeptRoleVO deptRole) {
        List<String> deptIDs = deptRole.getDepts().stream().map(TbSysDept::getDeptID).collect(Collectors.toList());
        List<String> roleIDs = deptRole.getRoles().stream().map(TbSysRole::getRoleID).collect(Collectors.toList());
        return deptService.unbindDeptRole(deptIDs, roleIDs);
    }
}
