package com.yiqi.core.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yiqi.common.core.domain.entity.SysUser;
import com.yiqi.common.enums.SourceType;
import com.yiqi.common.exception.ServiceException;
import com.yiqi.common.utils.DateUtils;
import com.yiqi.common.utils.SecurityUtils;
import com.yiqi.common.utils.StringUtils;
import com.yiqi.core.domain.GoodsInfo;
import com.yiqi.core.domain.GoodsSku;
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.OrderGoodsSku;
import com.yiqi.order.domain.OrderPurchaseGoodsSku;
import com.yiqi.order.domain.dto.RetailQueryGoodsDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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);
        }

        if (CollUtil.isEmpty(SkuQueryVOS)) {
            return new GoodsSkuQueryVO();
        }
        GoodsSkuQueryVO goodsSkuQueryVO = SkuQueryVOS.get(0);
        if (StringUtils.isNotBlank(goodsSkuQueryVO.getSpecs())) {
            goodsSkuQueryVO.setSpecValLists(JSONUtil.toList(JSONUtil.parseArray(goodsSkuQueryVO.getSpecs()), String.class));
        }
        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;
        }
        // 设置规格值
        SkuQueryVOS.forEach(goodsSku_ -> {
            //values字符串数组转List
            if (StringUtils.isNotBlank(goodsSku_.getSpecs())) {
                goodsSku_.setSpecValLists(JSONUtil.toList(JSONUtil.parseArray(goodsSku_.getSpecs()), String.class));
            }
        });
        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 factory = new GoodsSkuStore();
        factory.setGoodsSkuId(goodsSku.getId());
        factory.setGoodsId(goodsSku.getGoodsId());
        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.setGoodsId(goodsSku.getGoodsId());
        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.insert(goodsSku);
        return goodsSku;
    }

    /**
     * 修改物料明细
     *
     * @param goodsSkuAddVO 物料明细
     * @return 结果
     */
    @Override
    public int updateGoodsSku(GoodsSkuAddVO goodsSkuAddVO) {
        SysUser user = SecurityUtils.getLoginUser().getUser();
        // 总部
        if (SourceType.MANAGER.getCode().equals(user.getUserType())) {
            GoodsSku goodsSku = new GoodsSku();
            goodsSku.setId(goodsSkuAddVO.getId());
            if (goodsSkuAddVO.getStatus() != null) {
                goodsSku.setStatus(goodsSkuAddVO.getStatus());
            }
            if (goodsSkuAddVO.getSalePrice() != null) {
                goodsSku.setSalePrice(goodsSkuAddVO.getSalePrice());
            }
            if (goodsSkuAddVO.getCostPrice() != null) {
                goodsSku.setCostPrice(goodsSkuAddVO.getCostPrice());
            }
            if (goodsSkuAddVO.getPurchasePrice() != null) {
                goodsSku.setPurchasePrice(goodsSkuAddVO.getPurchasePrice());
            }
            if (goodsSkuAddVO.getStock() != null) {
                goodsSku.setStock(goodsSkuAddVO.getStock());
            }
            goodsSku.buildUpdateData();
            baseMapper.updateById(goodsSku);
        }
        // 工厂
        if (SourceType.FACTORY.getCode().equals(user.getUserType())) {
            GoodsSkuStore goodsSkuStore = goodsSkuStoreService.getSkuStoreBySkuIdAndOrgId(goodsSkuAddVO.getId(), SourceType.FACTORY.getCode(), user.getFactoryId());
            if (goodsSkuAddVO.getStatus() != null) {
                goodsSkuStore.setStatus(goodsSkuAddVO.getStatus());
            }
            if (goodsSkuAddVO.getSalePrice() != null) {
                goodsSkuStore.setSalePrice(goodsSkuAddVO.getSalePrice());
            }
            if (goodsSkuAddVO.getStock() != null) {
                goodsSkuStore.setStock(goodsSkuAddVO.getStock());
            }
            goodsSkuStoreService.updateById(goodsSkuStore);
        }
        // 门店
        if (SourceType.STORE.getCode().equals(user.getUserType())) {
            GoodsSkuStore goodsSkuStore = goodsSkuStoreService.getSkuStoreBySkuIdAndOrgId(goodsSkuAddVO.getId(), SourceType.STORE.getCode(), user.getStoreId());
            if (goodsSkuAddVO.getStatus() != null) {
                goodsSkuStore.setStatus(goodsSkuAddVO.getStatus());
            }
            if (goodsSkuAddVO.getSalePrice() != null) {
                goodsSkuStore.setSalePrice(goodsSkuAddVO.getSalePrice());
            }
            if (goodsSkuAddVO.getStock() != null) {
                goodsSkuStore.setStock(goodsSkuAddVO.getStock());
            }
            goodsSkuStoreService.updateById(goodsSkuStore);
        }
        return 1;
    }

    /**
     * 批量删除物料明细
     *
     * @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, String keywords) {
        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.setKeywords(keywords);
            goodsSkuDTO.setGoodsCategoryId(goodsCategoryId);
//            goodsSkuDTO.setGoodsIdList(goodsIdList);
            SkuQueryVOS = baseMapper.selectPurchaseGoodsSkuInfoByHq(goodsSkuDTO);
        }

        // 工厂
        if (SourceType.FACTORY.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
//            goodsSkuDTO.setGoodsIdList(goodsIdList);
            goodsSkuDTO.setTargetId(user.getFactoryId());
            goodsSkuDTO.setKeywords(keywords);
            goodsSkuDTO.setGoodsCategoryId(goodsCategoryId);
            SkuQueryVOS = baseMapper.selectPurchaseGoodsSkuInfoByFactory(goodsSkuDTO);
        }
        // 门店
        if (SourceType.STORE.getCode().equals(user.getUserType())) {
            GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
            goodsSkuDTO.setSourceType(user.getUserType());
            goodsSkuDTO.setTargetId(user.getStoreId());
            goodsSkuDTO.setKeywords(keywords);
            goodsSkuDTO.setGoodsCategoryId(goodsCategoryId);
//            goodsSkuDTO.setGoodsIdList(goodsIdList);
            SkuQueryVOS = baseMapper.selectPurchaseGoodsSkuInfoByStore(goodsSkuDTO);
        }
        if (CollUtil.isEmpty(SkuQueryVOS)) {
            return SkuQueryVOS;
        }
        // 设置规格值
        SkuQueryVOS.forEach(goodsSku_ -> {
            //values字符串数组转List
            if (StringUtils.isNotBlank(goodsSku_.getSpecs())) {
                goodsSku_.setSpecValLists(JSONUtil.toList(JSONUtil.parseArray(goodsSku_.getSpecs()), String.class));
            }
        });
        return SkuQueryVOS;
    }

    @Override
    public List<GoodsInfo> getGoodsListToGoodsRetail(RetailQueryGoodsDTO retailQueryGoodsDTO) {
        List<GoodsInfo> goodsInfoList = goodsInfoService.selectGoodsByCategoryId(retailQueryGoodsDTO);
        if (CollUtil.isEmpty(goodsInfoList)) {
            return new ArrayList<>();
        }
        List<Long> goodsIds = goodsInfoList.stream().map(GoodsInfo::getId).collect(Collectors.toList());
        //获取每个商品的sku最低价
        Map<Long, Map<String, Object>> resultMap = baseMapper.selectStoreSkuMinSalePriceToGoodsRetail(goodsIds, retailQueryGoodsDTO.getOrgId());
        // 设置规格值
        goodsInfoList.forEach(goodsInfo -> {
            if (CollUtil.isNotEmpty(resultMap) && resultMap.containsKey(goodsInfo.getId())) {
                goodsInfo.setSalePrice((BigDecimal) resultMap.get(goodsInfo.getId()).get("salePrice"));
                goodsInfo.setStock(Integer.parseInt(resultMap.get(goodsInfo.getId()).get("stock").toString()));
            } else {
                goodsInfo.setSalePrice(BigDecimal.ZERO);
                goodsInfo.setStock(0);
            }
        });
        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(goodsSkuVO -> {
            //values字符串数组转List
            if (StringUtils.isNotBlank(goodsSkuVO.getSpecs())) {
                goodsSkuVO.setSpecValLists(JSONUtil.toList(JSONUtil.parseArray(goodsSkuVO.getSpecs()), String.class));
            }
        });
        return SkuQueryVOS;
    }

    @Override
    public int updateGoodsSkuStatus(GoodsSkuAddVO goodsSkuAddVO) {
        SysUser user = SecurityUtils.getLoginUser().getUser();
        // 总部
        if (SourceType.MANAGER.getCode().equals(user.getUserType())) {
            GoodsSku goodsSku = new GoodsSku();
            goodsSku.setId(goodsSkuAddVO.getId());
            goodsSku.setStatus(goodsSkuAddVO.getStatus());
            goodsSku.buildUpdateData();
            baseMapper.updateById(goodsSku);
        }
        // 工厂
        if (SourceType.FACTORY.getCode().equals(user.getUserType())) {
            GoodsSkuStore goodsSkuStore = goodsSkuStoreService.getSkuStoreBySkuIdAndOrgId(goodsSkuAddVO.getId(), SourceType.FACTORY.getCode(), user.getFactoryId());
            goodsSkuStore.setStatus(goodsSkuAddVO.getStatus());
            goodsSkuStoreService.updateById(goodsSkuStore);
        }
        // 门店
        if (SourceType.STORE.getCode().equals(user.getUserType())) {
            GoodsSkuStore goodsSkuStore = goodsSkuStoreService.getSkuStoreBySkuIdAndOrgId(goodsSkuAddVO.getId(), SourceType.STORE.getCode(), user.getStoreId());
            goodsSkuStore.setStatus(goodsSkuAddVO.getStatus());
            goodsSkuStoreService.updateById(goodsSkuStore);
        }
        return 1;
    }

    // 采购减库存,总部
    @Override
    public int addOrMinusGoodsSkuStockByPurchase(Integer addOrMinus, List<OrderPurchaseGoodsSku> orderPurchaseGoodsSkuList) {
        if (CollUtil.isNotEmpty(orderPurchaseGoodsSkuList)) {
            if (addOrMinus == 0) {
                orderPurchaseGoodsSkuList.forEach(orderPurchaseGoodsSku -> {
                    //扣减库存，如果库存不足，则扣减失败
                    int result = baseMapper.minusGoodsSkuStockByHq(orderPurchaseGoodsSku.getSkuId(), orderPurchaseGoodsSku.getBuyNum());
                    if (result == 0) {
                        throw new ServiceException(String.format("%s库存不足或者已下架", orderPurchaseGoodsSku.getGoodsName()));
                    }
                });
            } else {
                orderPurchaseGoodsSkuList.forEach(orderPurchaseGoodsSku -> {
                    //增加库存
                    int result = baseMapper.addGoodsSkuStockByHq(orderPurchaseGoodsSku.getSkuId(), orderPurchaseGoodsSku.getBuyNum());
                    if (result == 0) {
                        throw new ServiceException(String.format("%s商品已下架", orderPurchaseGoodsSku.getGoodsName()));
                    }
                });
            }
            return 1;
        }
        return 0;
    }

    @Override
    public int addOrMinusGoodsSkuStockByGoods(Integer addOrMinus, List<OrderGoodsSku> orderGoodsSkuList) {
        if (CollUtil.isNotEmpty(orderGoodsSkuList)) {
            if (addOrMinus == 0) {
                orderGoodsSkuList.forEach(orderGoodsSku -> {
                    //扣减库存，如果库存不足，则扣减失败
                    int result = baseMapper.minusGoodsSkuStockNotCheckByHq(orderGoodsSku.getSkuId(), orderGoodsSku.getBuyNum());
                    if (result == 0) {
                        log.error(String.format("%s库存不足或者已下架", orderGoodsSku.getGoodsName()));
                    }
                });
            } else {
                orderGoodsSkuList.forEach(orderGoodsSku -> {
                    //扣减库存，如果库存不足，则扣减失败
                    int result = baseMapper.addGoodsSkuStockByHq(orderGoodsSku.getSkuId(), orderGoodsSku.getBuyNum());
                    if (result == 0) {
                        log.error(String.format("%s库存不足或者已下架", orderGoodsSku.getGoodsName()));
                    }
                });
            }
            return 1;
        }
        return 0;
    }


}
