package com.czg.product.service;

import com.czg.product.dto.ProductDTO;
import com.czg.product.entity.Product;
import com.czg.product.entity.ProductStockFlow;
import com.czg.product.param.*;
import com.czg.product.vo.ProductStatisticsVo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;

import java.util.List;

/**
 * 商品
 *
 * @author Tankaikai tankaikai@aliyun.com
 * @since 1.0 2025-02-16
 */
public interface ProductService extends IService<Product> {
    /**
     * 获取商品分页
     *
     * @param param 查询参数
     * @return 分页数据
     */
    Page<ProductDTO> getProductPage(ProductDTO param);

    /**
     * 获取商品列表
     *
     * @param param 查询参数
     * @return 商品列表数据
     */
    List<ProductDTO> getProductList(ProductDTO param);

    /**
     * 从缓存里面获取商品列表
     *
     * @param param 查询参数
     * @return 商品列表数据
     */
    List<ProductDTO> getProductCacheList(ProductDTO param);

    /**
     * 清除某个商品分类的缓存
     */
    void clearProductCache(Long... categoryIds);

    /**
     * 获取商品详情
     *
     * @param id 商品ID
     * @return 商品详情数据
     */
    ProductDTO getProductById(Long id);

    /**
     * 添加商品
     *
     * @param dto 商品信息
     */
    void addProduct(ProductDTO dto);

    /**
     * 更新商品
     *
     * @param dto 商品信息
     */
    void updateProduct(ProductDTO dto);

    /**
     * 修改商品库存数量
     *
     * @param param 商品id及库存数量
     */
    void updateProductStock(ProductModifyStockParam param);

    /**
     * 删除商品
     *
     * @param shopId 店铺ID
     * @param id     商品ID
     */
    void deleteProduct(Long shopId, Long id);

    /**
     * 上架/下架商品
     *
     * @param param 商品上架/下架参数
     */
    void onOffProduct(ProductIsSaleParam param);

    /**
     * 标记商品售罄
     *
     * @param param 入参
     */
    void markProductIsSoldOut(ProductIsSoldOutParam param);

    /**
     * 退货到库存
     *
     * @param param 退货到库存参数
     */
    void refundToStock(ProdRefundToStockParam param);

    /**
     * 库存预警
     *
     * @param warnLine 预警线
     */
    void stockWarning(Integer warnLine);

    /**
     * 商品报损
     *
     * @param param 商品报损入参
     */
    void reportDamage(ProductReportDamageParam param);

    /**
     * 商品统计
     *
     * @param param 商品统计入参
     */
    ProductStatisticsVo getProductStatistics(ProductInfoParam param);

    /**
     * 商品出入库流水查询
     *
     * @param param 查询参数
     * @return 分页数据
     */
    Page<ProductStockFlow> findProductStockFlowPage(ProductStockFlowParam param);

    /**
     * 刷新商品库存
     *
     * @param param   查询条件
     * @param records 商品数据集合
     */
    void refreshProductStock(ProductDTO param, List<ProductDTO> records);

}
