/*
 * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
 *
 * https://www.gz-yami.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */

package com.yami.shop.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yami.shop.bean.app.dto.ProductDto;
import com.yami.shop.bean.app.dto.TagProductDto;
import com.yami.shop.bean.app.param.SearchParam;
import com.yami.shop.bean.dto.ProdAndSkuListsDto;
import com.yami.shop.bean.dto.ProdByCategoryIdAndShopIdDTO;
import com.yami.shop.bean.dto.SearchProdDto;
import com.yami.shop.bean.model.ChannelProd;
import com.yami.shop.bean.model.OrderItem;
import com.yami.shop.bean.model.Product;
import com.yami.shop.bean.model.ShopDetail;
import com.yami.shop.bean.param.CategoryProductParam;
import com.yami.shop.bean.param.ProdOrderParam;
import com.yami.shop.bean.param.ProductExportParam;
import com.yami.shop.bean.param.ProductParam;
import com.yami.shop.bean.vo.SimilarProdListVo;
import com.yami.shop.bean.vo.SkuBuyTogetherOftenVo;
import com.yami.shop.common.util.PageParam;
import org.apache.ibatis.annotations.Param;

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

public interface ProductMapper extends BaseMapper<Product> {

    List<ProductDto> getcouponProdList(@Param("ids") Long[] ids, @Param("shopId") Long shopId);

    int updateStocks(@Param("prod") Product product);

    Product getProductByProdNameAndShopId(@Param("prodName") String prodName, @Param("shopId") Long shopId);

    Product doGetById(@Param("prodId") Long prodId, @Param("channelId") Long channelId, @Param("shopId") Long shopId);

    Product doGetByShopId(@Param("prodId") Long prodId, @Param("shopId") Long shopId);

    void returnStock(@Param("prodCollect") Map<Long, Integer> prodCollect);

    IPage<ProductDto> pageByPutawayTime(IPage<ProductDto> page);

    IPage<ProductDto> pageByPutawayTimeNew(IPage<ProductDto> page,
                                           @Param("list") List<Long> list);

    IPage<ProductDto> pageByScore(IPage<ProductDto> page);

    IPage<ProductDto> pageByTagId(Page<ProductDto> page, @Param("tagId") Long tagId);

    IPage<ProductDto> moreBuyProdList(Page<ProductDto> page);

    IPage<SearchProdDto> getSearchProdDtoPageByProdName(@Param("page") PageParam<SearchProdDto> page, @Param("searchParam") SearchParam searchParam);

    TagProductDto tagProdList(@Param("tagId") Long tagId);

    List<TagProductDto> tagProdList();

    IPage<ProductDto> pageByDiscountId(Page<ProductDto> page, @Param("discountId") Long discountId);

    /**
     * 查看店铺的所有活动商品
     */
    IPage<ProductDto> listByShopId(@Param("page") PageParam<ProductDto> page, @Param("shopId") Long shopId);

    /**
     * 通过优惠券适用商品类型、优惠券id、店铺id获取商品列表
     */
    IPage<ProductDto> listBySuitableProdTypeAndCouponIdAndShopId(@Param("page") PageParam<ProductDto> page, @Param("shopId") Long shopId, @Param("suitableProdType") Integer suitableProdType, @Param("couponId") Long couponId);

    /**
     * 获取用户的收藏商品列表
     *
     * @param userId
     * @return
     */
    IPage<ProductDto> collectionProds(@Param("page") PageParam page, @Param("userId") String userId);

    /**
     * 通过商品ids列表获取商品列表及商品所有属性
     */
    List<ProdAndSkuListsDto> getProdAndSkuLists(@Param("prodIds") List<Long> prodIds);

    /**
     * 更新商品为活动商品
     */
    void updateProductToGroup(@Param("groupActivityId") Long groupActivityId, @Param("prodIds") List<Long> prodIds);

    /**
     * 更新商品为非活动商品
     */
    void updateProductToUnGroup(@Param("prodId") Long prodId);

