package com.jeesharp.business.modules.mall.service;

import com.jeesharp.business.modules.mall.dto.MallProductSaveDTO;
import com.jeesharp.business.modules.mall.dto.MallSkuSaveDTO;
import com.jeesharp.business.modules.mall.dto.MallSpuSaveDTO;
import com.jeesharp.business.modules.mall.entity.MallSku;
import com.jeesharp.business.modules.mall.entity.MallSpu;
import com.jeesharp.business.modules.mall.vo.MallSkuQueryVO;
import com.jeesharp.framework.mybatis.core.service.BaseInterface;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 商品SKU Service 接口
 * 包含商品相关的业务逻辑
 */
public interface MallSkuService extends BaseInterface<MallSku, MallSkuQueryVO> {

    /**
     * 执行商品保存业务逻辑
     *
     * @param productAuditEnabled 是否开启商户商品平台审核（来自商城设置 product_audit_enabled）
     */
    void executeSaveProduct(MallProductSaveDTO dto, boolean productAuditEnabled);

    /**
     * 数据验证
     */
    void validateProductData(MallProductSaveDTO dto);

    /**
     * 创建或更新SPU
     */
    MallSpu createOrUpdateSpu(MallProductSaveDTO dto, boolean isNew, boolean productAuditEnabled);

    /**
     * 生成商品编码
     */
    String generateSpuCode();

    /**
     * 保存SKU列表
     */
    void saveSkuList(List<MallSkuSaveDTO> skuList, String spuId);

    /**
     * 从DTO创建SKU实体
     */
    MallSku createSkuFromDto(MallSkuSaveDTO dto, String spuId);

    /**
     * 保存SPU规格关联
     */
    void saveSpuSpecRelations(String spuId, List<String> specIds);

    /**
     * 保存 SPU 标签关联（全量替换；{@code tagIds} 为空则清空关联）
     */
    void saveSpuTagRelations(String spuId, List<String> tagIds);

    /**
     * 删除商品（包含级联删除）
     */
    void deleteProduct(String spuId);

    /**
     * 保存简单 SPU 信息
     */
    void createSimpleProduct(MallSpuSaveDTO dto, boolean productAuditEnabled);

    void updateSimpleProduct(MallSpuSaveDTO dto, boolean productAuditEnabled);

    /**
     * 删除多个商品
     */
    void deleteProducts(String ids);

    /**
     * 获取 SPU 下已启用 SKU 的最低销售价
     */
    BigDecimal getMinSalePrice(String spuId);

    /**
     * 获取 SPU 下已启用 SKU 列表
     */
    List<MallSku> listEnabledSkus(String spuId);

    /**
     * 扣减 SKU 库存（下单），库存不足或 SKU 不可售时抛出业务异常。
     *
     * @param skuId    SKU 主键
     * @param quantity 扣减数量，须为正整数
     */
    void decreaseStock(String skuId, int quantity);

    /**
     * 订单取消时回补 SKU 库存。
     */
    void increaseStock(String skuId, int quantity);

    /**
     * 按 SKU 名称模糊匹配主键列表（管理端筛选）。
     */
    List<String> findIdsBySkuNameLike(String skuName);

    /**
     * 批量按主键查询 SKU 名称映射。
     */
    Map<String, String> mapSkuNameByIds(List<String> ids);
}
