package com.sw.mes.agv.service.impl;

import com.sw.mes.agv.dao.RechargeArtBagDao;
import com.sw.mes.agv.entity.MonitorEquipmentRecharge;
import com.sw.mes.agv.entity.RechargeArtBagItem;
import com.sw.mes.agv.entity.RechargeArtBagItemRecord;
import com.sw.mes.agv.service.RechargeArtBagItemRecordService;
import com.sw.mes.agv.service.RechargeArtBagService;
import com.sw.mes.agv.entity.RechargeArtBag;
import com.sw.mes.agv.service.MobileRechargeService;
import com.sw.mes.core.base.BaseServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;

@Service
@Transactional
public class RechargeArtBagServiceImpl extends BaseServiceImpl<RechargeArtBag> implements RechargeArtBagService {

    RechargeArtBagDao dao;

    @Autowired
    public void setDao(RechargeArtBagDao dao) {
        super.setBaseDao(dao);
        this.dao = dao;
    }

    @Autowired
    private RechargeArtBagItemRecordService itemRecordService;

    @Override
    public void handleRecord(MonitorEquipmentRecharge recharge, List<RechargeArtBagItem> items) {
        RechargeArtBag entity = new RechargeArtBag();
        BeanUtils.copyProperties(recharge, entity);
        entity.setId(null);
        entity.setDeviceNo(recharge.getName());
        saveOrUpdate(entity);

        if (items.size() > 0) {
            List<RechargeArtBagItemRecord> records = items.stream().map(item -> toRecord(item, entity.getId())).collect(Collectors.toList());
            itemRecordService.saveAll(records);
        }

    }

    private RechargeArtBagItemRecord toRecord(RechargeArtBagItem item, Long rechargeId) {
        RechargeArtBagItemRecord record = new RechargeArtBagItemRecord();
        BeanUtils.copyProperties(item, record);
        record.setId(null);
        record.setRechargeId(rechargeId);

        return record;
    }

//    @Autowired
//    private StoreInputBillService storeInputBillService;
//
//    @Autowired
//    private StoreLocationService storeLocationService;

//    @Override
//    public void backOff(Long[] ids) throws Exception {

//        StoreLocation storeLocation = storeLocationService.findByName("原料库");
//        if (storeLocation == null) {
//            throw new Exception("原料库库位不存在！");
//        }
//
//        createBill(ids, storeLocation);
//   }

 //   public void createBill(Long[] ids, StoreLocation storeLocation) {
//        StoreInputBillDto inputBill = new StoreInputBillDto();
//        inputBill.setCode("GLTL-" + DateUtil.formatDate(new Date(), "yyyyMMdd") + (int) ((Math.random() * 9 + 1) * 100000));
//        inputBill.setInputTypeDictId(null);
//        inputBill.setInputTypeDictName("退料入库");
//        inputBill.setCreateUserId(BaseContextHandler.getUserID());
//        inputBill.setCreateUserName(BaseContextHandler.getUsername());
//
//        List<StoreInputItemDto> itemDtos = new ArrayList<>();
//
//        List<RechargeArtBagItemRecord> records = itemRecordService.findByRechargeIds(Arrays.asList(ids));
//
//        for (RechargeArtBagItemRecord id : records) {
//
//            StoreInputItemDto item = new StoreInputItemDto();
//            item.setCount(id.getCount());
//            MaterialModel model = id.getMaterialModel();
//            if (model != null) {
//                item.setGoodsCode(model.getCode());
//                item.setMaterialModelId(model.getId());
//            } else {
//                item.setGoodsCode("");
//                item.setMaterialModelId(0);
//            }
//
//            item.setRemark("");
//            item.setGoodsNo(DateUtil.formatDate(new Date(), "yyyyMMddHHmmssSSS"));
//            item.setStoreLocationId(storeLocation.getId());
//            item.setProperties("");
//
//            itemDtos.add(item);
//        }
//
//        inputBill.setStoreInputItemDtoDtos(itemDtos);
//
//        // 入库
//        storeInputBillService.backOff(inputBill);
//    }

    @Autowired
    private MobileRechargeService mobileRechargeService;

