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.enums.InOutItemEnum;
import com.czg.product.enums.InOutTypeEnum;
import com.czg.product.param.*;
import com.czg.product.vo.ProductStatisticsVo;
import com.czg.product.vo.ProductStockVO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import jakarta.servlet.http.HttpServletResponse;

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);

    void exportProductList(ProductDTO param, HttpServletResponse response);

    /**
     * 从缓存里面获取商品列表
     *
     * @param shopId     店铺ID
     * @param categoryId 商品分类ID
     * @return 商品列表数据
     */
    List<ProductDTO> getProductCacheList(Long shopId, Long categoryId);

    /**
     * 清除某个商品分类的缓存
     */
    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 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 markProductIsAutoSoldOut(Long shopId, ProductIsAutoSaleParam param);

    /**
     * 商品报损
     *
     * @param param 商品报损入参
     */
    void reportDamage(ProductReportDamageParam param);
    /**
     * 批量操作商品
     */
    void batchOperate(ProductBatchParam param);
    /**
     * 商品统计
     *
     * @param param 商品统计入参
     */
    ProductStatisticsVo getProductStatistics(ProductInfoParam param);

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

    /**
     * 通过商品 进行耗材库存增减
     */
    void consStockByProduct(Long shopId, InOutTypeEnum type, InOutItemEnum item, List<ProductStockVO> products, Long orderId, String remark);
}
