package com.hzs.scm.product.service.impl;


import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hzs.common.core.constant.CacheConstants;
import com.hzs.common.core.domain.R;
import com.hzs.common.core.enums.EDelFlag;
import com.hzs.common.core.enums.ETransactionKey;
import com.hzs.common.core.enums.EUnit;
import com.hzs.common.core.enums.EYesNo;
import com.hzs.common.core.service.RedisService;
import com.hzs.common.domain.sale.product.*;
import com.hzs.common.domain.sale.product.ext.BdProductBasExt;
import com.hzs.scm.product.mapper.BdProductBasMapper;
import com.hzs.scm.product.param.ProductBasParams;
import com.hzs.scm.product.service.IBdProductBasService;
import com.hzs.scm.product.service.IBdProductBasSpecsService;
import com.hzs.scm.product.vo.BdProductBasSpecsVo;
import com.hzs.scm.product.vo.ProductBasVo;
import com.hzs.scm.product.vo.ProductInfoVo;
import com.hzs.scm.product.vo.SpecsVo;
import com.hzs.system.sys.dto.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * <p>
 * 产品基本设置 服务实现类
 * </p>
 *
 * @author hzsf
 * @since 2023-11-21
 */
@Service
public class BdProductBasServiceImpl extends ServiceImpl<BdProductBasMapper, BdProductBas> implements IBdProductBasService {
    @Autowired
    private IBdProductBasService productBasService;
    @Autowired
    private IBdProductBasSpecsService productBasSpecsService;
    @Autowired
    private RedisService redisService;
    /**
     * 根据id查询
     * @param productBasId
     * @return
     */
    @Override
    public BdProductBas getProductBasById(Integer productBasId) {
        BdProductBas bdProductBas = redisService.getCacheObject(CacheConstants.BD_PRODUCT_BAS + productBasId);
        if (bdProductBas == null) {
            bdProductBas = baseMapper.selectById(productBasId);
            if (bdProductBas != null) {
                redisService.setCacheObject(CacheConstants.BD_PRODUCT_BAS + bdProductBas.getPkId(), bdProductBas);
            }
        }
        return bdProductBas;
    }
    /**
     * 根据产品编号 查询
     * @return
     */
    @Override
    public BdProductBas getProductBasByProductCode(String productCode) {
        BdProductBas bdProductBas = redisService.getCacheObject(CacheConstants.BD_PRODUCT_BAS + productCode);
        if (bdProductBas == null) {
            bdProductBas = baseMapper.selectOne(new QueryWrapper<BdProductBas>().eq("PRODUCT_CODE",productCode));
            if (bdProductBas != null) {
                redisService.setCacheObject(CacheConstants.BD_PRODUCT_BAS + productCode, bdProductBas);
            }
        }
        return bdProductBas;
    }

