package com.sunda.spmswms.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sunda.spmscommon.ResponseResult;
import com.sunda.spmswms.dto.WhsStorageNoPrintDTO;
import com.sunda.spmswms.entity.Whs;
import com.sunda.spmswms.entity.WhsStorage;
import com.sunda.spmswms.mapper.WerksMapper;
import com.sunda.spmswms.mapper.WhsMapper;
import com.sunda.spmswms.mapper.WhsStorageMapper;
import com.sunda.spmswms.service.IWhsStorageService;

import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * <p>
 * 仓库储位信息表 服务实现类
 * </p>
 *
 * @author Wayne
 * @since 2021-03-18
 */
@Service
public class WhsStorageServiceImpl extends ServiceImpl<WhsStorageMapper, WhsStorage> implements IWhsStorageService {

    @Autowired
    WhsStorageMapper whsStorageMapper;

    @Autowired
    WerksMapper werksMapper;
    @Autowired
    WhsMapper whsMapper;


    @Override
    public List<WhsStorage> getAllWhsStorageList(List<String> whsCode, List<String> werks) {
        return whsStorageMapper.selectList(new QueryWrapper<WhsStorage>().
                eq("STORAGE_STATUS","1").in("WERKS", werks).
                in("WHS_LOCATION_CODE", whsCode).ne("STORAGE_TYPE", "02"));
    }

    @Override
    public List<WhsStorage> getAllWhsStorageOldList(List<String> whsCode, List<String> werks) {
        return whsStorageMapper.selectList(new QueryWrapper<WhsStorage>().
                eq("STORAGE_STATUS","1").in("WERKS", werks).
                in("WHS_LOCATION_CODE", whsCode).eq("STORAGE_TYPE", "02"));
    }

    /***连带已经删除的储位 */
    @Override
    public List<WhsStorage> getWhsStorageListAll(List<String> whsCode, List<String> werks) {
        return whsStorageMapper.selectList(new QueryWrapper<WhsStorage>().in("WERKS", werks).in("WHS_LOCATION_CODE", whsCode));
    }

    @Override
    public ResponseResult createWhsStorage(WhsStorage whsStorage) {

        // 库区， 库区编号是必选项，如果为空，返回错误信息
        String storageNo=whsStorage.getStorageNo();
        String storageArea=whsStorage.getStorageArea();

        if(null == storageNo || null == storageArea || "".equals(storageNo) || "".equals(storageArea)){
            return ResponseResult.error("验证StorageNo和storageArea失败，所指定的StorageNo和StorageArea不能为空");
        }

        //验证werks和whsLocationCode都存在，如果不存在，侧说明用户输入了非法的数值
        String werks = whsStorage.getWerks();
        String whsLocationCode = whsStorage.getWhsLocationCode();
        int hasWS = whsMapper.selectCount(new QueryWrapper<Whs>().eq("WHS_LOCATION_CODE", whsLocationCode).eq("WERKS", werks));
        if (hasWS <= 0) {
            return ResponseResult.error("验证werks和whsLocationCode失败，所指定的Werks和WHS Location Code组合不存在");
        }

        // 储位状态（默认1启用，0停用）
        String storageStatus=whsStorage.getStorageStatus();
        if (null == storageStatus || "".equals(storageStatus)) {
            storageStatus="1";
        }
        whsStorage.setStorageStatus(storageStatus);

        // uuid 为空则新建数据
        String uuid = whsStorage.getUuid();
        if (null == uuid || "".equals(uuid)) {

            List<WhsStorage> storages = whsStorageMapper.selectList(new QueryWrapper<WhsStorage>().eq("WERKS",whsStorage.getWerks())
                    .eq("WHS_LOCATION_CODE",whsStorage.getWhsLocationCode()).eq("STORAGE_AREA",whsStorage.getStorageArea())
                    .eq("STORAGE_NO",whsStorage.getStorageNo()).eq("STORAGE_STATUS","1"));
            if(storages!=null && storages.size()>0){
                return ResponseResult.error("储位已存在！");
            }

            String newUuid=UUID.randomUUID().toString().replaceAll("-", "").toLowerCase();
            whsStorage.setUuid(newUuid);
            int result=whsStorageMapper.insert(whsStorage);

            WhsStorage newStorage=whsStorageMapper.selectOne(new QueryWrapper<WhsStorage>().eq("UUID",newUuid));
            return ResponseResult.success().add("whsStorage",newStorage);
        }

        // uuid 存在则更新数据，如果 storageStatus = 0 停用，则更新之前先校验该储位是否有库存，如果有则不允许停用；
        if ("0".equals(storageStatus)){
            List<Map<String, Object>> checkStorageWithInventoryResult = this.baseMapper.checkStorageWithInventory(uuid);
            if (checkStorageWithInventoryResult != null && checkStorageWithInventoryResult.size() > 0){
                return ResponseResult.error("删除前请确保该储位上没有库存信息");
            }
        }

        int result=whsStorageMapper.update(whsStorage,new QueryWrapper<WhsStorage>().eq("UUID",uuid));
        return ResponseResult.success().add("whsStorage",whsStorageMapper.selectOne(new QueryWrapper<WhsStorage>().eq("UUID",uuid)));
    }

    @Override
    public WhsStorage getWhsStorageByUuid(String uuid) {
        return whsStorageMapper.selectOne(new QueryWrapper<WhsStorage>().eq("UUID",uuid));
    }


