package com.hzs.ground.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.enums.EDelFlag;
import com.hzs.common.core.service.RedisService;
import com.hzs.common.core.utils.DateUtils;
import com.hzs.common.domain.sale.product.BdProductBas;
import com.hzs.common.domain.sale.product.BdProductBasSpecs;
import com.hzs.common.domain.sale.product.BdProductSpecs;
import com.hzs.common.domain.sale.product.ext.BdProductBasExt;
import com.hzs.ground.product.mapper.BdProductBasMapper;
import com.hzs.ground.product.param.ProductBasParams;
import com.hzs.ground.product.service.IBdProductBasService;
import com.hzs.ground.product.service.IBdProductBasSpecsService;
import com.hzs.ground.product.vo.BdProductBasSpecsVo;
import com.hzs.ground.product.vo.ProductBasVo;
import com.hzs.ground.product.vo.ProductInfoVo;
import com.hzs.ground.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.Date;
import java.util.List;
import java.util.Set;

/**
 * 产品基本设置 服务实现类
 *
 * @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;
    }

    @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);
        productBas.setProductCode(productCode);
        productBas.setPkCreator(loginUser.getUserId());
        productBas.setCreationTime(DateUtils.currentDateTime());
        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(DateUtils.currentDateTime());
                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) {
        //    BdProductBas productBas = productBasService.getOne(new QueryWrapper<BdProductBas>().eq("PRODUCT_CODE", productCode));
        ProductBasVo productBas = productBasService.findByProductCode(productCode);
        ProductInfoVo productInfoVo = new ProductInfoVo();
        if (productBas != null) {
            List<BdProductBasSpecsVo> bdProductBasSpecsVos = productBasSpecsService.queryListByProductBasCode(productBas.getPkId());
            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 ProductBasVo findByProductCode(String productCode) {
        return baseMapper.findByProductCode(productCode);
    }

    @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 productBasParams
     * @return
     */
    @Override
    public List<BdProductBasExt> selectByList(ProductBasParams productBasParams) {
        return baseMapper.selectByList(productBasParams);
    }

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

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

    /**
     * 查询全部
     *
     * @param query
     * @param pkCountry
     * @return
     */
    @Override
    public List<ProductBasVo> queryProductBasAllList(String query, Integer pkCountry) {
        return baseMapper.queryProductBasAllList(query, pkCountry);
    }
}
