package com.neotel.webbox.capacitynew.box;

import com.neotel.webbox.capacity.bean.ReelItem;
import com.neotel.webbox.capacitynew.bean.BoxData;
import com.neotel.webbox.capacitynew.bean.BoxSpecialColumnContent;
import com.neotel.webbox.capacitynew.bean.RequestItem;
import lombok.Getter;
import lombok.Setter;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Getter
@Setter
public class Box {

    /**
     * 标准列数量
     */
    private int columnCount;

    /**
     * 标准列
     */
    private Column column;

    /**
     * 特殊列
     */
    private Map<String, Column> specialColumnMap;

    /**
     * 特殊列上部
     */
    private Map<String, Column> specialColumnUpMap;

    public static Box newBox(BoxData boxData, List<RequestItem> requestList, int maxPressHeight) {
        int validColumnHeight = boxData.getColumnValidHeight(maxPressHeight);
        Box box = new Box();
        //每台机器可用的高度是一样的,只取第一条即可
        Map<String, Column> specialColumnMap = getSpecialColumnMap(boxData, requestList.get(0));
        box.setSpecialColumnMap(specialColumnMap);

        Map<String, Column> specialColumnUpMap = getSpecialColumnUpMap(boxData, requestList, maxPressHeight);
        box.setSpecialColumnUpMap(specialColumnUpMap);

        Column column = new Column(validColumnHeight);
        box.setColumn(column);
        return box;
    }

    private static Map<String, Column> getSpecialColumnUpMap(BoxData boxData, List<RequestItem> requestList, int maxPressHeight) {
        Map<String, Column> specialColumnUpMap = new HashMap<>();
        Map<String, List<BoxSpecialColumnContent>> boxSpecialColumnMap = boxData.getBoxSpecialColumnMap();
        //开始对特殊列进行遍历,取特殊列最上方最小的
        if (boxSpecialColumnMap != null && boxSpecialColumnMap.size() > 0) {
            for (Map.Entry<String, List<BoxSpecialColumnContent>> entry : boxSpecialColumnMap.entrySet()) {
                int boxSpecialColumnUpHeight = boxData.getBoxHeight();
                for (RequestItem requestItem : requestList) {
                    boxSpecialColumnMap = boxData.boxFillSpecialColumnHeight(boxSpecialColumnMap, requestItem.getReelData());
                    List<BoxSpecialColumnContent> boxSpecialColumnContentList = entry.getValue();
                    int boxSpecialColumnHeightTotal = boxSpecialColumnContentList.stream().mapToInt(BoxSpecialColumnContent::getHeight).sum();
                    int boxSpecialColumnUpValidHeight = boxData.getBoxSpecialColumnUpHeightTotal(boxSpecialColumnHeightTotal, maxPressHeight);
                    if (boxSpecialColumnUpHeight > boxSpecialColumnUpValidHeight) {
                        boxSpecialColumnUpHeight = boxSpecialColumnUpValidHeight;
                    }
                }
                if (boxSpecialColumnUpHeight != 0) {
                    specialColumnUpMap.put(entry.getKey(), new Column(boxSpecialColumnUpHeight));
                }
            }
        }
        return specialColumnUpMap;
    }

    public static Map<String, Column> getSpecialColumnMap(BoxData boxData, RequestItem requestItem) {
        Map<String, Column> specialColumnMap = new HashMap<>();
        Map<String, List<BoxSpecialColumnContent>> boxSpecialColumnMap = boxData.getBoxSpecialColumnMap();
        if (boxSpecialColumnMap != null && boxSpecialColumnMap.size() >0) {
            boxSpecialColumnMap = boxData.boxFillSpecialColumnHeight(boxSpecialColumnMap, requestItem.getReelData());
            for (Map.Entry<String, List<BoxSpecialColumnContent>> entry : boxSpecialColumnMap.entrySet()) {
                int boxSpecialColumnValidHeight = boxData.getBoxSingleSpecialColumnHeight(entry.getValue());
                specialColumnMap.put(entry.getKey(), new Column(boxSpecialColumnValidHeight));
            }
        }
        return specialColumnMap;
    }


    /**
     * 获取料仓的容量明细
     */
    public Map<String, ReelItem> getCapacity() {
        Map<String, ReelItem> capacityMap = new HashMap<>();
        for (int i = 0; i < getColumnCount(); i++) {
            capacityMap = addToMap(capacityMap, column.getColumnCapacity());
        }

        for (Map.Entry<String, Column> entry : specialColumnMap.entrySet()) {
            capacityMap = addToMap(capacityMap, entry.getValue().getColumnCapacity());
        }

        for (Map.Entry<String, Column> entry : specialColumnUpMap.entrySet()) {
            capacityMap = addToMap(capacityMap, entry.getValue().getColumnCapacity());
        }

        return capacityMap;
    }

    private Map<String, ReelItem> addToMap(Map<String, ReelItem> capacityMap, Map<String, ReelItem> columnMap) {
        for (Map.Entry<String, ReelItem> entry : columnMap.entrySet()) {
            String sizeStr = entry.getKey();
            ReelItem capacityItem = capacityMap.get(sizeStr);
            if (capacityItem == null) {
                capacityItem = new ReelItem();
                capacityItem.setW(entry.getValue().getW());
                capacityItem.setH(entry.getValue().getH());
            }
            int capacity = capacityItem.getCapacity() + entry.getValue().getCapacity();
            capacityItem.setCapacity(capacity);
            capacityMap.put(sizeStr, capacityItem);
        }
        return capacityMap;
    }
}