package com.fs.live.mapper;

import com.fs.live.domain.LiveGoods;
import com.fs.live.domain.LiveOrder;
import com.fs.live.vo.LiveGoodsListVo;
import com.fs.live.vo.LiveGoodsVo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

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

/**
 * 直播商品Mapper接口
 *
 * @author fs
 * @date 2025-07-08
 */
public interface LiveGoodsMapper {
    /**
     * 查询直播商品
     *
     * @param goodsId 直播商品主键
     * @return 直播商品
     */
    LiveGoods selectLiveGoodsByGoodsId(Long goodsId);

    /**
     * 查询直播商品列表
     *
     * @param liveGoods 直播商品
     * @return 直播商品集合
     */
    List<LiveGoods> selectLiveGoodsList(LiveGoods liveGoods);

    /**
     * 新增直播商品
     *
     * @param liveGoods 直播商品
     * @return 结果
     */
    int insertLiveGoods(LiveGoods liveGoods);

    /**
     * 修改直播商品
     *
     * @param liveGoods 直播商品
     * @return 结果
     */
    int updateLiveGoods(LiveGoods liveGoods);

    /**
     * 删除直播商品
     *
     * @param goodsId 直播商品主键
     * @return 结果
     */
    int deleteLiveGoodsByGoodsId(Long goodsId);

    /**
     * 批量删除直播商品
     *
     * @param goodsIds 需要删除的数据主键集合
     * @return 结果
     */
    int deleteLiveGoodsByGoodsIds(Long[] goodsIds);

    Long selectStoreIdByLiveId(Long liveId);

    /**
     * 新增直播商品
     *
     * @param liveGoodsList 直播商品
     * @return 结果
     */
    int insertLiveGoodsList(@Param("liveGoodsList") List<LiveGoods> liveGoodsList);

    /**
     * 批量查询商品ID
     *
     * @param liveId 直播ID
     * @return 商品ID集合
     */
    List<String> selectProductIdsByLiveId(@Param("liveId") Long liveId);

    /**
     * 批量查询商品信息
     *
     * @param liveGoods 直播商品
     * @return 商品信息集合
     */
    List<LiveGoodsVo> selectProductListByLiveId(LiveGoods liveGoods);

    /**
     * 批量更新商品信息
     *
     * @param listVo 直播商品
     * @return 批量更新结果
     */
    int updateBatchList(@Param("listVo") LiveGoodsListVo listVo);

/**
     * 批量删除商品信息
     *
     * @param listVo 直播商品
     * @return 批量删除结果
     */
    int deleteBatchList(@Param("listVo") LiveGoodsListVo listVo);


    List<LiveGoodsVo> selectProductListByOrder(LiveOrder liveOrder);

    @Select("select * from live_goods where live_id = #{liveId} and product_id = #{productId}")
    LiveGoods selectLiveGoodsByProductId(@Param("liveId") Long liveId,@Param("productId") Long productId);

    /**
     * 根据店铺ID查询商品列表
     */
    List<LiveGoodsVo> selectLiveGoodsListByStoreId(@Param("params") Map<String, Object> params);

    @Select("select store_id from live_goods where live_id = #{liveId} limit 1")
    Long getStoreIdByLiveId(Long liveId);

    @Select("select distinct store_id from live_goods where live_id = #{liveId}")
    List<Long> selectStoreIdsByLiveId(@Param("liveId") Long liveId);

    int handleShelfOrUnAdmin(@Param("listVo") LiveGoodsListVo listVo);

    int handleDeleteSelectedAdmin(@Param("listVo") LiveGoodsListVo listVo);

    List<LiveGoodsVo> selectProductListByLiveIdAll(LiveGoods liveGoods);

    @Select("select count(1) from live_goods where is_show = true and live_id = #{liveId}")
    int selectIsShowDTO(@Param("liveId") Integer liveId);

    void handleIsShowChange(@Param("listVo") LiveGoodsListVo listVo);

    LiveGoodsVo selectLiveGoodsVoByGoodsId(@Param("goodsId") Long goodsId);

    LiveGoodsVo showGoods(@Param("liveId") Long liveId);

    @Select("select * from live_goods where live_id = #{liveId}")
    List<LiveGoods> selectLiveGoodsByLiveId(@Param("liveId") Long liveId);

    @Update({"<script>" +
            "update live_goods set is_show =" +
            "CASE WHEN goods_id=#{goodsId} THEN 1 " +
            "ELSE 0 END where live_id = #{liveId}" +
            "</script>"})
    void updateLiveIsShow(@Param("goodsId")Long goodsId,@Param("liveId") Long liveId);

    /**
     * 根据goodsId更新商品上下架状态
     * @param goodsId 商品ID
     * @param status 状态：1-上架 0-下架
     */
    @Update("update live_goods set status = #{status} where goods_id = #{goodsId}")
    void updateLiveGoodsStatus(@Param("goodsId") Long goodsId, @Param("status") Integer status);
}
