package org.dromara.zhishu.mapper;

import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import org.apache.ibatis.annotations.Param;
import org.dromara.zhishu.domain.dto.ShopGoodsDto;

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

/**
 * 商品信息Mapper接口
 */
public interface ShopGoodsMapper {

    // ==================== 表管理 ====================

    /**
     * 检查表是否存在
     * @param tableName 表名
     * @return 存在数量
     */
    @InterceptorIgnore(tenantLine = "true")
    int checkTableExists(@Param("tableName") String tableName);

    /**
     * 创建表
     * @param tableName 表名
     */
    @InterceptorIgnore(tenantLine = "true")
    void createTable(@Param("tableName") String tableName);

    // ==================== 插入操作 ====================

    /**
     * 插入单条数据
     * @param tableName 表名
     * @param shopGoods 商品信息
     * @return 影响行数
     */
    @InterceptorIgnore(tenantLine = "true")
    int insert(@Param("tableName") String tableName, @Param("shopGoods") ShopGoodsDto shopGoods);

    /**
     * 批量插入
     * @param tableName 表名
     * @param list 商品列表
     * @return 影响行数
     */
    @InterceptorIgnore(tenantLine = "true")
    int batchInsert(@Param("tableName") String tableName, @Param("list") List<Map> list);

    // ==================== 删除操作 ====================

    /**
     * 根据ID删除
     * @param tableName 表名
     * @param id 主键ID
     * @return 影响行数
     */
    @InterceptorIgnore(tenantLine = "true")
    int deleteById(@Param("tableName") String tableName, @Param("id") Long id);

    /**
     * 根据条件删除
     * @param tableName 表名
     * @param trilateralId 商品id
     * @param isbn ISBN号
     * @param shopId 店铺id
     * @param isOnSale 上下架状态
     * @return 影响行数
     */
    @InterceptorIgnore(tenantLine = "true")
    int deleteByCondition(@Param("tableName") String tableName,
                          @Param("trilateralId") String trilateralId,
                          @Param("isbn") String isbn,
                          @Param("shopId") String shopId,
                          @Param("isOnSale") String isOnSale);

    /**
     * 批量删除
     * @param tableName 表名
     * @param ids ID列表
     * @return 影响行数
     */
    @InterceptorIgnore(tenantLine = "true")
    int batchDeleteByIds(@Param("tableName") String tableName, @Param("ids") List<Long> ids);

    /**
     * 删除所有数据
     * @param tableName 表名
     * @return 影响行数
     */
    @InterceptorIgnore(tenantLine = "true")
    int deleteAll(@Param("tableName") String tableName);

    // ==================== 更新操作 ====================

    /**
     * 根据ID更新
     * @param tableName 表名
     * @param shopGoods 商品信息
     * @return 影响行数
     */
    @InterceptorIgnore(tenantLine = "true")
    int updateById(@Param("tableName") String tableName, @Param("shopGoods") ShopGoodsDto shopGoods);

    /**
     * 更新上下架状态
     * @param tableName 表名
     * @param trilateralId 商品id
     * @param isOnSale 上下架状态
     * @return 影响行数
     */
    @InterceptorIgnore(tenantLine = "true")
    int updateOnSaleStatus(@Param("tableName") String tableName,
                           @Param("trilateralId") String trilateralId,
                           @Param("isOnSale") String isOnSale);

    /**
     * 批量更新上下架状态
     * @param tableName 表名
     * @param trilateralIds 商品id列表
     * @param isOnSale 上下架状态
     * @return 影响行数
     */
    @InterceptorIgnore(tenantLine = "true")
    int batchUpdateOnSaleStatus(@Param("tableName") String tableName,
                                @Param("trilateralIds") List<String> trilateralIds,
                                @Param("isOnSale") String isOnSale);

    // ==================== 查询操作 ====================

    /**
     * 根据ID查询
     * @param tableName 表名
     * @param id 主键ID
     * @return 商品信息
     */
    @InterceptorIgnore(tenantLine = "true")
    ShopGoodsDto selectById(@Param("tableName") String tableName, @Param("id") Long id);

    /**
     * 根据商品ID查询
     * @param tableName 表名
     * @param trilateralId 商品id
     * @return 商品信息
     */
    @InterceptorIgnore(tenantLine = "true")
    ShopGoodsDto selectByTrilateralId(@Param("tableName") String tableName, @Param("trilateralId") String trilateralId);

    /**
     * 根据ISBN查询列表
     * @param tableName 表名
     * @param isbn ISBN号
     * @return 商品列表
     */
    @InterceptorIgnore(tenantLine = "true")
    List<ShopGoodsDto> selectByIsbn(@Param("tableName") String tableName, @Param("isbn") String isbn);

    /**
     * 根据店铺ID查询列表
     * @param tableName 表名
     * @param shopId 店铺id
     * @return 商品列表
     */
    @InterceptorIgnore(tenantLine = "true")
    List<ShopGoodsDto> selectByShopId(@Param("tableName") String tableName, @Param("shopId") String shopId);

    /**
     * 分页条件查询
     * @param tableName 表名
     * @return 商品列表
     */
    @InterceptorIgnore(tenantLine = "true")
    List<ShopGoodsDto> selectByCondition(@Param("tableName") String tableName,@Param("shopGoodsDto") ShopGoodsDto shopGoodsDto);

    /**
     * 条件查询总数
     * @param tableName 表名
     * @return 总数
     */
    @InterceptorIgnore(tenantLine = "true")
    int selectCountByCondition(@Param("tableName") String tableName,@Param("shopGoodsDto") ShopGoodsDto shopGoodsDto);

    /**
     * 查询所有商品
     * @param tableName 表名
     * @return 商品列表
     */
    @InterceptorIgnore(tenantLine = "true")
    List<ShopGoodsDto> selectAll(@Param("tableName") String tableName);

    /**
     * 统计在售商品数量
     * @param tableName 表名
     * @return 在售商品数量
     */
    @InterceptorIgnore(tenantLine = "true")
    int countOnSale(@Param("tableName") String tableName);

    /**
     * 统计总记录数
     * @param tableName 表名
     * @return 总记录数
     */
    @InterceptorIgnore(tenantLine = "true")
    int countAll(@Param("tableName") String tableName);

    /**
     * 根据商品编码查询
     * @param tableName 表名
     * @param goodsCode 商品编码
     * @return 商品信息
     */
    @InterceptorIgnore(tenantLine = "true")
    ShopGoodsDto selectByGoodsCode(@Param("tableName") String tableName, @Param("goodsCode") String goodsCode);

    /**
     * 根据SKU编码查询
     * @param tableName 表名
     * @param skuCode sku编号
     * @return 商品信息
     */
    @InterceptorIgnore(tenantLine = "true")
    ShopGoodsDto selectBySkuCode(@Param("tableName") String tableName, @Param("skuCode") String skuCode);

    /**
     * 批量查询是否存在
     * @param tableName 表名
     * @param trilateralIds 商品id列表
     * @return 存在映射
     */
    @InterceptorIgnore(tenantLine = "true")
    List<Map<String, Object>> batchCheckExists(@Param("tableName") String tableName, @Param("trilateralIds") List<String> trilateralIds);
}