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

package com.yami.shop.api.controller;

import com.yami.shop.bean.app.dto.UserDto;
import com.yami.shop.bean.app.param.UserInfoParam;
import com.yami.shop.bean.model.User;
import com.yami.shop.security.api.util.SecurityUtils;
import com.yami.shop.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import cn.hutool.core.bean.BeanUtil;
import com.yami.shop.common.response.ServerResponseEntity;
import org.springframework.web.bind.annotation.*;

/**
 * 用户相关接口的控制器类
 * 该类提供了与用户操作相关的几个接口，包括查看用户信息以及设置用户信息等功能，通过调用服务层的对应方法来实现业务逻辑，并借助`Swagger`注解对接口进行文档化描述，方便接口的查看与使用。
 *
 * @author lanhai
 */
@RestController
@RequestMapping("/p/user")
@Tag(name = "用户接口")
// 使用 @AllArgsConstructor 注解，由 lombok 自动生成包含所有成员变量的构造函数，用于依赖注入
@AllArgsConstructor
public class UserController {

    // 通过构造函数注入UserService，用于调用业务层方法来处理用户相关的业务逻辑
    private final UserService userService;

    /**
     * 查看用户信息的接口方法
     * 根据当前登录用户的ID，调用服务层方法获取对应的用户信息，再将其转换为对应的DTO（数据传输对象）后返回给前端。
     *
     * @return 返回一个ServerResponseEntity<UserDto>类型的响应，成功时包含当前登录用户信息对应的DTO对象数据，若获取数据出现异常则返回相应的错误信息。
     */
    @GetMapping("/userInfo")
    @Operation(summary = "查看用户信息", description = "根据用户ID（userId）获取用户信息")
    public ServerResponseEntity<UserDto> userInfo() {
        // 获取当前登录用户的ID
        String userId = SecurityUtils.getUser().getUserId();
        // 调用服务层方法根据用户ID获取用户实体信息
        User user = userService.getById(userId);
        // 使用 hutool 工具类的方法，将User对象转换为UserDto对象，用于传输给前端展示的数据格式转换
        UserDto userDto = BeanUtil.copyProperties(user, UserDto.class);
        return ServerResponseEntity.success(userDto);
    }

    /**
     * 设置用户信息的接口方法
     * 根据传入的用户信息参数对象，构建用户实体对象，设置相关属性（如头像、昵称等）后，调用服务层方法更新数据库中对应的用户信息，并返回表示操作成功的响应给前端。
     *
     * @param userInfoParam 包含用户信息相关内容的参数对象，用于构建要更新的用户实体对象，其属性涵盖了头像链接、昵称等信息，参数从请求体中获取。
     * @return 返回一个ServerResponseEntity<Void>类型的响应，成功时表示用户信息更新操作成功，无具体返回数据，若更新过程出现异常则返回相应的错误信息。
     */
    @PutMapping("/setUserInfo")
    @Operation(summary = "设置用户信息", description = "设置用户信息")
    public ServerResponseEntity<Void> setUserInfo(@RequestBody UserInfoParam userInfoParam) {
        // 获取当前登录用户的ID
        String userId = SecurityUtils.getUser().getUserId();
        User user = new User();
        user.setUserId(userId);
        user.setPic(userInfoParam.getAvatarUrl());
        user.setNickName(userInfoParam.getNickName());
        userService.updateById(user);
        return ServerResponseEntity.success();
    }
}