package com.snack.server.module.product.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.snack.server.module.product.dto.req.ProductPageReq;
import com.snack.server.module.product.dto.req.ProductSaveReq;
import com.snack.server.module.product.dto.req.StockAdjustReq;
import com.snack.server.module.product.entity.ProductSku;
import com.snack.server.module.product.vo.ProductDetailVO;
import com.snack.server.module.product.vo.ProductListVO;

import java.util.Collection;
import java.util.List;

/**
 * 商品业务接口
 */
public interface ProductService {

    /**
     * 分页查询（管理端）
     */
    Page<ProductListVO> pageProducts(ProductPageReq req);

    /**
     * 商品详情（含 SKU）
     */
    ProductDetailVO getDetail(Long id);

    /**
     * 根据 ID 获取商品（不含 SKU）
     */
    ProductDetailVO getById(Long id);

    /**
     * 创建商品（SPU + SKU 一起保存）
     */
    Long createProduct(ProductSaveReq req);

    /**
     * 更新商品（SPU + SKU 一起保存，SKU 增量更新）
     */
    void updateProduct(ProductSaveReq req);

    /**
     * 删除商品（级联删除 SKU）
     */
    void deleteProduct(Long id);

    /**
     * 上下架切换
     */
    void updateStatus(Long id, Integer status);

    /**
     * 设置 / 取消热门
     */
    void updateHot(Long id, Integer isHot);

    /**
     * 设置 / 取消新品
     */
    void updateNew(Long id, Integer isNew);

    /**
     * 调整 SKU 库存
     */
    void adjustStock(StockAdjustReq req);

    /**
     * 扣减库存（订单 / 抢购用）
     * @return true 成功，false 库存不足
     */
    boolean decrStock(Long skuId, Integer quantity);

    /**
     * 释放库存（取消订单 / 退款用）
     */
    void incrStock(Long skuId, Integer quantity);

    /**
     * 增加浏览量
     */
    void incrViewCount(Long id);

    /**
     * 根据分类 ID 列表查询商品（用户端首页 / 分类页）
     */
    List<ProductListVO> listByCategoryIds(Collection<Long> categoryIds, String orderBy, Integer limit);

    /**
     * 热门商品（is_hot=1，按销量倒序）
     */
    List<ProductListVO> listHotProducts(Integer limit);

    /**
     * 新品上市（is_new=1，按 id 倒序）
     */
    List<ProductListVO> listNewProducts(Integer limit);

    /**
     * 根据 SPU ID 列表获取所有 SKU
     */
    List<ProductSku> listSkusByProductIds(List<Long> productIds);
}
