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

package com.yami.shop.api.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yami.shop.bean.app.dto.SkuDto;
import com.yami.shop.bean.model.Sku;
import com.yami.shop.service.SkuService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import cn.hutool.core.bean.BeanUtil;
import com.yami.shop.common.response.ServerResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * SKU（库存保有单位，即商品规格）相关接口的控制器类，主要负责处理根据商品 ID 获取其对应的全部有效规格列表的请求，
 * 通过调用服务层的方法查询数据库，并将查询结果转换为合适的 DTO 类型返回给前端使用。
 *
 * @author lanhai
 */
@RestController
@RequestMapping("/sku")
@Tag(name = "sku规格接口")
@AllArgsConstructor
public class SkuController {

    // 通过构造函数注入的方式引入 SKU 服务层接口，方便后续调用其提供的业务逻辑方法来处理与 SKU 相关的操作，比如查询 SKU 列表等。
    private final SkuService skuService;

    /**
     * 根据商品 ID 获取商品全部规格列表的方法，接收商品 ID 作为参数，使用 MyBatis Plus 的 LambdaQueryWrapper 构建查询条件，
     * 从数据库中查询出该商品下状态为启用（这里假设状态值为 1 表示启用）且未被删除（假设 isDelete 为 0 表示未删除）的所有 SKU 记录，
     * 然后将查询到的 SKU 实体列表转换为对应的 DTO 类型列表，最后将结果封装在 ServerResponseEntity 中返回给前端，方便前端展示和使用商品规格信息。
     *
     * @param prodId 要查询其规格列表的商品 ID，通过请求参数传入，用于筛选出属于该商品的 SKU 记录，该参数对应数据库中 Sku 表的 prodId 字段。
     * @return 包含商品全部规格信息列表的 ServerResponseEntity，以 SkuDto 类型封装每个 SKU 的信息，若查询到符合条件的 SKU 则返回对应列表，否则返回空列表表示。
     */
    @GetMapping("/getSkuList")
    @Operation(summary = "通过prodId获取商品全部规格列表", description = "通过prodId获取商品全部规格列表")
    @Parameter(name = "prodId", description = "商品id")
    public ServerResponseEntity<List<SkuDto>> getSkuListByProdId(Long prodId) {
        // 使用 MyBatis Plus 的 LambdaQueryWrapper 构建查询条件，设置筛选条件为状态为启用、未被删除且属于指定商品 ID 的 SKU 记录。
        List<Sku> skus = skuService.list(new LambdaQueryWrapper<Sku>()
              .eq(Sku::getStatus, 1)
              .eq(Sku::getIsDelete, 0)
              .eq(Sku::getProdId, prodId)
        );
        // 使用 Hutool 的 BeanUtil 将查询到的 Sku 实体列表转换为 SkuDto 类型的列表，方便按照前端期望的格式返回数据，避免直接暴露实体对象的一些潜在问题。
        List<SkuDto> skuDtoList = BeanUtil.copyToList(skus, SkuDto.class);
        return ServerResponseEntity.success(skuDtoList);
    }
}