package com.yiqi.core.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yiqi.common.core.domain.entity.SysUser;
import com.yiqi.common.enums.DeleteStatus;
import com.yiqi.common.enums.SourceType;
import com.yiqi.common.enums.StatusType;
import com.yiqi.common.utils.DateUtils;
import com.yiqi.common.utils.SecurityUtils;
import com.yiqi.core.domain.GoodsInfo;
import com.yiqi.core.domain.GoodsSku;
import com.yiqi.core.domain.GoodsSkuSpec;
import com.yiqi.core.domain.GoodsSkuStore;
import com.yiqi.core.domain.dto.GoodsSkuDTO;
import com.yiqi.core.domain.vo.GoodsSkuAddVO;
import com.yiqi.core.domain.vo.GoodsSkuQueryVO;
import com.yiqi.core.mapper.GoodsSkuMapper;
import com.yiqi.core.mapper.GoodsSkuSpecMapper;
import com.yiqi.core.mapper.GoodsSkuStoreMapper;
import com.yiqi.core.service.IGoodsInfoService;
import com.yiqi.core.service.IGoodsSkuService;
import com.yiqi.core.service.IGoodsSkuSpecService;
import com.yiqi.core.service.IGoodsSkuStoreService;
import com.yiqi.order.domain.dto.RetailQueryGoodsDTO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 物料明细Service业务层处理
 *
 * @author ruoyi
 * @date 2023-08-21
 */
