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

package com.yami.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
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.*;
import com.yami.shop.bean.model.Product;
import com.yami.shop.bean.param.CategoryProductParam;
import com.yami.shop.bean.param.OfflineHandleEventAuditParam;
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.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 商品
 */
public interface ProductService extends IService<Product> {

//    Product getById(Long prodId, Integer platform);

    /**
     * 保存商品
     *
     * @param product 商品信息
     */
    void saveProduct(Product product);

    /**
     * 更新商品
     *
     * @param product 商品信息
     */
    void updateProduct(Product product, Product dbProduct);

    /**
     * 根据商品id获取商品信息
     *
     * @param prodId
     * @return
     */
    Product getProductByProdId(Long prodId);
    Product getProductByProdIdAndShopId(Long prodId, Long shopId);
    Product getProductByProdId(Long prodId,Long channelId,Long shopId);


    void removeProductByProdId(Long prodId);

    void removeProductCacheByProdId(Long prodId);

    IPage<ProductDto> pageByPutawayTime(IPage<ProductDto> page, String lat, String lon, String distance);

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

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

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

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

    List<TagProductDto> tagProdList();

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

    IPage<ProductDto> collectionProds(PageParam page, String userId);

    /**
     * 通过商品列表获取商品信息及所有规格属性
     */
    List<ProdAndSkuListsDto> getProdAndSkuLists(List<Long> prodIds);

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

    /**
     * 更新活动商品为拼团活动商品
     */
    void updateProductToUnGroup(Long prodId);


    /**
     * 违规商品提交审核
     */
    void auditApply(Long eventId, Long prodId, String reapplyReason);

    /**
     * 商品审核
     */
    void prodAudit(OfflineHandleEventAuditParam offlineHandleEventAuditParam, Long sysUserId);

    /**
     * 平台下线活动
     */
    void offline(Long prodId, String offlineReason, Long sysUserId);

    IPage<Product> getPageAngShopName(PageParam<Product> page, ProductParam product);


    void exportProd(ProductExportParam productParam, HttpServletResponse response, Long shopId);

    void downloadModel(HttpServletResponse response, Long shopId);

    Object parseFile(MultipartFile excelFile, Long shopId) throws Exception;

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

    /**
     * 根据分类ID查询关联商品
     */
    IPage<Product> listRelatedProducts(ListRelatedProductsDto listRelatedProductsDto);

    /**
     * 取消关联商品
     */
    boolean cancelRelatedProducts(long shopId, long productId);

    /**
     * 关联商品
     */
    boolean relatedProducts(long shopId, List<Long> productId, long shopCategoryId);

    /**
     * 根据商户ID查询未关联商品
     */
    IPage<Product> listUnRelatedProducts(ListUnRelatedProductsDTO listUnRelatedProductsDTO);

    /**
     * 根据分类ID、商户ID查询归属的所有商品
     */
    IPage<CategoryProductParam> listProdByCategoryIdAndShopId(ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO);

    /**
     * 根据商品ID查询相似商品
     */
    IPage<SimilarProdListVo> similarProdList(Page<Product> page, Long prodId, Long shopId, Long channelId,String  userId);
}
