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

package com.yami.shop.api.controller;

import com.yami.shop.bean.app.dto.ProdTagDto;
import com.yami.shop.bean.model.ProdTag;
import com.yami.shop.service.ProdTagService;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 商品分组标签相关的接口控制器类，主要负责向外提供获取商品分组标签列表信息的接口，
 * 通过调用对应的服务层（ProdTagService）方法获取原始标签数据，并进行数据格式转换后返回给客户端。
 *
 * @author lanhai
 */
@RestController
// 设置该控制器类对应的请求映射路径，后续类中的接口方法路径会基于此进行拼接，这里表明是与商品分组标签相关接口所在的基础路径。
@RequestMapping("/prod/tag")
// 使用 @Tag 注解为该控制器类添加标签说明，用于在 API 文档（如 Swagger 生成的文档）中对该类下的接口进行分类展示，这里表明是“商品分组标签接口”相关的一组接口。
@Tag(name = "商品分组标签接口")
// 通过Lombok的 @AllArgsConstructor 注解生成包含所有参数的构造函数，用于依赖注入ProdTagService实例，方便后续调用其业务方法获取标签数据。
@AllArgsConstructor
public class ProdTagController {

    // 注入ProdTagService，用于处理与商品分组标签相关的业务逻辑，例如从数据库中查询所有商品分组标签列表等操作。
    private ProdTagService prodTagService;

    /**
     * 商品分组标签列表接口方法，用于获取所有的商品分组标签列表信息，并将其返回给客户端。
     * 通过 @GetMapping 注解将该方法映射到 HTTP 的 GET 请求方式，请求路径为“/prodTagList”，客户端可以通过该路径发送GET请求来获取商品分组标签数据。
     * @Operation 注解用于在 API 文档中对该接口进行详细描述，包括接口的简要说明（summary）和详细描述（description），方便接口使用者了解接口的功能，这里表明是获取商品分组标签列表的功能。
     *
     * @return 返回一个包含商品分组标签信息的ServerResponseEntity对象，若获取成功则响应体中包含标签列表数据（以ProdTagDto列表形式返回），否则返回相应错误信息。
     */
    @GetMapping("/prodTagList")
    @Operation(summary = "商品分组标签列表", description = "获取所有的商品分组列表")
    public ServerResponseEntity<List<ProdTagDto>> getProdTagList() {
        // 调用ProdTagService的listProdTag方法，从数据库或其他数据源获取商品分组标签的原始数据列表（以ProdTag对象形式返回）。
        List<ProdTag> prodTagList = prodTagService.listProdTag();
        // 使用hutool的BeanUtil工具类，将ProdTag对象列表转换为ProdTagDto对象列表，ProdTagDto可能是用于对外展示的、经过筛选或格式调整后的视图对象，
        // 这样可以避免直接将内部的业务实体对象暴露给客户端，更好地控制数据的展示格式和安全性。
        List<ProdTagDto> prodTagDtoList = BeanUtil.copyToList(prodTagList, ProdTagDto.class);
        // 将转换后的ProdTagDto列表封装在表示成功的ServerResponseEntity对象中返回给客户端，遵循统一的接口响应格式规范。
        return ServerResponseEntity.success(prodTagDtoList);
    }
}