
package com.tmerclub.cloud.product.feign;

import com.tmerclub.cloud.api.product.feign.SkuFeignClient;
import com.tmerclub.cloud.api.product.util.ProductLangUtil;
import com.tmerclub.cloud.common.cache.constant.ProductCacheNames;
import com.tmerclub.cloud.common.cache.util.RedisUtil;
import com.tmerclub.cloud.common.product.dto.SkuDTO;
import com.tmerclub.cloud.common.product.vo.SkuAddrVO;
import com.tmerclub.cloud.common.product.vo.SkuVO;
import com.tmerclub.cloud.common.product.vo.SpuVO;
import com.tmerclub.cloud.common.product.vo.app.SkuAppVO;
import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO;
import com.tmerclub.cloud.common.response.ServerResponseEntity;
import com.tmerclub.cloud.common.util.BeanUtil;
import com.tmerclub.cloud.product.service.SkuService;
import com.tmerclub.cloud.product.service.SpuService;
import com.tmerclub.cloud.product.service.SupplierSpuUpdateLaterOperateService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.Objects;

/**
 * @author tmerclub
 * @date 2020/12/8
 */
@DubboService
public class SkuFeignController implements SkuFeignClient {

    @Autowired
    private SkuService skuService;

    @Autowired
    private SpuService spuService;

    @Autowired
    private SupplierSpuUpdateLaterOperateService supplierSpuUpdateLaterOperateService;


    @Override
    public ServerResponseEntity<SkuVO> getById(Long skuId) {
        return ServerResponseEntity.success(skuService.getSkuBySkuId(skuId));
    }

    @Override
    public ServerResponseEntity<List<SkuAppVO>> listBySpuId(Long spuId) {

        SpuVO spuDb = spuService.getBySpuId(spuId);
        SpuVO spuVO = BeanUtil.map(spuDb, SpuVO.class);
        List<SkuAppVO> skuList = skuService.getSpuDetailSkuInfo(spuVO);
        return ServerResponseEntity.success(skuList);
    }

    @Override
    public List<SkuVO> listBySpuIds(List<Long> spuIds) {
        return skuService.listBySpuIds(spuIds);
    }

    @Override
    public ServerResponseEntity<List<SkuVO>> listSupplierBySpuIds(List<Long> spuIds, Long shopId) {
        return ServerResponseEntity.success(skuService.listSupplierBySpuIds(spuIds, shopId));
    }

    @Override
    public ServerResponseEntity<List<SkuAddrVO>> listSpuDetailByIds(List<Long> skuIds) {
        return ServerResponseEntity.success(skuService.listSpuDetailByIds(skuIds));
    }

    @Override
    public ServerResponseEntity<Long> getMinPriceFeeByIds(List<Long> skuIds) {
        return ServerResponseEntity.success(skuService.getMinPriceFeeByIds(skuIds));
    }


    @Override
    public ServerResponseEntity<List<SkuVO>> getByIds(List<Long> skuIds) {
        return ServerResponseEntity.success(skuService.getByIds(skuIds));
    }

    @Override
    public ServerResponseEntity<List<SpuAdminVO>> setSpuSku(List<SpuAdminVO> spuAdminVOList) {
        return ServerResponseEntity.success(skuService.setSpuSku(spuAdminVOList));
    }

    @Override
    public void processSkuUpdate(SkuVO beforeData, SkuVO afterData) {
        //判断是否修改sku售价,当供应商修改sku售价时，商家代代销设置了手动（当供货价高于售价时自动下架商品sku）时，
        if (!Objects.isNull(afterData.getPriceFee()) && Objects.isNull(beforeData.getStatus())) {
            //当代销商品sku售价低于供货价时下架代销商品
            spuService.soldOutSpu(afterData.getSkuId(), afterData.getPriceFee());
        }
        //供应商体积或重量发生变化，供应商商品是商家发货，下架商家商品
        if (!Objects.isNull(beforeData.getWeight()) || !Objects.isNull(beforeData.getVolume())) {
            supplierSpuUpdateLaterOperateService.skuWeightOrVolumeUpdateOperate(afterData.getSpuId());
        }
        //供应商市场价变更后同步变更代销商品市场价
        if (!Objects.isNull(afterData.getMarketPriceFee())) {
            supplierSpuUpdateLaterOperateService.synMarketPrice(afterData.getSkuId(), afterData.getMarketPriceFee());
        }
//        if (Objects.nonNull(beforeData.getStatus())) {
//            //sku启用
//            RedisUtil.set(ProductCacheNames.SKU_STATUS_ENABLE + afterData.getSpuId(), 1, -1);
//            supplierSpuUpdateLaterOperateService.changeSynUpdate(afterData.getSpuId());
//        }
        if (Objects.nonNull(beforeData.getStatus())) {
            SpuVO spuVO = spuService.getBySpuId(afterData.getSpuId());
            if (Objects.equals(afterData.getStatus(), 1)) {
                //sku启用
                RedisUtil.set(ProductCacheNames.SKU_STATUS_ENABLE + afterData.getSpuId(), 1, 3600);
                supplierSpuUpdateLaterOperateService.changeSynUpdate(afterData.getSpuId());
            } else if (Objects.equals(beforeData.getStatus(), 1)) {
                //sku禁用
                RedisUtil.set(ProductCacheNames.SKU_STATUS_DISABLE + afterData.getSpuId(), 1, 3600);
                supplierSpuUpdateLaterOperateService.changeSynUpdate(afterData.getSpuId());
            }
            skuService.changeSkuStockStatusBySkuId(afterData.getSkuId(), spuVO.getStatus(), afterData.getStatus());
        }
    }

    @Override
    public SkuVO getSkuAndNameById(long skuId) {
        SkuVO sku = skuService.getSkuBySkuId(skuId);
        ProductLangUtil.sku(sku);
        return sku;
    }

    @Override
    public List<SkuVO> listBySkuIds(List<Long> skuIds) {
        return skuService.getByIds(skuIds);
    }

    @Override
    public List<SkuVO> listByPartyCodes(List<String> partyCodes) {
        SkuDTO skuDTO = new SkuDTO();
        skuDTO.setPartyCodes(partyCodes);
        return skuService.listSku(skuDTO);
    }

    @Override
    public List<SkuVO> listShopSaleSku(List<Long> supplierSkuIds, Long shopId) {
        SkuDTO skuDTO = new SkuDTO();
        skuDTO.setSupplierSkuIds(supplierSkuIds);
        skuDTO.setShopId(shopId);
        return skuService.listSku(skuDTO);
    }
}
