package com.fs.store.service.impl;

import java.util.Date;
import java.util.List;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.fs.common.core.domain.R;
import com.fs.common.exception.CustomException;
import com.fs.common.utils.DateUtils;
import com.fs.common.utils.StringUtils;
import com.fs.erp.domain.ErpGoodsStock;
import com.fs.erp.dto.ErpGoodsStockQueryRequert;
import com.fs.erp.dto.ErpGoodsStockQueryResponse;
import com.fs.erp.service.IErpGoodsService;
import com.fs.store.domain.FsStoreProductAttrValue;
import com.fs.store.domain.FsStoreProductGroup;
import com.fs.store.dto.StoreProductGroupDTO;
import com.fs.store.mapper.*;
import com.fs.store.param.FsStoreCartCountParam;
import com.fs.store.param.FsStoreCartDelParam;
import com.fs.store.param.FsStoreCartNumParam;
import com.fs.store.param.FsStoreCartParam;
import com.fs.store.vo.FsStoreCartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fs.store.domain.FsStoreCart;
import com.fs.store.service.IFsStoreCartService;

/**
 * 购物车Service业务层处理
 *
 * @author fs
 * @date 2022-03-21
 */
@Service
public class FsStoreCartServiceImpl implements IFsStoreCartService
{
    @Autowired
    private FsStoreCartMapper fsStoreCartMapper;
    @Autowired
    private FsStoreProductMapper fsStoreProductMapper;
    @Autowired
    private FsStoreProductAttrValueMapper valueMapper;
    @Autowired
    private FsStoreProductGroupMapper productGroupMapper;
    @Autowired
    IErpGoodsService goodsService;
    /**
     * 查询购物车
     *
     * @param id 购物车ID
     * @return 购物车
     */
    @Override
    public FsStoreCart selectFsStoreCartById(Long id)
    {
        return fsStoreCartMapper.selectFsStoreCartById(id);
    }

    /**
     * 查询购物车列表
     *
     * @param fsStoreCart 购物车
     * @return 购物车
     */
    @Override
    public List<FsStoreCart> selectFsStoreCartList(FsStoreCart fsStoreCart)
    {
        return fsStoreCartMapper.selectFsStoreCartList(fsStoreCart);
    }

    /**
     * 新增购物车
     *
     * @param fsStoreCart 购物车
     * @return 结果
     */
    @Override
    public int insertFsStoreCart(FsStoreCart fsStoreCart)
    {
        fsStoreCart.setCreateTime(DateUtils.getNowDate());
        return fsStoreCartMapper.insertFsStoreCart(fsStoreCart);
    }

    /**
     * 修改购物车
     *
     * @param fsStoreCart 购物车
     * @return 结果
     */
    @Override
    public int updateFsStoreCart(FsStoreCart fsStoreCart)
    {
        fsStoreCart.setUpdateTime(DateUtils.getNowDate());
        return fsStoreCartMapper.updateFsStoreCart(fsStoreCart);
    }

    /**
     * 批量删除购物车
     *
     * @param ids 需要删除的购物车ID
     * @return 结果
     */
    @Override
    public int deleteFsStoreCartByIds(Long[] ids)
    {
        return fsStoreCartMapper.deleteFsStoreCartByIds(ids);
    }

    /**
     * 删除购物车信息
     *
     * @param id 购物车ID
     * @return 结果
     */
    @Override
    public int deleteFsStoreCartById(Long id)
    {
        return fsStoreCartMapper.deleteFsStoreCartById(id);
    }

    @Override
    public R addCart(long uid, FsStoreCartParam cartParam) {
        //如果是直接购买，直接写入记录
        if(cartParam.getIsBuy()==1) {
            FsStoreCart storeCart = FsStoreCart.builder()
                    .cartNum(cartParam.getCartNum())
                    .productAttrValueId(cartParam.getAttrValueId())
                    .productId(cartParam.getProductId())
                    .userId(uid)
                    .cartNum(cartParam.getCartNum())
                    .isPay(0)
                    .isDel(0)
                    .isBuy(cartParam.getIsBuy())
                    .build();
            storeCart.setCreateTime(new Date());

            FsStoreProductAttrValue productAttrValue = valueMapper.selectFsStoreProductAttrValueById(storeCart.getProductAttrValueId());

                if (StringUtils.isEmpty(productAttrValue.getGroupBarCode())) {
                    if (cartParam.getCartNum() > 10) {
                        return R.error("限购10个");
                    }
                } else {
                    FsStoreProductGroup group=productGroupMapper.selectFsStoreProductGroupByBarCode(productAttrValue.getGroupBarCode());
                    if(group!=null){
                        JSONArray jsonArray = JSONUtil.parseArray(group.getProducts());
                        List<StoreProductGroupDTO> productGroupDTOS = JSONUtil.toList(jsonArray, StoreProductGroupDTO.class);
                        int num = 0;
                        for (StoreProductGroupDTO productGroupDTO : productGroupDTOS) {
                            num += productGroupDTO.getCount() * cartParam.getCartNum();
                        }
                        if (num > 10) {
                            return R.error("限购10个");
                        }
                    } else {
                        return R.error("组合码错误");
                    }
                }




         //  checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
            fsStoreCartMapper.insertFsStoreCart(storeCart);
            return R.ok().put("id",storeCart.getId());

        }
        else{
            FsStoreCart cartMap=new FsStoreCart();
            cartMap.setUserId(uid);
            cartMap.setIsPay(0);
            cartMap.setIsBuy(0);
            cartMap.setProductId(cartParam.getProductId());
            cartMap.setProductAttrValueId(cartParam.getAttrValueId());
            List<FsStoreCart> cart = fsStoreCartMapper.selectFsStoreCartList(cartMap);
            FsStoreCart storeCart;
            if(cart==null||cart.size()==0){
                storeCart = FsStoreCart.builder()
                        .cartNum(cartParam.getCartNum())
                        .productAttrValueId(cartMap.getProductAttrValueId())
                        .productId(cartMap.getProductId())
                        .userId(uid)
                        .cartNum(cartParam.getCartNum())
                        .isPay(0)
                        .isDel(0)
                        .isBuy(0)
                        .build();
                storeCart.setCreateTime(new Date());
                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
                fsStoreCartMapper.insertFsStoreCart(storeCart);
                return R.ok().put("id",storeCart.getId());
            }
            else{
                storeCart=cart.get(0);
                storeCart.setCartNum(cartParam.getCartNum() + cart.get(0).getCartNum());
                storeCart.setUpdateTime(new Date());
                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
                fsStoreCartMapper.updateFsStoreCart(storeCart);
                return R.ok().put("id",storeCart.getId());
            }

        }
    }

