/**
 * 部门控制器
 * @visduo
 */
@Mapping("/dept")
@Controller
public class DeptController {

    @Db
    EasyEntityQuery easyEntityQuery;

    /**
     * 获取部门列表
     * @visduo
     *
     * @param name 查询条件-部门名称
     * @param pageIndex 查询条件-页码
     * @param pageSize 查询条件-页大小
     * @return 部门列表分页结果
     */
    @Get
    @Mapping("/list")
    public ResponseResult list(@Param(required = false) String name,
                               @Param(required = false, defaultValue = "1") Integer pageIndex,
                               @Param(required = false, defaultValue = "10") Integer pageSize) {
        EasyPageResult<DeptEntity> deptPageResult = easyEntityQuery.queryable(DeptEntity.class)
                .where(d -> {
                    // 部门名称不为空时对部门名称进行模糊查询
                    d.name().like(StrUtil.isNotBlank(name), name);
                })
                // 查询分页数据
                .toPageResult(pageIndex, pageSize);

        return ResponseResult.success("查询成功", deptPageResult);
    }

    /**
     * 添加部门
     * @visduo
     *
     * @param name 部门名称
     * @return 添加结果
     */
    @Post
    @Mapping("/add")
    public ResponseResult add(@NotBlank(message = "部门名称不能为空") String name) {
        DeptEntity deptEntity = new DeptEntity();
        deptEntity.setName(name);

        // 插入部门数据
        easyEntityQuery.insertable(deptEntity).executeRows();

        return ResponseResult.success("添加成功", null);
    }

    /**
     * 修改部门
     * @visduo
     *
     * @param id 部门id
     * @param name 部门名称
     * @return 修改结果
     */
    @Put
    @Mapping("/update/{id}")
    public ResponseResult update(@Path int id,
                                 @NotBlank(message = "部门名称不能为空") String name) {
        DeptEntity deptEntity = new DeptEntity();
        deptEntity.setId(id);
        deptEntity.setName(name);

        // 修改部门数据
        easyEntityQuery.updatable(deptEntity).executeRows();

        return ResponseResult.success("修改成功", null);
    }

    /**
     * 删除部门
     * @visduo
     *
     * @param id 部门id
     * @return 删除结果
     */
    @Delete
    @Mapping("/delete/{id}")
    public ResponseResult delete(@Path int id) {
        // 该部门下有关联用户,禁止删除
        long count = easyEntityQuery.queryable(UsersEntity.class)
                .where(u -> {
                    u.deptId().eq(id);
                }).count();

        if (count > 0) {
            return ResponseResult.failure("该部门下有关联用户,禁止删除", null);
        }

        // 删除部门数据
        easyEntityQuery.deletable(DeptEntity.class)
                .where(d -> {
                    d.id().eq(id);
                }).executeRows();

        return ResponseResult.success("删除成功", null);
    }

    /**
     * 根据部门ID获取部门信息
     * @visduo
     *
     * @param id 部门ID
     * @return 部门信息
     */
    @Get
    @Mapping("/get/{id}")
    public ResponseResult get(@Path int id) {
        DeptEntity deptEntity = easyEntityQuery.queryable(DeptEntity.class)
                .where(d -> {
                    d.id().eq(id);
                }).firstOrNull();

        return ResponseResult.success("查询成功", deptEntity);
    }

}