package com.ruoyi.postCheck.util.excel;

import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.postCheck.domain.PostChecked;
import com.ruoyi.postCheck.domain.PostCheckedItems;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;

/**
 * 解析岗检表Excel表
 */
@Slf4j
public class ExcelParsePostCheck {

    public static void main(String[] args) throws Exception {
        ExcelParsePostCheck excelParsePostCheck = new ExcelParsePostCheck();
        PostChecked postChecked = excelParsePostCheck.parseFile("C:\\test\\postcheck\\2、岗位责任制检查表（模板）1225-方联殷V2.xlsx", "2、岗位责任制检查表（模板）1225-方联殷V2.xlsx");
        //3、遍历数据
//        log.info("清单数据：" + postChecked);
        List<PostCheckedItems> children = postChecked.getChildren();
        for (int i = 0; i < children.size(); i++) {
            PostCheckedItems child = children.get(i);
            log.info("明细 {}\t{}", i + 1, child);
        }
    }

    /**
     * 插入的数据：检查表
     */
    private PostChecked postCheck = new PostChecked();

    /**
     * 解析到的Excel数据
     */
    private List<ExcelParseBean> beanList = null;

    /**
     * 记录表格所有的类型
     */
    private Map<String, Integer> typeMap = new HashMap<>();

    /**
     * 构造方法
     */
    public ExcelParsePostCheck() {
        //类型（1-业务职责；2-党建及党风廉政建设职责；3-安全环保职责；4-合规保密职；5-任职资格与能力素质要求）
        typeMap.put("业务职责有效性", 1);
        typeMap.put("党建及党风廉政建设职责有效性", 2);
        typeMap.put("安全环保职责有效性", 3);
        typeMap.put("合规与保密职责有效性", 4);
        typeMap.put("任职资格与能力素质要求符合性", 5);
        typeMap.put("岗位责任制文件完整性与适宜性", 6);
    }

    /**
     * 解析岗检表Excel文件，返回数据
     *
     * @param filePath 文件绝对路径
     * @return 岗检表对象含明细：{key:value,key:value,……,cheildren:[{key:value,key:value,……},{key:value,key:value,……},……]}
     */
    public PostChecked parseFile(String filePath, String downloadName) throws Exception {
        //1、读文件
        File file = new File(filePath);
        InputStream inputStream = new FileInputStream(file);
        ExcelUtilsPostcheck excelUtil = new ExcelUtilsPostcheck(ExcelParseBean.class);
        beanList = excelUtil.importExcel(inputStream, -1);
        //2、解析文件
        for (int i = 0; i < beanList.size(); i++) {
            ExcelParseBean row = beanList.get(i);

//            String cell_1 = row.getCell_1();
//            String cell_2 = row.getCell_2();
//            String cell_3 = row.getCell_3();
//            String cell_4 = row.getCell_4();
//            String cell_5 = row.getCell_5();
//            String cell_6 = row.getCell_6();
//            String cell_7 = row.getCell_7();
//            log.info("第 {} 行数据\t{}\t{}\t{}\t{}\t{}\t{}\t{}", i + 1, cell_1, cell_2, cell_3, cell_4, cell_5, cell_6, cell_7);
            if (!parseRowData(i, row)) {
                break;
            }
        }
        if (CollectionUtils.isEmpty(postCheck.getChildren())) {
            throw new BaseException(downloadName + "文件从第5行及以下未解析到有效数据，请检查！");
        }
        return postCheck;
    }

    /**
     * 按行解析数据
     * 1、2、3、4行单独解析，从第5行开始，全部是数据一次解析到底，方法结束后退出循环
     *
     * @param rowNum 数组角标（从0开始，Excel表格视觉行号是：1、2、3、……）
     * @param row    该行数据
     * @return true：继续解析；false：终止解析；
     */
    private boolean parseRowData(int rowNum, ExcelParseBean row) throws Exception {
        if (rowNum == 1 - 1) {
//            parseRowDataOne(row);
        } else if (rowNum == 2 - 1) {
            parseRowDataTwo(row);
        } else if (rowNum == 3 - 1) {
//            parseRowDataThree(rowData);
        } else if (rowNum == 4 - 1) {
            parseRowDataFour(row);
        } else if (rowNum == 5 - 1) {
            parseRowData(row);
        }
        //大于14的行：已解析过
        else {
            return false;
        }
        return true;
    }


    /**
     * 当前解析的行号为：1
     * 标题
     *
     * @param row
    private void parseRowDataOne(ExcelParseBean row) throws Exception {
    String cell_1 = row.getCell_1();
    String cell_2 = row.getCell_2();
    String cell_3 = row.getCell_3();
    String cell_4 = row.getCell_4();
    String cell_5 = row.getCell_5();
    String cell_6 = row.getCell_6();
    String cell_7 = row.getCell_7();
    postCheck.put("1岗检表", cell_1); 所有的岗检表的标题都一样，这里不存数据库了
    }
     */

