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

package com.yami.shop.bean.param;

import com.yami.shop.bean.model.Product;
import com.yami.shop.bean.model.Sku;
import lombok.Data;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.util.List;

/**
 * `ProductParam`类作为一个参数对象，主要用于在业务逻辑中传递与商品相关的各种参数信息，例如在创建或更新商品时，
 * 前端将商品的各项属性值封装到这个对象中传递给后端，后端可以基于这些参数进行相应的业务处理（如数据校验、保存到数据库等操作）。
 * 通过`lombok`的`@Data`注解，自动生成了各个属性的`getter`、`setter`方法以及`toString`、`hashCode`和`equals`等方法，简化了代码编写，方便对对象属性的操作和使用。
 * 同时，为各个属性添加了相应的验证约束注解，用于在接收参数时进行合法性校验，确保传入的参数符合业务要求，避免因非法参数导致的业务逻辑错误。
 *
 * @author lanhai
 */
@Data
public class ProductParam {

    /**
     * 产品ID，用于唯一标识一个商品，在更新商品操作时可通过这个ID来定位要修改的具体商品，
     * 在新建商品时，该属性可能初始值为`null`，待商品保存到数据库后会被赋予相应的唯一标识符。
     */
    private Long prodId;

    /**
     * 状态，用于表示商品当前所处的状态，例如可能用不同的整数值代表商品的上架、下架、审核中等等不同状态，
     * 具体的状态值含义需要根据业务规则来确定，在业务处理过程中可以根据这个状态属性来执行不同的逻辑，比如上架商品的展示、下架商品的隐藏等操作。
     */
    private Integer status;

    /**
     * 商品名称，是商品的重要标识信息之一，用于展示给用户查看商品的基本信息。
     * 通过`@NotBlank`注解约束该属性不能为空字符串，即必须有具体的名称内容，同时通过`@Size`注解限制其长度应该小于`200`个字符，
     * 这样可以保证商品名称的规范性和合理性，避免过长或为空的名称影响系统的展示和业务逻辑处理。
     */
    @NotBlank(message = "商品名称不能为空")
    @Size(max = 200, message = "商品名称长度应该小于{max}")
    private String prodName;

    /**
     * 商品价格，代表商品当前的售卖价格，是用户购买商品时需要支付的实际金额，
     * 通过`@NotNull`注解约束该属性不能为`null`，即必须明确指定商品的价格，确保在进行商品相关业务操作（如添加到购物车、下单等）时价格信息的完整性。
     */
    @NotNull(message = "请输入商品价格")
    private Double price;

    /**
     * 商品原价，可能用于展示商品的原始价格，与当前售价对比，让用户直观了解商品是否有优惠活动等情况，
     * 同样通过`@NotNull`注解约束不能为`null`，保证原价信息的完整性，以便业务逻辑能正确处理价格相关的展示和计算。
     */
    @NotNull(message = "请输入商品原价")
    private Double oriPrice;

    /**
     * 库存量，用于记录商品当前可销售的库存数量，在用户下单购买商品时，需要根据库存数量来判断是否能够满足购买需求，
     * 通过`@NotNull`注解确保必须传入库存数量，防止因库存信息缺失导致的超卖等业务问题。
     */
    @NotNull(message = "请输入商品库存")
    private Integer totalStocks;

    /**
     * 简要描述，卖点等，用于对商品的特点、优势等进行简短的文字描述，方便用户快速了解商品的关键信息，
     * 通过`@Size`注解限制其长度应该小于`500`个字符，保证描述信息简洁明了且不会过长影响展示效果。
     */
    @Size(max = 500, message = "商品卖点长度应该小于{max}")
    private String brief;

    /**
     * 图片相关的属性，可能用于存储商品的主图路径或者标识等信息，通过`@NotBlank`注解约束不能为空字符串，
     * 意味着必须选择图片上传，确保商品有对应的展示图片，提升用户体验以及满足业务展示需求。
     */
    @NotBlank(message = "请选择图片上传")
    private String pic;

    /**
     * 商品图片，可能用于存储商品的多张图片路径等信息，同样通过`@NotBlank`注解要求必须选择图片上传，
     * 以便在商品详情页等地方展示商品的多角度、多细节图片，让用户更全面地了解商品外观等情况。
     */
    @NotBlank(message = "请选择图片上传")
    private String imgs;

    /**
     * 商品分类，用于将商品归类到不同的类别下，方便在系统中进行分类管理和展示，例如电子产品、服装、食品等不同分类，
     * 通过`@NotNull`注解确保必须选择商品分类，使得商品能正确归属到相应的分类体系中，便于用户查找和系统的统计分析等操作。
     */
    @NotNull(message = "请选择商品分类")
    private Long categoryId;

    /**
     * sku列表字符串，这里虽然定义为`List<Sku>`类型，但名称中的“字符串”可能暗示了在实际业务中其存储或传递形式可能与字符串有一定关联，
     * 一般来说，`Sku`代表商品的规格信息，如不同颜色、尺码等规格对应的库存、价格等详细信息，这个列表用于保存商品的所有规格相关数据，方便在处理商品多规格业务时使用。
     */
    private List<Sku> skuList;

    /**
     * content 商品详情，用于存储商品的详细介绍内容，比如商品的参数、功能、使用方法等详细文字描述，
     * 可以让用户更深入地了解商品的具体情况，在商品详情页进行展示，帮助用户做出购买决策。
     */
    private String content;

    /**
     * 是否能够用户自提，通过`Product.DeliveryModeVO`类型的对象来表示，这个对象应该包含了与商品配送方式相关的详细信息，
     * 比如除了自提还可能涉及店铺配送等其他配送模式的设置情况，用于确定商品的配送相关属性，满足不同用户的收货需求和业务的配送管理要求。
     */
    private Product.DeliveryModeVO deliveryModeVo;

    /**
     * 运费模板id，用于关联商品对应的运费计算模板，不同的运费模板可以根据不同的规则（如按重量、按件数、地区差异等）来计算商品的运费，
     * 通过这个id可以找到对应的运费模板，进而准确计算商品在不同情况下的运费金额，确保运费计算的准确性和灵活性。
     */
    private Long deliveryTemplateId;

    /**
     * 分组标签列表，用于给商品打上不同的分组标签，方便从不同维度对商品进行分类、筛选和推荐等操作，例如可以按照品牌、风格、适用场景等标签来组织商品，
     * 用户可以通过这些标签快速找到符合自己需求的商品，同时也便于系统进行个性化推荐等业务逻辑实现。
     */
    private List<Long> tagList;

}