@Service
public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> implements IGoodsSkuService {
    @Autowired
    IGoodsSkuSpecService goodsSkuSpecService;
    @Autowired
    GoodsSkuSpecMapper goodsSkuSpecMapper;

    @Autowired
    IGoodsSkuStoreService goodsSkuStoreService;

    @Autowired
    GoodsSkuStoreMapper goodsSkuStoreMapper;

    @Autowired
    IGoodsInfoService goodsInfoService;

    /**
     * 查询物料明细
     *
     * @param id 物料明细主键
     * @return 物料明细
     */
    @Override
    public GoodsSkuQueryVO selectGoodsSkuById(Long id) {
        SysUser user = SecurityUtils.getLoginUser().getUser();
        List<GoodsSkuQueryVO> SkuQueryVOS = null;

        // 总部
        if ("00".equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setGoodsSkuId(id);
            SkuQueryVOS = baseMapper.selectGoodsSkuInfoByHq(goodsSkuDTO);
        }
        // 工厂
        if ("01".equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setTargetId(user.getFactoryId());
            goodsSkuDTO.setGoodsSkuId(id);
            SkuQueryVOS = baseMapper.selectGoodsSkuInfoByFactory(goodsSkuDTO);
        }
        // 门店
        if ("02".equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setTargetId(user.getStoreId());
            goodsSkuDTO.setFactoryId(user.getFactoryId());
            goodsSkuDTO.setGoodsSkuId(id);
            SkuQueryVOS = baseMapper.selectGoodsSkuInfoByStore(goodsSkuDTO);
        }

        List<GoodsSkuSpec> skuStoreList = goodsSkuSpecMapper.selectList(
                new QueryWrapper<GoodsSkuSpec>().lambda()
                        .eq(GoodsSkuSpec::getGoodsSkuId, id)
                        .eq(GoodsSkuSpec::getDelFlag, DeleteStatus.OK.getCode()));

        if (CollUtil.isEmpty(SkuQueryVOS)) {
            return new GoodsSkuQueryVO();
        }
        GoodsSkuQueryVO goodsSkuQueryVO = SkuQueryVOS.get(0);
        goodsSkuQueryVO.setSpecVoList(skuStoreList);
        return goodsSkuQueryVO;
    }

    /**
     * 查询物料明细列表
     *
     * @param goodsSku 物料明细
     * @return 物料明细
     */
    @Override
    public List<GoodsSkuQueryVO> selectGoodsSkuList(GoodsSku goodsSku) {
        List<GoodsSkuQueryVO> SkuQueryVOS = null;
        SysUser user = SecurityUtils.getLoginUser().getUser();
        // 总部
        if (SourceType.MANAGER.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setGoodsId(goodsSku.getGoodsId());
            SkuQueryVOS = baseMapper.selectGoodsSkuInfoByHq(goodsSkuDTO);
        }
        // 工厂
        if (SourceType.FACTORY.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setTargetId(user.getFactoryId());
            goodsSkuDTO.setGoodsId(goodsSku.getGoodsId());
            SkuQueryVOS = baseMapper.selectGoodsSkuInfoByFactory(goodsSkuDTO);
        }
        // 门店
        if (SourceType.STORE.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setTargetId(user.getStoreId());
            goodsSkuDTO.setFactoryId(user.getFactoryId());
            goodsSkuDTO.setGoodsId(goodsSku.getGoodsId());
            SkuQueryVOS = baseMapper.selectGoodsSkuInfoByStore(goodsSkuDTO);
        }
        if (CollUtil.isEmpty(SkuQueryVOS)) {
            return SkuQueryVOS;
        }
        Set<Long> collect = SkuQueryVOS.stream().map(GoodsSkuQueryVO::getId).collect(Collectors.toSet());
        List<GoodsSkuSpec> skuStoreList = goodsSkuSpecMapper.selectList(
                new QueryWrapper<GoodsSkuSpec>().lambda()
                        .in(GoodsSkuSpec::getGoodsSkuId, collect)
                        .eq(GoodsSkuSpec::getDelFlag, DeleteStatus.OK.getCode()));
        if (CollUtil.isNotEmpty(skuStoreList)) {
            Map<Long, List<GoodsSkuSpec>> map = skuStoreList.stream().collect(Collectors.groupingBy(GoodsSkuSpec::getGoodsSkuId));
            SkuQueryVOS.forEach(sku -> {
                sku.setSpecVoList(map.get(sku.getId()));
            });
        }
        return SkuQueryVOS;
    }

    /**
     * 新增物料明细
     *
     * @param goodsSkuAddVO 物料明细
     * @return 结果
     */
    @Override
    public int insertGoodsSku(GoodsSkuAddVO goodsSkuAddVO) {
        if (goodsSkuAddVO == null) {
            return 0;
        }
        // 存入物料表
        GoodsSku goodsSku = this.insertSku(goodsSkuAddVO);
        // 存入物料规格关联表
        this.insertSpecBySku(goodsSkuAddVO, goodsSku);
        // 存入物料门店关联表
        this.insertSkuStore(goodsSkuAddVO, goodsSku);

        return 1;
    }

    public void insertSkuStore(GoodsSkuAddVO goodsSkuAddVO, GoodsSku goodsSku) {
        // 新增总部物料关系
        GoodsSkuStore hq = new GoodsSkuStore();
        hq.setGoodsSkuId(goodsSku.getId());
        hq.setSourceType(SourceType.MANAGER.getCode());
        hq.setCreateBy(goodsSkuAddVO.getCreateBy());
        hq.setCreateById(goodsSkuAddVO.getCreateById());
        hq.setCreateTime(DateUtils.getNowDate());
        hq.setStatus("0");
        hq.setStock(goodsSkuAddVO.getStock());
        hq.setSalePrice(goodsSkuAddVO.getSalePrice());
        hq.setWholesalePrice(goodsSkuAddVO.getWholesalePrice());
        hq.setPurchasePrice(goodsSkuAddVO.getPurchasePrice());
        goodsSkuStoreMapper.insertGoodsSkuStore(hq);

        // 新增工厂物料关系
        GoodsSkuStore factory = new GoodsSkuStore();
        factory.setGoodsSkuId(goodsSku.getId());
        factory.setCreateBy(goodsSkuAddVO.getCreateBy());
        factory.setCreateById(goodsSkuAddVO.getCreateById());
        factory.setCreateTime(DateUtils.getNowDate());
        factory.setStatus("0");
        factory.setStock(0);
        goodsSkuStoreService.insertSkuToAllFactory(factory);

        // 新增门店物料关系
        GoodsSkuStore store = new GoodsSkuStore();
        store.setGoodsSkuId(goodsSku.getId());
        store.setCreateBy(goodsSkuAddVO.getCreateBy());
        store.setCreateById(goodsSkuAddVO.getCreateById());
        store.setCreateTime(DateUtils.getNowDate());
        store.setStatus("0");
        store.setStock(0);
        goodsSkuStoreService.insertSkuToAllStore(store);
    }


    public GoodsSku insertSku(GoodsSkuAddVO goodsSkuAddVO) {
        GoodsSku goodsSku = new GoodsSku();
        goodsSku.setGoodsId(goodsSkuAddVO.getGoodsId());
        goodsSku.setSourceType(SourceType.MANAGER.getCode());
        goodsSku.setCreateBy(goodsSkuAddVO.getCreateBy());
        goodsSku.setCreateById(goodsSkuAddVO.getCreateById());
        goodsSku.setCreateTime(DateUtils.getNowDate());
        goodsSku.setStatus("0");
        goodsSku.setDelFlag("0");
        baseMapper.insertGoodsSku(goodsSku);
        return goodsSku;
    }

    public void insertSpecBySku(GoodsSkuAddVO goodsSkuAddVO, GoodsSku goodsSku) {
        goodsSkuAddVO.getSpecVoList().forEach(spec -> {
            GoodsSkuSpec goodsSkuSpec = new GoodsSkuSpec();
            goodsSkuSpec.setSpecName(spec.getSpecName());
            goodsSkuSpec.setSpecValue(spec.getSpecValue());
            goodsSkuSpec.setGoodsSkuId(goodsSku.getId());
            goodsSkuSpec.setCreateById(goodsSku.getCreateById());
            goodsSkuSpec.setCreateTime(goodsSku.getCreateTime());
            goodsSkuSpec.setCreateBy(goodsSku.getCreateBy());
            goodsSkuSpec.setUpdateById(goodsSku.getUpdateById());
            goodsSkuSpec.setUpdateTime(DateUtils.getNowDate());
            goodsSkuSpec.setUpdateBy(goodsSku.getUpdateBy());
            goodsSkuSpec.setDelFlag("0");
            goodsSkuSpecMapper.insertGoodsSkuSpec(goodsSkuSpec);
        });
    }

    /**
     * 修改物料明细
     *
     * @param goodsSkuAddVO 物料明细
     * @return 结果
     */
    @Override
    public int updateGoodsSku(GoodsSkuAddVO goodsSkuAddVO) {
        SysUser user = SecurityUtils.getLoginUser().getUser();
        GoodsSku goodsSku = new GoodsSku();
        BeanUtils.copyProperties(goodsSkuAddVO, goodsSku);
        goodsSku.setUpdateById(user.getUserId());
        goodsSku.setUpdateTime(DateUtils.getNowDate());
        goodsSku.setUpdateBy(user.getUserName());
        goodsSku.setSourceType("");
        int i = baseMapper.updateById(goodsSku);

        // 软删除 原来的规格
        QueryWrapper<GoodsSkuSpec> qw = new QueryWrapper<>();
        qw.eq("goods_sku_id", goodsSku.getId());
        goodsSkuSpecMapper.delete(qw);
        // 新增新的规格
        this.insertSpecBySku(goodsSkuAddVO, goodsSku);

        // 更新物料门店
        LambdaQueryWrapper<GoodsSkuStore> query = new QueryWrapper<GoodsSkuStore>().lambda()
                .eq(GoodsSkuStore::getGoodsSkuId, goodsSku.getId())
                .eq(GoodsSkuStore::getSourceType, user.getUserType());
        if ("01".equals(user.getUserType())) {
            query.eq(GoodsSkuStore::getTargetId, user.getFactoryId());
        }
        if ("02".equals(user.getUserType())) {
            query.eq(GoodsSkuStore::getTargetId, user.getStoreId());
        }
        GoodsSkuStore skuStore = goodsSkuStoreMapper.selectOne(query);
        skuStore.setSalePrice(goodsSkuAddVO.getSalePrice());
        skuStore.setPurchasePrice(goodsSkuAddVO.getPurchasePrice());
        skuStore.setWholesalePrice(goodsSkuAddVO.getWholesalePrice());
        skuStore.setUpdateById(user.getUserId());
        skuStore.setUpdateTime(DateUtils.getNowDate());
        skuStore.setUpdateBy(user.getUserName());
        goodsSkuStoreMapper.updateById(skuStore);
        return i;
    }

    /**
     * 批量删除物料明细
     *
     * @param ids 需要删除的物料明细主键
     * @return 结果
     */
    @Override
    public int deleteGoodsSkuByIds(Long[] ids) {
        return baseMapper.deleteGoodsSkuByIds(ids);
    }

    /**
     * 删除物料明细信息
     *
     * @param id 物料明细主键
     * @return 结果
     */
    @Override
    public int deleteGoodsSkuById(Long id) {
        return baseMapper.deleteGoodsSkuById(id);
    }

    @Override
    public List<GoodsSkuQueryVO> getGoodsSkuPurchaseList(Long goodsCategoryId) {
        SysUser user = SecurityUtils.getLoginUser().getUser();

        List<Long> goodsIdList = goodsInfoService.list(new QueryWrapper<GoodsInfo>().lambda()
                .eq(GoodsInfo::getGoodsCategoryId, goodsCategoryId)
                .eq(GoodsInfo::getDelFlag, DeleteStatus.OK.getCode())
                .eq(GoodsInfo::getStatus, StatusType.OK.getCode())).stream().map(GoodsInfo::getId).collect(Collectors.toList());
        List<GoodsSkuQueryVO> SkuQueryVOS = null;
        if (CollUtil.isEmpty(goodsIdList)) {
            return new ArrayList<>();
        }

        // 总部
        if (SourceType.MANAGER.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setGoodsIdList(goodsIdList);
            SkuQueryVOS = baseMapper.selectPurchaseGoodsSkuInfoByHq(goodsSkuDTO);
        }

        // 工厂
        if (SourceType.FACTORY.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setGoodsIdList(goodsIdList);
            SkuQueryVOS = baseMapper.selectPurchaseGoodsSkuInfoByFactory(goodsSkuDTO);
        }
        // 门店
        if (SourceType.STORE.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setTargetId(user.getStoreId());
            goodsSkuDTO.setGoodsIdList(goodsIdList);
            SkuQueryVOS = baseMapper.selectPurchaseGoodsSkuInfoByStore(goodsSkuDTO);
        }
        if (CollUtil.isEmpty(SkuQueryVOS)) {
            return SkuQueryVOS;
        }
        Set<Long> collect = SkuQueryVOS.stream().map(GoodsSkuQueryVO::getId).collect(Collectors.toSet());
        List<GoodsSkuSpec> skuStoreList = goodsSkuSpecMapper.selectList(
                new QueryWrapper<GoodsSkuSpec>().lambda()
                        .in(GoodsSkuSpec::getGoodsSkuId, collect)
                        .eq(GoodsSkuSpec::getDelFlag, DeleteStatus.OK.getCode()));
        if (CollUtil.isNotEmpty(skuStoreList)) {
            Map<Long, List<GoodsSkuSpec>> map = skuStoreList.stream().collect(Collectors.groupingBy(GoodsSkuSpec::getGoodsSkuId));
            SkuQueryVOS.forEach(sku -> {
                sku.setSpecVoList(map.get(sku.getId()));
            });
        }
        return SkuQueryVOS;
    }

    @Override
    public List<GoodsInfo> getGoodsListToGoodsRetail(RetailQueryGoodsDTO retailQueryGoodsDTO) {
        List<GoodsInfo> goodsInfoList = goodsInfoService.selectGoodsByCategoryId(retailQueryGoodsDTO);
        if (CollUtil.isEmpty(goodsInfoList)) {
            return new ArrayList<>();
        }
        return goodsInfoList;
    }

    @Override
    public List<GoodsSkuQueryVO> getGoodsSkuListToGoodsRetail(Long goodsId) {
        SysUser user = SecurityUtils.getLoginUser().getUser();
        List<GoodsSkuQueryVO> SkuQueryVOS = null;
        // 总部
        if (SourceType.MANAGER.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setGoodsId(goodsId);
            SkuQueryVOS = baseMapper.selectRetailGoodsSkuInfoByHq(goodsSkuDTO);
        }

        // 工厂
        if (SourceType.FACTORY.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setGoodsId(goodsId);
            SkuQueryVOS = baseMapper.selectRetailGoodsSkuInfoByFactory(goodsSkuDTO);
        }
        // 门店
        if (SourceType.STORE.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setTargetId(user.getStoreId());
            goodsSkuDTO.setGoodsId(goodsId);
            SkuQueryVOS = baseMapper.selectRetailGoodsSkuInfoByStore(goodsSkuDTO);
        }
        if (CollUtil.isEmpty(SkuQueryVOS)) {
            return SkuQueryVOS;
        }

        SkuQueryVOS.forEach(sku -> {
            List<GoodsSkuSpec> skuStoreList = goodsSkuSpecMapper.selectList(
                    new QueryWrapper<GoodsSkuSpec>().lambda()
                            .eq(GoodsSkuSpec::getGoodsSkuId, sku.getId())
                            .eq(GoodsSkuSpec::getDelFlag, DeleteStatus.OK.getCode()));
            sku.setSpecVoList(skuStoreList);
        });
        return SkuQueryVOS;
    }
}
