/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */

// 该类所属的包名，表明此控制器类位于管理端相关的包下，用于处理用户相关的后台管理操作
package com.yami.shop.admin.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yami.shop.bean.model.User;
import com.yami.shop.common.util.PageParam;
import com.yami.shop.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import com.yami.shop.common.response.ServerResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.Date;

/**
 * UserController类是一个Spring RESTful风格的控制器，用于处理与用户（User）相关的后台管理接口操作。
 * 包含了用户信息的分页查询、获取单个用户详细信息、修改用户信息以及批量删除用户信息等功能。
 * @author lgh on 2018/10/16.
 */
@RestController
// 定义该控制器类的基础请求路径，所有该类中的接口请求路径都将以此为前缀，表明是针对用户的管理操作接口
@RequestMapping("/admin/user")
public class UserController {

    // 通过Spring的依赖注入机制，自动注入UserService的实例，以便调用其提供的与用户相关的业务逻辑方法
    @Autowired
    private UserService userService;

    /**
     * 分页获取用户信息的接口方法。
     * 根据传入的User对象（可能包含昵称、状态等查询条件）以及PageParam对象（用于分页参数设置），
     * 使用UserService的page方法结合LambdaQueryWrapper进行分页查询。
     * 如果用户昵称不为空，则按照昵称进行模糊查询；如果用户状态不为空，则精确匹配状态进行查询。
     * 另外，对查询结果中的每个用户的昵称进行处理，若昵称为空则设置为空字符串，
     * 最后将处理后的分页用户信息封装在ServerResponseEntity中返回，用于统一的接口响应格式处理。
     *
     * @param user 可能包含查询条件的用户对象，比如按昵称模糊查询、按状态精确查询等。
     * @param page 分页参数对象，包含页码、每页数量等信息。
     * @return 返回包含分页用户信息的ServerResponseEntity，成功时其数据部分为IPage<User>类型。
     */
    @GetMapping("/page")
    @PreAuthorize("@pms.hasPermission('admin:user:page')")
    public ServerResponseEntity<IPage<User>> page(User user, PageParam<User> page) {
        IPage<User> userPage = userService.page(page, new LambdaQueryWrapper<User>()
             .like(StrUtil.isNotBlank(user.getNickName()), User::getNickName, user.getNickName())
             .eq(user.getStatus()!= null, User::getStatus, user.getStatus()));
        for (User userResult : userPage.getRecords()) {
            userResult.setNickName(StrUtil.isBlank(userResult.getNickName())? "" : userResult.getNickName());
        }
        return ServerResponseEntity.success(userPage);
    }

    /**
     * 获取指定用户详细信息的接口方法。
     * 通过路径变量获取要查询的用户的ID（这里是字符串类型，可能根据业务实际情况而定），
     * 调用UserService的getById方法获取对应的用户对象，对用户的昵称进行处理（若为空则设置为空字符串），
     * 再将处理后的用户对象封装在ServerResponseEntity中返回，用于统一的接口响应格式处理。
     *
     * @param userId 要获取信息的用户的唯一标识符（ID，此处为字符串类型）。
     * @return 返回包含指定用户详细信息的ServerResponseEntity，成功时其数据部分为User类型。
     */
    @GetMapping("/info/{userId}")
    @PreAuthorize("@pms.hasPermission('admin:user:info')")
    public ServerResponseEntity<User> info(@PathVariable("userId") String userId) {
        User user = userService.getById(userId);
        user.setNickName(StrUtil.isBlank(user.getNickName())? "" : user.getNickName());
        return ServerResponseEntity.success(user);
    }

    /**
     * 修改用户信息的接口方法。
     * 接收通过请求体传入的用户对象（包含要修改的用户相关信息），
     * 先设置修改时间为当前时间（通过new Date()获取），对用户昵称进行处理（若为空则设置为空字符串），
     * 然后调用UserService的updateById方法根据用户的ID更新数据库中的对应用户记录，
     * 最后返回表示修改成功的ServerResponseEntity对象，用于统一的接口响应格式处理，其无具体数据内容（Void类型）。
     *
     * @param user 要修改的用户对象，通过请求体传入，包含用户的各项属性信息，如昵称、其他个人信息等可能需要修改的属性。
     * @return 返回表示修改成功的ServerResponseEntity，无数据内容（Void类型）。
     */
    @PutMapping
    @PreAuthorize("@pms.hasPermission('admin:user:update')")
    public ServerResponseEntity<Void> update(@RequestBody User user) {
        user.setModifyTime(new Date());
        user.setNickName(StrUtil.isBlank(user.getNickName())? "" : user.getNickName());
        userService.updateById(user);
        return ServerResponseEntity.success();
    }

    /**
     * 批量删除用户信息的接口方法。
     * 接收通过请求体传入的用户ID数组（字符串类型数组），将其转换为List集合后，
     * 调用UserService的removeByIds方法根据传入的用户ID集合批量删除数据库中的对应用户记录，
     * 最后返回表示删除成功的ServerResponseEntity对象，用于统一的接口响应格式处理，其无具体数据内容（Void类型）。
     *
     * @param userIds 要删除的用户的ID数组（字符串类型），通过请求体传入。
     * @return 返回表示删除成功的ServerResponseEntity，无数据内容（Void类型）。
     */
    @DeleteMapping
    @PreAuthorize("@pms.hasPermission('admin:user:delete')")
    public ServerResponseEntity<Void> delete(@RequestBody String[] userIds) {
        userService.removeByIds(Arrays.asList(userIds));
        return ServerResponseEntity.success();
    }
}