package com.ylx.massage.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ylx.massage.domain.Product;
import com.ylx.massage.domain.dto.ProductCreateDTO;
import com.ylx.massage.domain.dto.ProductSpecSetupDTO;
import com.ylx.massage.domain.dto.ProductUpdateDTO;
import com.ylx.massage.domain.vo.H5ProductVo;
import com.ylx.massage.domain.vo.SpecComboVO;

import java.util.List;

/**
 * 商品表(Product)表服务接口
 *
 * @author ylx
 * @since 2026-03-26
 */
public interface ProductService extends IService<Product> {

    /**
     * 新增商品（包含规格、SKU、图片）
     *
     * @param dto 新增商品请求DTO
     * @return 商品ID
     */
    Long createProduct(ProductCreateDTO dto);

    /**
     * 修改商品
     *
     * @param dto 修改商品请求DTO
     */
    void updateProduct(ProductUpdateDTO dto);

    /**
     * 设置商品规格（新增或更新规格名和规格值）
     *
     * @param dto 规格设置请求DTO
     */
    void setupSpec(ProductSpecSetupDTO dto);

    /**
     * 获取商品规格组合（笛卡尔积）
     *
     * @param productNo 商品编号
     * @return List<SpecComboVO> 规格组合列表
     */
    List<SpecComboVO> getSpecCombinations(String productNo);

    /**
     * 生成商品编号
     * 规则：分类编码 + 当前日期(yyyyMMdd) + 序列号(3位)
     * 示例：AD20260327001
     *
     * @param categoryId 分类ID
     * @return 生成的商品编号
     */
    String generateProductNo(Long categoryId);


    /**
     * 分页查询商品列表(H5端)-支持排序
     *
     * @param page      分页参数
     * @param product   商品查询参数
     * @param sortField 排序字段（price:价格, sales:销量）
     * @param sortOrder 排序方式（asc:升序, desc:降序）
     * @return Page<Product> 分页结果
     */
    Page<H5ProductVo> selectH5Page(Page<H5ProductVo> page, Product product, String name,String sortField, String sortOrder);

}