    @Override
    public List<BdProductBasExt> queryProductBasByIds(Set<Integer> idList, Integer pkCountry) {
        return baseMapper.queryProductBasByIds(idList, pkCountry);
    }
    /**
     * 新增
     * @param productBasParams
     * @return
     */
    @Override
    public String saveProductBas(ProductBasParams productBasParams, LoginUser loginUser) {
        String productCode = productBasParams.getProductCode();
        BdProductBas productBas = BeanUtil.copyProperties(productBasParams, BdProductBas.class);
   //     R<Integer> transaction = transactionServiceApi.createTransaction(loginUser.getDataCountry(), ETransactionKey.PRODUCT, productParams.getProductName(), EYesNo.NO, EYesNo.NO);
        productBas.setProductCode(productCode);
        productBas.setPkCreator(loginUser.getUserId());
        productBas.setCreationTime(new Date());
        productBas.setPkCreator(loginUser.getUserId());
        productBas.setPkCountry(loginUser.getDataCountry());
        // 删除状态 审核完毕 修改为未删除状态
        productBas.setDelFlag(EDelFlag.UN_DELETE.getValue());
        productBasService.save(productBas);
        // 生成规格明细
        if (productBasParams.getPkSpecsType() != null) {
            //   List<BdProductSpecs> productSpecsList = new ArrayList<>();
            for (Integer id : productBasParams.getPkSpecsType()) {
                BdProductBasSpecs productBasSpecs = new BdProductBasSpecs();
                productBasSpecs.setPkProductBas(productBas.getPkId());
                productBasSpecs.setPkSpecsType(id);
                productBasSpecs.setPkCountry(loginUser.getDataCountry());
                productBasSpecs.setPkCreator(loginUser.getUserId());
                productBasSpecs.setCreationTime(new Date());
                productBasSpecsService.save(productBasSpecs);
            }
        }
        return productCode;
    }
    /**
     * 修改
     * @param productBasParams
     * @param loginUser
     */
    @Override
    public void updateProductBas(ProductBasParams productBasParams, LoginUser loginUser) {
        BdProductBas productBas = BeanUtil.copyProperties(productBasParams, BdProductBas.class);
        productBas.setPkId(productBasParams.getPkId());
        productBas.setPkModified(loginUser.getUserId());
        productBas.setModifiedTime(new Date());
        productBasService.updateById(productBas);
        // 生成规格明细
        if (productBasParams.getPkSpecsType() != null) {
            QueryWrapper<BdProductBasSpecs> removeWrapper = new QueryWrapper<>();
            removeWrapper.eq("PK_PRODUCT_BAS", productBasParams.getPkId());
            productBasSpecsService.remove(removeWrapper);
            for (Integer id : productBasParams.getPkSpecsType()) {
                BdProductBasSpecs productBasSpecs = new BdProductBasSpecs();
                productBasSpecs.setPkProductBas(productBasParams.getPkId());
                productBasSpecs.setPkSpecsType(id);
                productBasSpecs.setPkCountry(loginUser.getDataCountry());
                productBasSpecs.setPkCreator(loginUser.getUserId());
                productBasSpecs.setCreationTime(new Date());
                productBasSpecsService.save(productBasSpecs);
            }
        }
    }
    /**
     * 删除
     * @param productBasId
     */
    @Override
    public void removeProductBas(Integer productBasId) {
        productBasService.removeById(productBasId);
        productBasSpecsService.remove(new QueryWrapper<BdProductBasSpecs>().eq("PK_PRODUCT_BAS",productBasId));
    }
    /**
     * 根据产品编号查询信息
     * @param productCode
     */
    @Override
    public ProductInfoVo getByProductCodeInfo(String productCode, Integer pkCountry) {
    //    BdProductBas productBas = productBasService.getOne(new QueryWrapper<BdProductBas>().eq("PRODUCT_CODE", productCode));
        List<ProductBasVo> productBasVoList = productBasService.findByProductCode(productCode, pkCountry);
        ProductInfoVo productInfoVo = new ProductInfoVo();
        Map<Integer, BdProductBasSpecsVo> productBasSpecsVoMap = new HashMap<>();
        for (ProductBasVo productBasVo : productBasVoList) {
            productInfoVo.setPkId(productBasVo.getPkId());
            productInfoVo.setProductCode(productBasVo.getProductCode());
            productInfoVo.setProductName(productBasVo.getProductName());
            // 单位
            productInfoVo.setUnit(productBasVo.getUnit());
            productInfoVo.setUnitStr(productBasVo.getUnitStr());
            for (BdProductBasSpecsVo bdProductBasSpecsVo : productBasVo.getProductBasSpecsVoList()) {
                if(productBasSpecsVoMap.containsKey(bdProductBasSpecsVo.getPkSpecsType())){
                    BdProductBasSpecsVo productBasSpecsVo = productBasSpecsVoMap.get(bdProductBasSpecsVo.getPkSpecsType());
                    List<SpecsVo> specsList = productBasSpecsVo.getSpecsList();
                    SpecsVo specsVo = new SpecsVo();
                    specsVo.setPkSpecs(bdProductBasSpecsVo.getPkSpecs());
                    specsVo.setName(bdProductBasSpecsVo.getName());
                    specsList.add(specsVo);
                }else{
                    BdProductBasSpecsVo productBasSpecsVo = new BdProductBasSpecsVo();
                    productBasSpecsVo.setPkId(productBasVo.getPkId());
                    productBasSpecsVo.setPkProductBas(productBasVo.getPkId());
                    productBasSpecsVo.setPkSpecsType(bdProductBasSpecsVo.getPkSpecsType());
                    productBasSpecsVo.setSpecsTypeName(bdProductBasSpecsVo.getSpecsTypeName());
                    List<SpecsVo> specsList = new ArrayList<>();
                    SpecsVo specsVo = new SpecsVo();
                    specsVo.setPkSpecs(bdProductBasSpecsVo.getPkSpecs());
                    specsVo.setName(bdProductBasSpecsVo.getName());
                    specsList.add(specsVo);
                    productBasSpecsVo.setSpecsList(specsList);
                    productBasSpecsVoMap.put(bdProductBasSpecsVo.getPkSpecsType(), productBasSpecsVo);

                }
            }
        }
        List<BdProductBasSpecsVo> productBasSpecsVoList = new ArrayList<>();
        for (Integer key : productBasSpecsVoMap.keySet()) {
            productBasSpecsVoList.add(productBasSpecsVoMap.get(key));
        }
        productInfoVo.setProductBasSpecsList(productBasSpecsVoList);
//        if (productBas != null){
//            List<BdProductBasSpecsVo> bdProductBasSpecsVos = productBasSpecsService.queryListByProductBasCode(productBas.getPkId(), pkCountry);
//            for (BdProductBasSpecsVo bdProductBasSpecsVo : bdProductBasSpecsVos) {
//                List<SpecsVo> specsList = productBasSpecsService.findByPkSpecsType(bdProductBasSpecsVo.getPkSpecsType());
//                bdProductBasSpecsVo.setSpecsList(specsList);
//            }
//            productInfoVo.setProductBasSpecsList(bdProductBasSpecsVos);
//            productInfoVo.setPkId(productBas.getPkId());
//            productInfoVo.setProductCode(productBas.getProductCode());
//            productInfoVo.setProductName(productBas.getProductName());
//            // 单位
//            productInfoVo.setUnit(productBas.getUnit());
//            productInfoVo.setUnitStr(productBas.getUnitStr());
//        }
        return productInfoVo;
    }
    /**
     * 查询列表
     * @param query
     * @return
     */
    @Override
    public List<ProductBasVo> queryProductBasList(String query, Integer pkCountry,Integer pkCubasdoc) {
        return baseMapper.queryProductBasList( query,  pkCountry, pkCubasdoc);
    }