    @Override
    public List<FsStoreCartVO> selectFsStoreCartListByUid(long uid) {
        return fsStoreCartMapper.selectFsStoreCartListByUid(uid);
    }

    @Override
    public R delCart(long userId, FsStoreCartDelParam cartParam) {
        fsStoreCartMapper.delCart(cartParam.getIds());
        return R.ok();
    }

    @Override
    public R changeNum(long userId, FsStoreCartNumParam cartParam) {
        FsStoreCart cart=fsStoreCartMapper.selectFsStoreCartById(cartParam.getId());
        checkProductStock(cart.getProductId(),cart.getProductAttrValueId());
        cart.setCartNum(cartParam.getNumber());
        cart.setUpdateTime(new Date());
        fsStoreCartMapper.updateFsStoreCart(cart);
        return R.ok();
    }

    @Override
    public void checkProductStock(Long productId, Long productAttrValueId) {
//        FsStoreProductAttrValue productAttrValue=valueMapper.selectFsStoreProductAttrValueById(productAttrValueId);
//        if(StringUtils.isEmpty(productAttrValue.getGroupBarCode())){
//            //单品
//            ErpGoodsStockQueryRequert request=new ErpGoodsStockQueryRequert();
//            request.setBarcode(productAttrValue.getBarCode());
//            ErpGoodsStockQueryResponse response=goodsService.getGoodsStock(request);
//            if(response.getStocks()!=null){
//                Integer stocks=0;
//                for(ErpGoodsStock stock:response.getStocks()){
//                    Double goodsStock=Double.parseDouble(stock.getSalable_qty());
//                    stocks+=goodsStock.intValue();
//                }
//                if(stocks<=0){
//                    productAttrValue.setStock(0);
//                    valueMapper.updateFsStoreProductAttrValue(productAttrValue);
//                    fsStoreProductMapper.updateStock(productId);
//                    throw new CustomException("库存不足");
//                }
//                else{
//                    //更新库存
//                    productAttrValue.setStock(stocks);
//                    valueMapper.updateFsStoreProductAttrValue(productAttrValue);
//                    fsStoreProductMapper.updateStock(productId);
//                    return;
//                }
//
//            }
//            else{
//                throw new CustomException("未获取到库存");
//            }
//        }
//        else{
//            //组合码
//            FsStoreProductGroup group=productGroupMapper.selectFsStoreProductGroupByBarCode(productAttrValue.getGroupBarCode());
//            if(group!=null){
//                Integer totalStock=0;
//                JSONArray jsonArray= JSONUtil.parseArray(group.getProducts());
//                List<StoreProductGroupDTO> productGroupDTOS=JSONUtil.toList(jsonArray, StoreProductGroupDTO.class);
//                if(productGroupDTOS!=null){
//                    for(StoreProductGroupDTO dto:productGroupDTOS){
//                        FsStoreProductAttrValue attrValue=valueMapper.selectFsStoreProductAttrValueById(dto.getId());
//                        ErpGoodsStockQueryRequert request=new ErpGoodsStockQueryRequert();
//                        request.setBarcode(attrValue.getBarCode());
//                        ErpGoodsStockQueryResponse response=goodsService.getGoodsStock(request);
//                        if(response.getStocks()!=null){
//                            Integer stocks=0;
//                            for(ErpGoodsStock stock:response.getStocks()){
//                                Double goodsStock=Double.parseDouble(stock.getSalable_qty());
//                                stocks+=goodsStock.intValue();
//                            }
//                            if(stocks<=0){
//                                attrValue.setStock(0);
//                                valueMapper.updateFsStoreProductAttrValue(attrValue);
//                                fsStoreProductMapper.updateStock(productId);
//                                throw new CustomException("库存不足");
//                            }
//                            else{
//                                //更新库存
//                                attrValue.setStock(stocks);
//                                valueMapper.updateFsStoreProductAttrValue(attrValue);
//                                fsStoreProductMapper.updateStock(productId);
//                            }
//                            totalStock+=stocks;
//                        }
//                    }
//                }
//                productAttrValue.setStock(totalStock);
//                valueMapper.updateFsStoreProductAttrValue(productAttrValue);
//                fsStoreProductMapper.updateStock(productId);
//            }
//
//        }
//        int stock=valueMapper.selectFsStoreProductStockById(productAttrValueId);
//        if (stock < cartNum) {
//            throw new CustomException(product.getProductName() + "库存不足");
//        }
    }




    @Override
    public Integer selectFsStoreCartCountByUserId(long userId) {

        return  fsStoreCartMapper.selectFsStoreCartCountByUserId(userId);
    }

    @Override
    public Integer selectFsStoreCartCount(FsStoreCartCountParam param) {
        return  fsStoreCartMapper.selectFsStoreCartCount(param);
    }

}