  //  @Override
 //   public void backOff(RechargeBackoffDto dto) throws RuntimeException {

//        StoreLocation storeLocation = storeLocationService.findByName("原料库");
//        if (storeLocation == null) {
//            throw new RuntimeException("原料库库位不存在！");
//        }
//        RechargeArtBag artBag = get(dto.getId());
//        if (artBag == null) {
//            throw new RuntimeException("物料搭配方案不存在！");
//        }
//
//        StoreInputBillDto inputBill = new StoreInputBillDto();
//        inputBill.setCode("GLTL-" + DateUtil.formatDate(new Date(), "yyyyMMdd") + (int) ((Math.random() * 9 + 1) * 100000));
//        inputBill.setInputTypeDictId(null);
//        inputBill.setInputTypeDictName("退料入库");
//        inputBill.setCreateUserId(BaseContextHandler.getUserID());
//        inputBill.setCreateUserName(BaseContextHandler.getUsername());
//
//        List<StoreInputItemDto> itemDtos = new ArrayList<>();
//
//        List<RechargeBackoffItemDto> dtos = dto.getItemDtos();
//        Map<Integer, RechargeBackoffItemDto> map = new HashMap<>();
//        for (RechargeBackoffItemDto item: dtos) {
//            if (item.getBackoffWeight() == null
//                    || item.getBackoffWeight().compareTo(BigDecimal.ZERO) <= 0) {
//                throw new RuntimeException("物料" + item.getGoodsCode() + "退料重量异常！");
//            }
//            map.put(item.getId(), item);
//        }
//
//        List<RechargeArtBagItemRecord> records = itemRecordService.findByRechargeId(dto.getId());
//
//        RechargeBackoffItemDto tempDto;
//        BigDecimal backoffWeight = BigDecimal.ZERO;
//        BigDecimal tempWeight;
//        StringBuilder str = new StringBuilder();
//        for (RechargeArtBagItemRecord record : records) {
//
//            MaterialModel model = record.getMaterialModel();
//            if (map.containsKey(record.getId())) {
//                tempDto = map.get(record.getId());
//                tempWeight = tempDto.getBackoffWeight();
//
//                StoreInputItemDto item = new StoreInputItemDto();
//
//                if (tempWeight.compareTo(record.getDosage()) > 0) {
//                    throw new RuntimeException("物料" + tempDto.getGoodsCode() + "退料重量大于搭配重量！");
//                }
//
//                item.setCount(tempWeight);
//
//                backoffWeight = backoffWeight.add(tempWeight);
//
//                if (model != null) {
//                    item.setGoodsCode(model.getCode());
//                    item.setMaterialModelId(model.getId());
//                } else {
//                    item.setGoodsCode("");
//                    item.setMaterialModelId(0);
//                }
//
//                item.setRemark("");
//                item.setGoodsNo(DateUtil.formatDate(new Date(), "yyyyMMddHHmmssSSS"));
//                item.setStoreLocationId(storeLocation.getId());
//                item.setProperties("");
//
//                itemDtos.add(item);
//
//                if (record.getBackoffWeight() == null) {
//                    record.setBackoffWeight(tempWeight);
//                } else {
//                    record.setBackoffWeight(record.getBackoffWeight().add(tempWeight));
//                }
//
//                record.setDosage(record.getDosage().subtract(tempWeight));
//
////                artBag.setPareWeight(artBag.getPareWeight() - tempWeight.doubleValue());
//            }
//
//            if (model != null) {
//                str.append(model.getCode()).append("-")
//                        .append(model.getName()).append("-")
//                        .append(model.getSupplier()).append("-")
//                        .append(record.getDosage());
//                if (model.getUnit() != null) {
//                    str.append(model.getUnit().getName()).append(";");
//                } else {
//                    str.append("KG").append(";");
//                }
//            }
//
//        }
//
//        inputBill.setStoreInputItemDtoDtos(itemDtos);
//
//        // 入库
//        storeInputBillService.backOff(inputBill);
//
//        if (artBag.getBackoffWeight() == null || artBag.getBackoffWeight().compareTo(BigDecimal.ZERO) <= 0) {
//            artBag.setBackoffWeight(backoffWeight);
//        } else {
//            artBag.setBackoffWeight(artBag.getBackoffWeight().add(backoffWeight));
//        }
//
//        if (StringUtils.isBlank(artBag.getBackoffReason())) {
//            artBag.setBackoffReason(dto.getBackoffReason());
//        } else {
//            artBag.setBackoffReason(artBag.getBackoffReason() + "," + dto.getBackoffReason());
//        }
//
//        artBag.setTechBomItem(str.toString());
//
//        saveOrUpdate(artBag);
//
//        for (RechargeArtBagItemRecord record : records) {
//            itemRecordService.saveOrUpdate(record);
//        }
//
//        mobileRechargeService.backoff(artBag.getId(), backoffWeight, dto.getBackoffReason());
 //   }

    @Override
    public RechargeArtBag getOneByDeviceNo(String deviceNo) {
        return dao.getOneByDeviceNo(deviceNo);
    }

}