    /**
     * 通过活动id更新活动商品为非拼团商品
     */
    void updateToUnGroupByGroupActivityId(@Param("groupActivityId") Long groupActivityId);

    /**
     * 通过活动id获取商品列表
     */
    List<Product> listByActivityId(@Param("groupActivityId") Long groupActivityId);

    /**
     * 更新商品为待审核状态
     */
    int updateToApply(@Param("prodId") Long prodId);

    /**
     * 更新商品为商家下架状态
     */
    int updateToShopOffline(@Param("prodId") Long prodId);

    /**
     * 更新商品为下架状态
     */
    int updateToOffline(@Param("prodId") Long prodId);

    /**
     * 更新商品的销量
     *
     * @param orderItems
     */
    void updateSoldNum(@Param("orderItems") List<OrderItem> orderItems);

    /**
     * 下架店铺所有的商品
     */
    int offlineProdByShopId(@Param("shopId") Long shopId);

    IPage<Product> getPageAndShopName(PageParam<Product> page, @Param("product") ProductParam product);

    List<ProdOrderParam> getProdsByOrderNumber(@Param("orderNumber") String orderNumber);

    void updateProduct(@Param("product") Product product);

    List<ProductExportParam> listProdsByProdParam(@Param("productParam") ProductExportParam productParam);

    void offlineProdByCategoryId(@Param("categoryId") Long categoryId);

    IPage<Product> pageProducts(PageParam<Product> page, @Param("product") ProductParam product);

    List<ShopDetail> queryShop(@Param("lat") String lat,
                               @Param("lon") String lon,
                               @Param("distance") String distance);

    IPage<SearchProdDto> getSearchProdDtoPageByProdNameNew(@Param("page") Page page,
                                                           @Param("searchParam") SearchParam searchParam,
                                                           @Param("list") List<Long> list);

    Integer getSalesVolume(Long prodId);

    IPage<SearchProdDto> getSearchProdDtoPageByProdName2(@Param("page") Page page, @Param("searchParam") SearchParam searchParam);

    /**
     * 根据分类ID、商户ID查询归属的所有商品
     */
    IPage<Product> listProdByCategoryIdAndShopId(@Param("page") Page page, @Param("prodByCategoryIdAndShopIdDTO") ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO);
    /**
     * 根据分类ID、商户ID查询归属的所有商品
     */
    IPage<CategoryProductParam> listProdByCIdAndSId(@Param("page") Page page, @Param("prodByCategoryIdAndShopIdDTO") ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO);

    /**
     * 根据分类ID、商户ID查询归属的所有商品
     */
    IPage<Product> listProdByCategoryIdAndShopId2(@Param("page") Page page, @Param("prodByCategoryIdAndShopIdDTO") ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO);


    /**
     * 通过海博编码获取商品信息
     *
     * @param hbSpuId 海博商品编码
     * @return 商品信息
     */
    Product selectByHbSpuId(@Param("hbSpuId") String hbSpuId);

    ChannelProd findByProdIdAndShopId(@Param("prodId")Long prodId,@Param("shopId") Long shopId,@Param("channelId") Long channelId);

    List<ProductDto> findByProdIdAndShopIdAndPrice(@Param("prodId")Long prodId, @Param("shopId")Long shopId,@Param("channelId") Long channelId, @Param("increased")BigDecimal increased, @Param("decreased")BigDecimal decreased);

    IPage<SearchProdDto> findByProdAndShop(@Param("page") PageParam<SearchProdDto> page, @Param("list")List<ProductDto> productDtos);

    /**
     * 获取相似商品列表
     *
     * @param page    分页参数
     * @param prodId  商品ID
     * @return 商品列表
     */
    IPage<SimilarProdListVo> similarProdList(@Param("page") Page page, @Param("prodId")Long prodId, @Param("shopId")Long shopId, @Param("channelId")Long channelId,@Param("userId")String userId);
}
