
package com.tmerclub.cloud.api.product.manager;

import com.tmerclub.cloud.api.product.feign.ShopCartFeignClient;
import com.tmerclub.cloud.common.constant.Constant;
import com.tmerclub.cloud.common.order.dto.DvyTypeDTO;
import com.tmerclub.cloud.common.order.dto.ShopCartItemDTO;
import com.tmerclub.cloud.common.order.vo.ShopCartItemVO;
import com.tmerclub.cloud.common.product.constant.SpuMold;
import com.tmerclub.cloud.common.product.dto.CartComboMatchSpuDTO;
import com.tmerclub.cloud.common.util.Arith;
import com.tmerclub.cloud.common.util.PriceUtil;
import org.apache.dubbo.config.annotation.DubboReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * 购物车适配器
 *
 * @author tmerclub
 * @date 2020/12/07
 */
@Component
public class ShopCartItemAdapter {


    private final Logger LOGGER = LoggerFactory.getLogger(ShopCartItemAdapter.class);
    @DubboReference
    private ShopCartFeignClient shopCartFeignClient;


    /**
     * 获取购物项组装信息
     *
     * @param shopCartItemParam 购物项参数
     * @return 购物项组装信息
     */
    public List<ShopCartItemVO> getShopCartItems(ShopCartItemDTO shopCartItemParam, Long userId, Long addrId, List<DvyTypeDTO> dvyTypes) {
        // 组装订单项，根据购物车或者立即购买， 分别组装订单项，购物车要查询一次数据库 shop_cart_item
        List<ShopCartItemVO> shopCartItems;
        // 当立即购买时，没有提交的订单是没有购物车信息的
        if (Objects.nonNull(shopCartItemParam)) {
            shopCartItems = new ArrayList<>(Constant.INITIAL_CAPACITY);
            if (Objects.nonNull(shopCartItemParam.getComboId())) {
                LOGGER.info("立即购买-套餐商品");
                // ==================== 套餐主商品 ====================
                Integer mainCount = shopCartItemParam.getCount() * shopCartItemParam.getComboMainLeastNum();
                ShopCartItemVO mainShopCartItem = new ShopCartItemVO(userId, shopCartItemParam.getSpuId(), shopCartItemParam.getSkuId(), mainCount);
                shopCartItems.add(mainShopCartItem);
                // ==================== 套餐搭配商品 ====================
                // 搭配商品列表
                for (CartComboMatchSpuDTO cartComboMatchSpu : shopCartItemParam.getCartComboMatchSpuDTOS()) {
                    ShopCartItemVO matchShopCartItem = new ShopCartItemVO(userId, cartComboMatchSpu.getSpuId(), cartComboMatchSpu.getSkuId(), cartComboMatchSpu.getCount());
                    shopCartItems.add(matchShopCartItem);
                }
                for (ShopCartItemVO shopCartItem : shopCartItems) {
                    shopCartItem.setComboId(shopCartItemParam.getComboId());
                    shopCartItem.setComboCount(shopCartItem.getCount());
                }
            }
            // 非套餐商品
            else {
                LOGGER.info("立即购买-商品");
                // 立即购买只有一件商品
                ShopCartItemVO shopCartItemVO = new ShopCartItemVO(userId, shopCartItemParam.getSpuId(), shopCartItemParam.getSkuId(), shopCartItemParam.getCount());
                shopCartItems.add(shopCartItemVO);
            }
            // 分销员id
            for (ShopCartItemVO shopCartItem : shopCartItems) {
                shopCartItem.setDistributionUserId(shopCartItemParam.getDistributionUserId());
            }
            // 组装订单项数据
            shopCartItems = shopCartFeignClient.handleShopCartItem(shopCartItems, dvyTypes, null);
        }
        // 从购物车提交订单
        else {
            // 查询购物车信息
            LOGGER.info("从购物车提交订单,处理购物车信息");
            shopCartItems = shopCartFeignClient.getCheckedShopCartItems(addrId, dvyTypes);
        }
        return shopCartItems;
    }


    /**
     * 将参数转换成组装好的购物项
     *
     * @param shopCartItemParam 购物项参数
     * @param activityPriceFee  活动价
     * @param userId            用户id
     * @return 组装好的购物项
     */
    public List<ShopCartItemVO> conversionShopCartItem(ShopCartItemDTO shopCartItemParam, Long activityPriceFee, Long userId, List<DvyTypeDTO> dvyTypes) {
        ShopCartItemVO shopCartItem = new ShopCartItemVO(userId, shopCartItemParam.getSpuId(), shopCartItemParam.getSkuId(), shopCartItemParam.getCount());
        List<ShopCartItemVO> shopCartItemList = shopCartFeignClient.handleShopCartItem(Collections.singletonList(shopCartItem), dvyTypes, null);
        shopCartItem = shopCartItemList.get(0);

        // 如果活动价大于0则使用活动价格
        if (activityPriceFee == null || activityPriceFee < 1L) {
            return shopCartItemList;
        }
        // 如果是组合商品,需要重新计算一下所有组合的商品
        if(Objects.equals(shopCartItem.getMold(), SpuMold.COMBO.value())){
            Long totalShareReduce = (shopCartItem.getSkuPriceFee() - activityPriceFee) * shopCartItem.getCount();
            long totalSkuPriceFee = 0L;
            for (int i = 0; i < shopCartItem.getComboShopCartItems().size(); i++) {
                ShopCartItemVO comboShopCartItemVO = shopCartItem.getComboShopCartItems().get(i);
                long comboItemShareReduce;
                if (shopCartItem.getComboShopCartItems().size() - 1 == i) {
                    comboItemShareReduce = totalShareReduce - totalSkuPriceFee;
                } else {
                    comboItemShareReduce = PriceUtil.divideByBankerRounding((long) Arith.mul(totalShareReduce, comboShopCartItemVO.getTotalAmount()), shopCartItem.getTotalAmount());
                }
                // 商品实际金额,优惠金额放入店铺金额
                //            comboShopCartItemVO.setSkuPriceFee(activityPriceFee);
                comboShopCartItemVO.setActualTotal(comboShopCartItemVO.getActualTotal() - comboItemShareReduce);
                comboShopCartItemVO.setShareReduce(comboItemShareReduce);
                LOGGER.info("组合商品使用活动价格");
                totalSkuPriceFee += comboItemShareReduce;
            }
        }
        // 商品实际金额,优惠金额放入店铺金额
        shopCartItem.setSkuPriceFee(activityPriceFee);
        shopCartItem.setActualTotal(shopCartItem.getCount() * activityPriceFee);
        long shareReduce = shopCartItem.getTotalAmount() - shopCartItem.getActualTotal() < 0 ? 0 : shopCartItem.getTotalAmount() - shopCartItem.getActualTotal();
        shopCartItem.setShareReduce(shareReduce);
        LOGGER.info("活动价大于0则使用活动价格");
        return shopCartItemList;
    }
}
