package com.gxwebsoft.shop.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.gxwebsoft.shop.entity.ShopGoods;
import com.gxwebsoft.shop.param.ShopGoodsParam;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

import java.util.List;
import java.util.Map;

/**
 * 商品Mapper
 *
 * @author 科技小王子
 * @since 2025-04-24 20:52:13
 */
public interface ShopGoodsMapper extends BaseMapper<ShopGoods> {

    /**
     * 分页查询
     *
     * @param page  分页对象
     * @param param 查询参数
     * @return List<ShopGoods>
     */
    List<ShopGoods> selectPageRel(@Param("page") IPage<ShopGoods> page,
                             @Param("param") ShopGoodsParam param);

    /**
     * 查询全部
     *
     * @param param 查询参数
     * @return List<User>
     */
    List<ShopGoods> selectListRel(@Param("param") ShopGoodsParam param);

    /**
     * 累加商品销售数量
     * 使用@InterceptorIgnore忽略租户隔离，确保能更新成功
     *
     * @param goodsId 商品ID
     * @param saleCount 累加的销售数量
     * @return 影响的行数
     */
    @InterceptorIgnore(tenantLine = "true")
    @Update("UPDATE shop_goods SET sales = IFNULL(sales, 0) + #{saleCount} WHERE goods_id = #{goodsId}")
    int addSaleCount(@Param("goodsId") Integer goodsId, @Param("saleCount") Integer saleCount);

    /**
     * 商品数量统计（出售中=status=0且stock>0 / 待上架=status>0 / 已售罄=stock=0）
     * 一条 SQL 聚合，替代 3 次 count 查询
     *
     * @param param 查询参数
     * @return 包含 totalNum/totalNum2/totalNum3 的统计 Map
     */
    Map<String, Object> selectCountSummary(@Param("param") ShopGoodsParam param);

    /**
     * 下架已售罄（库存为0）的商品，忽略租户隔离（全局下架）
     * 由定时任务调用，从统计读接口剥离出的写操作
     *
     * @return 影响的行数
     */
    @InterceptorIgnore(tenantLine = "true")
    @Update("UPDATE shop_goods SET status = 1 WHERE stock = 0 AND status != 1")
    int downSoldOutGoods();

}