    /**
     * 根据产品编号查询
     * @param productCode
     * @return
     */
    @Override
    public List<ProductBasVo> findByProductCode(String productCode, Integer pkCountry) {
        return baseMapper.findByProductCode(productCode, pkCountry);
    }

    @Override
    public List<BdProductBasExt> queryProductExtBySpecsId(List<BdProductSpecs> productSpecsList, Integer pkCountry) {
        return baseMapper.queryProductExtBySpecsId(productSpecsList, pkCountry);
    }
    /**
     * 查询全部关联商品
     * @param
     * @return
     */
    @Override
    public List<ProductBasVo> queryProductBasRelevanceList(String query,Integer pkCountry) {
        return baseMapper.queryProductBasRelevanceList(query,pkCountry);
    }

    /**
     * 根据供应商查询产品基本信息
     * @param pkSupplier
     * @return
     */
    @Override
    public List<BdProductBas> selectbypkSupplierList(Integer pkSupplier) {
        return baseMapper.selectbypkSupplierList(pkSupplier);
    }

    /**
     * 查询无供应商的产品基本信息
     * @return
     */
    @Override
    public List<BdProductBas> selectbyNotSupplierList(String query) {
        return baseMapper.selectbyNotSupplierList(query);
    }

    @Override
    public List<ProductBasVo> queryProductBasAllList(String query, Integer pkCountry) {
        return baseMapper.queryProductBasAllList(query,pkCountry);
    }
}
