
package com.tmerclub.cloud.product.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.tmerclub.cloud.common.constant.Constant;
import com.tmerclub.cloud.common.i18n.LanguageEnum;
import com.tmerclub.cloud.common.product.constant.AttrType;
import com.tmerclub.cloud.common.product.dto.SpuSkuAttrValueDTO;
import com.tmerclub.cloud.common.product.dto.SpuSkuAttrValueLangDTO;
import com.tmerclub.cloud.common.product.vo.AttrLangVO;
import com.tmerclub.cloud.common.product.vo.AttrVO;
import com.tmerclub.cloud.common.product.vo.AttrValueLangVO;
import com.tmerclub.cloud.common.product.vo.AttrValueVO;
import com.tmerclub.cloud.common.security.AuthUserContext;
import com.tmerclub.cloud.common.util.BeanUtil;
import com.tmerclub.cloud.common.util.LangUtil;
import com.tmerclub.cloud.product.mapper.AttrMapper;
import com.tmerclub.cloud.product.mapper.SpuSkuAttrValueLangMapper;
import com.tmerclub.cloud.product.mapper.SpuSkuAttrValueMapper;
import com.tmerclub.cloud.product.model.SpuSkuAttrValue;
import com.tmerclub.cloud.product.model.SpuSkuAttrValueLang;
import com.tmerclub.cloud.product.service.SpuSkuAttrValueService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 商品sku销售属性关联信息
 *
 * @author tmerclub
 * @date 2020-10-28 15:27:24
 */
@Service
public class SpuSkuAttrValueServiceImpl implements SpuSkuAttrValueService {

    @Autowired
    private SpuSkuAttrValueMapper spuSkuAttrValueMapper;
    @Autowired
    private SpuSkuAttrValueLangMapper spuSkuAttrValueLangMapper;
    @Autowired
    private AttrMapper attrMapper;

    @Override
    public void save(List<SpuSkuAttrValueDTO> spuSkuAttrValueList, Integer sysType) {
        if (CollUtil.isEmpty(spuSkuAttrValueList)) {
            return;
        }
        spuSkuAttrValueMapper.batchSave(spuSkuAttrValueList);
        List<SpuSkuAttrValueLang> spuSkuAttrValueLangList = loadSpuSkuAttrValueInfo(spuSkuAttrValueList, sysType);
        spuSkuAttrValueLangMapper.batchSave(spuSkuAttrValueLangList);
    }

    @Override
    public void updateBatch(List<SpuSkuAttrValue> spuSkuAttrValues) {
        if (CollUtil.isNotEmpty(spuSkuAttrValues)) {
            spuSkuAttrValueMapper.updateBatch(spuSkuAttrValues);
        }
    }

    @Override
    public void deleteById(Long spuSkuAttrId) {
        spuSkuAttrValueMapper.deleteById(spuSkuAttrId);
    }

    @Override
    public void updateBySpuId(Long spuId) {
        spuSkuAttrValueMapper.updateBySpuId(spuId);
    }

    @Override
    public void changeStatusBySkuId(List<Long> skuIds, Integer status) {
        spuSkuAttrValueMapper.changeStatusBySkuId(skuIds, status);
    }

