package com.yc.ship.module.product.dal.mysql.productGroup;


import com.yc.ship.framework.common.pojo.PageResult;
import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
import com.yc.ship.module.product.controller.admin.productSpu.groupVO.PlatProductPriceRespVO;
import com.yc.ship.module.product.controller.admin.productSpu.groupVO.PlatProductRespVO;
import com.yc.ship.module.product.controller.admin.productSpu.groupVO.ProductGroupPageReqVO;
import com.yc.ship.module.product.controller.admin.productSpu.groupVO.ProductGroupRespVO;
import com.yc.ship.module.product.dal.dataobject.productGroup.ProductGroupDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 产品组合 Mapper
 *
 * @author 管理员
 */
@Mapper
public interface ProductGroupMapper extends BaseMapperX<ProductGroupDO> {

    default PageResult<ProductGroupDO> selectPage(ProductGroupPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<ProductGroupDO>()
                .eqIfPresent(ProductGroupDO::getProductId, reqVO.getProductId())
                .eqIfPresent(ProductGroupDO::getProductBaseId, reqVO.getProductBaseId())
                .eqIfPresent(ProductGroupDO::getProductBaseType, reqVO.getProductBaseType())
                .eqIfPresent(ProductGroupDO::getSkuId, reqVO.getSkuId())
                .eqIfPresent(ProductGroupDO::getProjectId, reqVO.getProjectId())
                .eqIfPresent(ProductGroupDO::getSpecificationId, reqVO.getSpecificationId())
                .eqIfPresent(ProductGroupDO::getCostPrice, reqVO.getCostPrice())
                .eqIfPresent(ProductGroupDO::getSalePrice, reqVO.getSalePrice())
                .eqIfPresent(ProductGroupDO::getSpecType, reqVO.getSpecType())
                .eqIfPresent(ProductGroupDO::getNeedChoose, reqVO.getNeedChoose())
                .betweenIfPresent(ProductGroupDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(ProductGroupDO::getId));
    }

    /**
     * 查询产品规格
     *
     * @param productId 产品id
     * @return list
     */
    @TenantIgnore
    List<ProductGroupRespVO> selectSpuGroupList(@Param("productId") Long productId, @Param("planId") Long planId);

    @TenantIgnore
    List<ProductGroupRespVO> selectSpuGroupListV2(@Param("productId") Long productId);

    @TenantIgnore
    List<ProductGroupRespVO> selectSpuGroupByPlanIdList(@Param("productId") Long productId,@Param("planId") Long planId);

    /**
     * 查询平台分销产品
     *
     * @param productId 产品id
     * @return list
     */
    @TenantIgnore
    List<PlatProductRespVO> selectPlatProductList(@Param("productId") Long productId);

    /**
     * 查询旅行社id和名称
     *
     * @param tenantId  租户id
     * @param productId 产品id
     * @return map
     */
    @TenantIgnore
    Map<String, Object> selectDistributorProductId(@Param("tenantId") Long tenantId, @Param("productId") Long productId);

    @TenantIgnore
    Map<String, Object> queryAgencyId(@NotNull @Param("userId") Long userId,
                                      @NotNull @Param("tenantId") Long tenantId);

    @TenantIgnore
    List<PlatProductPriceRespVO> selectPlatProductPriceList(@NotNull @Param("agencyId") Long agencyId,
                                                            @NotNull @Param("productId") Long productId);

    @TenantIgnore
    List<PlatProductPriceRespVO> selectPlatProductPriceList2(@NotNull @Param("agencyId") Long agencyId,
                                                             @NotNull @Param("productIds") List<Long> productIds);

    void updateDistributorProductIsUse(@Param("productId") Long productId, @Param("isUse") Integer isUse);

    /**
     * 下架分销产品及旅行社含有该产品的组合产品
     * @param productId 产品id
     * @param salePrice 销售价
     */
    @TenantIgnore
    void updateDistributorProduct(@Param("productId") Long productId, @Param("salePrice") BigDecimal salePrice);

    void updateDistributorPrice(@Param("skuId") Long skuId, @Param("skuIdNew") Long skuIdNew, @Param("salePrice") BigDecimal salePrice);
    void updateDistributorProductId(@Param("skuId") Long skuId, @Param("skuIdNew") Long skuIdNew, @Param("salePrice") BigDecimal salePrice);

    void deletePlatProduct(@Param("productId") Long productId);

}