package com.ho.business.config;

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.ho.business.vo.resp.elecPriceCurve.ElecPriceTemplateExcel;
import com.ho.business.vo.resp.elecPriceCurve.RowRangeDto;
import com.ho.business.vo.resp.tabSort.TabSortExcel;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

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

public class BizMergeStrategy extends AbstractMergeStrategy {

    private Map<String, List<RowRangeDto>> strategyMap;
    private Sheet sheet;

    public BizMergeStrategy(Map<String, List<RowRangeDto>> strategyMap) {
        this.strategyMap = strategyMap;
    }

    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, Integer integer) {
        this.sheet = sheet;
        //如果没有标题，只有表头的话，这里的 cell.getRowIndex() == 1
        if (cell.getColumnIndex() == 0) {
            /**
             * 保证每个cell被合并一次，如果不加上面的判断，因为是一个cell一个cell操作的，
             * 例如合并A2:A3,当cell为A2时，合并A2,A3，但是当cell为A3时，又是合并A2,A3，
             * 但此时A2,A3已经是合并的单元格了
             */
            for (Map.Entry<String, List<RowRangeDto>> entry : strategyMap.entrySet()) {
                Integer columnIndex = Integer.valueOf(entry.getKey());
                entry.getValue().forEach(rowRange -> {
                    //添加一个合并请求
                    sheet.addMergedRegionUnsafe(new CellRangeAddress(rowRange.getStart(),
                            rowRange.getEnd(), columnIndex, columnIndex));
                });
            }
        }
        if (cell.getColumnIndex() == 5) {
            /**
             * 保证每个cell被合并一次，如果不加上面的判断，因为是一个cell一个cell操作的，
             * 例如合并A2:A3,当cell为A2时，合并A2,A3，但是当cell为A3时，又是合并A2,A3，
             * 但此时A2,A3已经是合并的单元格了
             */
            for (Map.Entry<String, List<RowRangeDto>> entry : strategyMap.entrySet()) {
                Integer columnIndex = Integer.valueOf(entry.getKey());
                entry.getValue().forEach(rowRange -> {
                    //添加一个合并请求
                    sheet.addMergedRegionUnsafe(new CellRangeAddress(rowRange.getStart(),
                            rowRange.getEnd(), columnIndex, columnIndex));
                });
            }
        }
        if (cell.getColumnIndex() == 6) {
            /**
             * 保证每个cell被合并一次，如果不加上面的判断，因为是一个cell一个cell操作的，
             * 例如合并A2:A3,当cell为A2时，合并A2,A3，但是当cell为A3时，又是合并A2,A3，
             * 但此时A2,A3已经是合并的单元格了
             */
            for (Map.Entry<String, List<RowRangeDto>> entry : strategyMap.entrySet()) {
                Integer columnIndex = Integer.valueOf(entry.getKey());
                entry.getValue().forEach(rowRange -> {
                    //添加一个合并请求
                    sheet.addMergedRegionUnsafe(new CellRangeAddress(rowRange.getStart(),
                            rowRange.getEnd(), columnIndex, columnIndex));
                });
            }
        }
    }

    public static Map<String, List<RowRangeDto>> addAnnualMerStrategy(List<ElecPriceTemplateExcel> excelList) {
        Map<String, List<RowRangeDto>> strategyMap = new HashMap<>();
        ElecPriceTemplateExcel excel = null;
        for (int i = 0; i < excelList.size(); i++) {
            ElecPriceTemplateExcel ElecPriceTemplateExcel = excelList.get(i);
            //如果名字一样，将名字合并（真正开发中一般不会通过名字这样字段，而是通过一些关联的唯一值，比如父id）
            if (excel != null) {
                if (ElecPriceTemplateExcel.getTemplateName().equals(excel.getTemplateName())){    // 名字相同则合并第一列
//                    BizMergeStrategy.fillStrategyMap(strategyMap, "0", i+1);
                    //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                    BizMergeStrategy.fillStrategyMap(strategyMap, "0", i);
                }
            }
            if (excel != null) {
                if (ElecPriceTemplateExcel.getIsEnable().equals(excel.getIsEnable())){    // 名字相同则合并第一列
                    if (ElecPriceTemplateExcel.getTemplateName() .equals( excel.getTemplateName())) {
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "5", i );
                    }
                }
            }
            if (excel != null) {
                if (ElecPriceTemplateExcel.getUpdateTime().equals(excel.getUpdateTime())){    // 名字相同则合并第一列
                    if (ElecPriceTemplateExcel.getTemplateName().equals(excel.getTemplateName())) {
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "9", i );
                    }
                }
            }
            if (excel != null) {
                if (ElecPriceTemplateExcel.getValidityStartTime().equals(excel.getValidityStartTime())){    // 名字相同则合并第一列
                    if (ElecPriceTemplateExcel.getTemplateName().equals(excel.getTemplateName())) {
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "6", i );
                    }
                }
            }
            if (excel != null) {
                if (ElecPriceTemplateExcel.getValidityEndTime().equals(excel.getValidityEndTime())){    // 名字相同则合并第一列
                    if (ElecPriceTemplateExcel.getTemplateName().equals(excel.getTemplateName())) {
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "7", i );
                    }
                }
            }
            if (excel != null) {
                if (ElecPriceTemplateExcel.getDiscount()!=null &&
                        ElecPriceTemplateExcel.getDiscount().equals(excel.getDiscount())){    // 名字相同则合并第一列
                    if (ElecPriceTemplateExcel.getTemplateName().equals(excel.getTemplateName())) {
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "8", i );
                    }
                }
            }
            excel = ElecPriceTemplateExcel;
        }
        return strategyMap;
    }


    public static Map<String, List<RowRangeDto>> addAnnualMerStrategy4TabSort(List<TabSortExcel> excelList) {
        Map<String, List<RowRangeDto>> strategyMap = new HashMap<>();
        TabSortExcel excel = null;
        for (int i = 0; i < excelList.size(); i++) {
            TabSortExcel tabSortExcel = excelList.get(i);
            //如果名字一样，将名字合并（真正开发中一般不会通过名字这样字段，而是通过一些关联的唯一值，比如父id）
            if (excel != null) {
                if (tabSortExcel.getTabName() != null && tabSortExcel.getTabName().equals(excel.getTabName()) ){    // 名字相同则合并第一列
                    //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                    BizMergeStrategy.fillStrategyMap(strategyMap, "0", i);
                }
            }
            if (excel != null) {
                if (tabSortExcel.getTagName() != null && tabSortExcel.getTagName().equals(excel.getTagName())){    // 名字相同则合并第一列
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "1", i );
                }
            }
            if (excel != null) {
                if (tabSortExcel.getTagNameEn() != null && tabSortExcel.getTagNameEn().equals(excel.getTagNameEn())){    // 名字相同则合并第一列
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                    BizMergeStrategy.fillStrategyMap(strategyMap, "2", i);
                }
            }
            if (excel != null) {
                if (tabSortExcel.getTagType() != null && tabSortExcel.getTagType().equals(excel.getTagType()) && tabSortExcel.getTagName().equals(excel.getTagName())){    // 名字相同则合并第一列
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "3", i);
                }
            }
            if (excel != null) {
                if (tabSortExcel.getSrcId() != null && tabSortExcel.getSrcId().equals(excel.getSrcId()) && tabSortExcel.getTagName().equals(excel.getTagName())){    // 名字相同则合并第一列
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "4", i);
                }
            }
            if (excel != null) {
                if (tabSortExcel.getDeviceType() != null && tabSortExcel.getDeviceType().equals(excel.getDeviceType()) && tabSortExcel.getTagName().equals(excel.getTagName())){    // 名字相同则合并第一列
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "5", i);
                }
            }
            if (excel != null) {
                if (tabSortExcel.getCol() != null && tabSortExcel.getCol().equals(excel.getCol()) && tabSortExcel.getTagName().equals(excel.getTagName())){    // 名字相同则合并第一列
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "6", i);
                }
            }
            if (excel != null) {
                if (tabSortExcel.getMaxValue() != null && tabSortExcel.getMaxValue().equals(excel.getMaxValue()) && tabSortExcel.getTagName().equals(excel.getTagName())){    // 名字相同则合并第一列
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "7", i);
                }
            }
            if (excel != null) {
                if (tabSortExcel.getMinValue() != null && tabSortExcel.getMinValue().equals(excel.getMinValue()) && tabSortExcel.getTagName().equals(excel.getTagName())){    // 名字相同则合并第一列
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "8", i);
                }
            }
            if (excel != null) {
                if (tabSortExcel.getFrame() != null && tabSortExcel.getFrame().equals(excel.getFrame()) && tabSortExcel.getTagName().equals(excel.getTagName())){    // 名字相同则合并第一列
                        //如果没有标题，只有表头的话，这里为 BizMergeStrategy.fillStrategyMap(strategyMap, "1", i);
                        BizMergeStrategy.fillStrategyMap(strategyMap, "9", i );
                }
            }
            excel = tabSortExcel;
        }
        return strategyMap;
    }

    private static void fillStrategyMap(Map<String, List<RowRangeDto>> strategyMap, String key, int index){
        List<RowRangeDto> rowRangeDtoList = strategyMap.get(key) == null ? new ArrayList<>() : strategyMap.get(key);
        boolean flag = false;
        for (RowRangeDto dto : rowRangeDtoList) {
            //分段list中是否有end索引是上一行索引的，如果有，则索引+1
            if (dto.getEnd() == index) {
                dto.setEnd(index + 1);
                flag = true;
            }
        }
        //如果没有，则新增分段
        if (!flag) {
            rowRangeDtoList.add(new RowRangeDto(index, index + 1));
        }
        strategyMap.put(key, rowRangeDtoList);
    }


    public static HorizontalCellStyleStrategy CellStyleStrategy(){
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        //设置背景颜色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        //设置头字体
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short)13);
        headWriteFont.setBold(true);
        headWriteCellStyle.setWriteFont(headWriteFont);
        //设置头居中
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        //内容策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        //设置 水平居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        return horizontalCellStyleStrategy;
    }


}