    /**
     * 加载销售属性国际化信息
     *
     * @param spuSkuAttrValueList
     * @return 属性国际化信息列表
     */
    private List<SpuSkuAttrValueLang> loadSpuSkuAttrValueInfo(List<SpuSkuAttrValueDTO> spuSkuAttrValueList, Integer sysType) {
        if (Objects.isNull(sysType)) {
            sysType = AuthUserContext.get().getSysType();
        }
        Map<Long, AttrVO> dbAttrMap = null;
        List<SpuSkuAttrValueLang> spuSkuAttrValueLangList = new ArrayList<>(Constant.INITIAL_CAPACITY);
        for (SpuSkuAttrValueDTO spuSkuAttrValueDTO : spuSkuAttrValueList) {
            if (CollUtil.isNotEmpty(spuSkuAttrValueDTO.getSpuSkuAttrValueLangList())) {
                for (SpuSkuAttrValueLangDTO spuSkuAttrValueLangDTO : spuSkuAttrValueDTO.getSpuSkuAttrValueLangList()) {
                    spuSkuAttrValueLangDTO.setSpuSkuAttrId(spuSkuAttrValueDTO.getSpuSkuAttrId());
                }
                spuSkuAttrValueLangList.addAll(BeanUtil.mapAsList(spuSkuAttrValueDTO.getSpuSkuAttrValueLangList(), SpuSkuAttrValueLang.class));
                continue;
            }
            if (Objects.isNull(dbAttrMap)) {
                List<AttrVO> shopAttrs = attrMapper.getAttrsByCategoryIdAndAttrType(AttrType.SALES.value(), null, AuthUserContext.get().getTenantId(), sysType);
                dbAttrMap = shopAttrs.stream().collect(Collectors.toMap(AttrVO::getAttrId, a -> a));
            }
            AttrVO attrVO = dbAttrMap.get(spuSkuAttrValueDTO.getAttrId());
            // 通用
            boolean isShare = (Objects.isNull(spuSkuAttrValueDTO.getAttrId()) || Objects.isNull(spuSkuAttrValueDTO.getAttrValueId()))
                    || Objects.isNull(attrVO);
            if (isShare) {
                SpuSkuAttrValueLang spuSkuAttrValueLang = new SpuSkuAttrValueLang();
                spuSkuAttrValueLang.setSpuSkuAttrId(spuSkuAttrValueDTO.getSpuSkuAttrId());
                spuSkuAttrValueLang.setLang(LanguageEnum.LANGUAGE_ZH_CN.getLang());
                spuSkuAttrValueLang.setAttrName(spuSkuAttrValueDTO.getAttrName());
                spuSkuAttrValueLang.setAttrValueName(spuSkuAttrValueDTO.getAttrValueName());
                spuSkuAttrValueLangList.add(spuSkuAttrValueLang);
                continue;
            }

            Map<Integer, String> attrNameMap = attrVO.getAttrLangList().stream().collect(Collectors.toMap(AttrLangVO::getLang, AttrLangVO::getName));
            Map<Integer, String> attrValueMap = new HashMap<>(0);
            for (AttrValueVO attrValue : attrVO.getAttrValues()) {
                if (!Objects.equals(attrValue.getAttrValueId(), spuSkuAttrValueDTO.getAttrValueId())) {
                    continue;
                }
                attrValueMap = attrValue.getValues().stream().collect(Collectors.toMap(AttrValueLangVO::getLang, AttrValueLangVO::getValue));
            }
            for (LanguageEnum languageEnum : LanguageEnum.values()) {
                Integer lang = languageEnum.getLang();
                if (!attrNameMap.containsKey(lang) && !attrValueMap.containsKey(lang)) {
                    continue;
                }
                SpuSkuAttrValueLang spuSkuAttrValueLang = new SpuSkuAttrValueLang();

                spuSkuAttrValueLang.setSpuSkuAttrId(spuSkuAttrValueDTO.getSpuSkuAttrId());
                spuSkuAttrValueLang.setLang(languageEnum.getLang());
                spuSkuAttrValueLang.setAttrName(LangUtil.getLangValue(attrNameMap, lang));
                spuSkuAttrValueLang.setAttrValueName(LangUtil.getLangValue(attrValueMap, lang));
                spuSkuAttrValueLangList.add(spuSkuAttrValueLang);
            }
        }
        return spuSkuAttrValueLangList;
    }

    @Override
    public void commissionSave(List<SpuSkuAttrValueDTO> spuSkuAttrValueList, Integer sysType) {
        if (CollUtil.isEmpty(spuSkuAttrValueList)) {
            return;
        }
        spuSkuAttrValueMapper.batchSave(spuSkuAttrValueList);
        List<SpuSkuAttrValueLang> spuSkuAttrValueLangList = loadSpuSkuAttrValueInfo(spuSkuAttrValueList, sysType);
        spuSkuAttrValueLangMapper.batchSave(spuSkuAttrValueLangList);
    }
}