    @Override
    @Transactional(rollbackFor = Exception.class)
    public ResponseResult batchCreateWhsStorage(List<WhsStorage> whsStorages) {
        for (int i = 0; i < whsStorages.size(); i++) {//
            WhsStorage whsStorage =whsStorages.get(i);
            // 库区， 库区编号是必选项，如果为空，返回错误信息
            String storageNo=whsStorage.getStorageNo();
            String storageArea=whsStorage.getStorageArea();
            int ij = i+1;
            if(null == storageNo || null == storageArea || "".equals(storageNo) || "".equals(storageArea)){
                return ResponseResult.error("第"+ij+"行验证StorageNo和storageArea失败，所指定的StorageNo和StorageArea不能为空");
            }

            //验证werks和whsLocationCode都存在，如果不存在，侧说明用户输入了非法的数值
            String werks = whsStorage.getWerks();
            String whsLocationCode = whsStorage.getWhsLocationCode();
            int hasWS = whsMapper.selectCount(new QueryWrapper<Whs>().eq("WHS_LOCATION_CODE", whsLocationCode).eq("WERKS", werks));
            if (hasWS <= 0) {
                return ResponseResult.error("第"+ij+"行验证werks和whsLocationCode失败，所指定的Werks和WHS Location Code组合不存在");
            }

            // 储位状态（默认1启用，0停用）
            String storageStatus=whsStorage.getStorageStatus();
            if (null == storageStatus || "".equals(storageStatus)) {
                storageStatus="1";
            }
            whsStorage.setStorageStatus(storageStatus);
            List<WhsStorage> storages = whsStorageMapper.selectList(new QueryWrapper<WhsStorage>().eq("WERKS",whsStorage.getWerks())
                    .eq("WHS_LOCATION_CODE",whsStorage.getWhsLocationCode()).eq("STORAGE_AREA",whsStorage.getStorageArea())
                    .eq("STORAGE_NO",whsStorage.getStorageNo()).eq("STORAGE_STATUS","1"));

            if(storages!=null && storages.size()>0){// uuid 存在则更新数据，如果 storageStatus = 0 停用，则更新之前先校验该储位是否有库存，如果有则不允许停用；
                for (int j = 0; j < storages.size(); j++) {//
                    if ("0".equals(storageStatus)){
                        List<Map<String, Object>> checkStorageWithInventoryResult = this.baseMapper.checkStorageWithInventory(storages.get(j).getUuid());
                        if (checkStorageWithInventoryResult != null && checkStorageWithInventoryResult.size() > 0){
                            return ResponseResult.error("第"+ij+"行删除储位前请确保该储位上没有库存信息");
                        }
                    }
                    whsStorageMapper.update(whsStorage,new QueryWrapper<WhsStorage>().eq("UUID",storages.get(j).getUuid()));
                }
            }else{
                String newUuid=UUID.randomUUID().toString().replaceAll("-", "").toLowerCase();
                whsStorage.setUuid(newUuid);
                whsStorageMapper.insert(whsStorage);
            }
        }
        return ResponseResult.success();
    }
    
    public List<WhsStorageNoPrintDTO> storagePrint(String dsName,String datasetName,Map<String,Object> parameters) {
		String werks = (String) parameters.get("werks");
		String whsLocationCode = (String) parameters.get("whsLocationCode");
		String items = (String) parameters.get("storageNoList");
//		String nowDate = DateFormatUtils.format(new Date(), "yyyy-MM-dd");
		List<WhsStorageNoPrintDTO> returnList = new ArrayList<WhsStorageNoPrintDTO>();
		// 如果items不为空，说明是选择行来打印，否则根据条件查询数据打印
		if (StringUtils.isEmpty(items)) {
			List<WhsStorage> selectList = whsStorageMapper.selectList(new QueryWrapper<WhsStorage>().eq("WHS_LOCATION_CODE", whsLocationCode).eq("WERKS", werks).eq("STORAGE_STATUS", "1"));
			if (CollectionUtils.isNotEmpty(selectList)) {
				for (int i = 0; i < selectList.size(); i++) {
					WhsStorageNoPrintDTO print = new WhsStorageNoPrintDTO();
					print.setStorageNo(selectList.get(i).getStorageNo());
					print.setStorageZhName(selectList.get(i).getRemarks());
					print.setStorageEnName(selectList.get(i).getRemarks());
                    print.setStorageZhName(selectList.get(i).getRemarksEn());
                    print.setStorageEnName(selectList.get(i).getRemarksEn());
					returnList.add(print);
				}
			}
		} else {
			String[] split = items.split(",");
			for (int i = 0; i < split.length; i++) {
				WhsStorage selectOne = whsStorageMapper.selectOne(new QueryWrapper<WhsStorage>().eq("WHS_LOCATION_CODE", whsLocationCode).eq("WERKS", werks).eq("STORAGE_NO", split[i]));
				WhsStorageNoPrintDTO print = new WhsStorageNoPrintDTO();
				if (selectOne != null) {
					print.setStorageNo(selectOne.getStorageNo());
					print.setStorageZhName(selectOne.getRemarks());
					print.setStorageEnName(selectOne.getRemarks());
                    print.setStorageZhName(selectOne.getRemarksEn());
                    print.setStorageEnName(selectOne.getRemarksEn());
				}
				returnList.add(print);
			}
		}
		return returnList;
	}


}