    /**
     * 当前解析的行号为：
     *
     * @param row
     */
    private void parseRowDataTwo(ExcelParseBean row) throws Exception {
        int index = beanList.indexOf(row);
        String cell_1 = row.getCell_1();
        String cell_2 = row.getCell_2();
        String cell_3 = row.getCell_3();//检查时间不存
        String cell_4 = row.getCell_4();
        String cell_5 = row.getCell_5();//检查部门及岗位（-切割）
        String cell_6 = row.getCell_6();
        String cell_7 = row.getCell_7();
//        log.info("检查时间：{} 检查部门及岗位：{}", cell_3, cell_5);
        if (StringUtils.isBlank(cell_5)) {
            throw new BaseException("第" + (index + 1) + "行检查部门及岗位为空，请检查！");
        }
        //判断拼接格式
        String split = "-";
        int newCount = cell_5.replace(split, "").length();
        int count = (cell_5.length() - newCount) / split.length();
        if (count == 0) {
            throw new BaseException("第" + (index + 1) + "行检查部门及岗位中间未发现英文\"-\"分割，请检查！");
        } else if (count > 1) {
            throw new BaseException("第" + (index + 1) + "行检查部门及岗位中间未发现多个英文\"-\"分割，请检查！");
        }
        String[] deptNameAndPostName = cell_5.split("-");
        String deptName = deptNameAndPostName[0];
        String postName = deptNameAndPostName[1];
        postCheck.setCheckedDeptName(deptName);
        postCheck.setCheckedPostName(postName);
    }


    /**
     * 当前解析的行号为：
     *
     * @param row
     */
    private void parseRowDataFour(ExcelParseBean row) throws Exception {
        int index = beanList.indexOf(row);
        String cell_1 = row.getCell_1();
        String cell_2 = row.getCell_2();
        String cell_3 = row.getCell_3();
        String cell_4 = row.getCell_4();
//        String cell_5 = row.getCell_5();
        String cell_6 = row.getCell_6();
        String cell_7 = row.getCell_7();
        if (StringUtils.isBlank(cell_1)
                || StringUtils.isBlank(cell_2) || StringUtils.isBlank(cell_3)
                || StringUtils.isBlank(cell_4) || StringUtils.isBlank(cell_6)
                || StringUtils.isBlank(cell_7)) {
            throw new BaseException("文件第" + (index + 1) + "行错误，请检查！（序号、检查项目、检查内容、检查标准（D列E列应为合并单元格）、检查方法、检查结果）");
        }
        if (!"序号".equalsIgnoreCase(cell_1)
                || !"检查项目".equalsIgnoreCase(cell_2)
                || !"检查内容".equalsIgnoreCase(cell_3)
                || !"检查标准".equalsIgnoreCase(cell_4)
                || !"检查方法".equalsIgnoreCase(cell_6)
                || !"检查结果".equalsIgnoreCase(cell_7)
        ) {

            throw new BaseException("文件第" + (index + 1) + "行错误，请检查！（序号、检查项目、检查标准、检查方法、检查结果）");
        }

    }


    /**
     * 当前解析的行号为：>= 5
     * 第5行以下都是数据，一直解析到底
     *
     * @param row
     */
    private void parseRowData(ExcelParseBean row) throws Exception {
        int index = beanList.indexOf(row);
        if (index == beanList.size() - 1) {
            log.info("文件最后一行，解析结束！index = {} row = {}", index, row);
            return;
        }
        //开始解析数据
        String last_cell_2 = null;
        for (int i = index; i < beanList.size(); i++) {
            ExcelParseBean thisRow = beanList.get(i);

            String cell_1 = thisRow.getCell_1();//序号
            String cell_2 = thisRow.getCell_2();//检查项目
            String cell_3 = thisRow.getCell_3();//检查内容
            String cell_4 = thisRow.getCell_4();//检查标准

            String cell_6 = thisRow.getCell_6();//检查方法
            String cell_7 = thisRow.getCell_7();//检查结果


            //如果为空使用上一行的值
            if (StringUtils.isBlank(cell_2)) {
                cell_2 = last_cell_2;
            }
            //记录当前行的值
            else {
                last_cell_2 = cell_2;

            }
            Integer type = typeMap.get(cell_2);
            if (type == null) {
                throw new BaseException("文件第" + (i + 1) + "行B列检查项目解析失败，请检查！【" + cell_2 + "】");
            }

            //前四项不能出现空值，第二项有合并单元格，取上一次的值后也不会有空值
            if (StringUtils.isBlank(cell_1) || StringUtils.isBlank(cell_2) || StringUtils.isBlank(cell_3) || StringUtils.isBlank(cell_4)) {
                throw new BaseException("文件第" + (i + 1) + "行ABCD列解析失败，请检查！【" + cell_2 + "】");
            }

//            child.put("0检查项目type", String.valueOf(type));
//            child.put("1序号", cell_1);
//            child.put("2检查项目", cell_2);
//            child.put("3检查内容", cell_3);
//            child.put("4检查标准", cell_4);
//            child.put("5检查方法", cell_6);
//            child.put("6检查结果", cell_7);
            PostCheckedItems child = new PostCheckedItems();
            child.setSerialNumber(Integer.parseInt(cell_1));//1序号
            child.setType(type); //2检查项目
            child.setPostCheckedContent(cell_3);//3检查内容
            child.setPostCheckedStandard(cell_4); //4检查标准
            child.setPostCheckedMethod(cell_6); //5检查方法
            child.setPostCheckedResult(cell_7);//6检查结果
            postCheck.getChildren().add(child);
        }
    }

}
