package com.cf.imes.module.manage.service.plate;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.cf.imes.module.manage.controller.admin.plate.vo.plate.PlateImportExcelVO;
import lombok.extern.slf4j.Slf4j;

import java.util.*;

@Slf4j
public final class PlateExcelListener<T> extends AnalysisEventListener<PlateImportExcelVO> {

    /**
     * 自定义用于暂时存储data
     * 可以通过实例获取该值
     */
    private List<PlateImportExcelVO> datas = new ArrayList<>();

    private boolean flag = true;

    private Map<Integer, String> valueMap = new HashMap<>();

    /**
     * 每解析一行都会回调invoke()方法
     *
     * @param data    读取后的数据对象
     * @param context 内容
     */
    @Override
    public void invoke(PlateImportExcelVO data, AnalysisContext context) {
        if (!data.isValidGoods()) {//返回false，表示商品信息无效；否则返回true，表示商品信息有效
            data.setResult("商品关键信息缺少");
            this.flag = false;
        }
        checkData(data.getHeight(),"高度",data);
        checkData(data.getWidth(),"宽度",data);
        checkData(data.getThickness(),"厚度",data);
        checkData(data.getPrice(),"价格",data);
        if (data.getResult() != null)
            data.setResult(data.getResult().replace("null,", ""));
        valueMap.put(context.getCurrentRowNum(), data.getResult());
        datas.add(data);
    }

    //    错误判断
    private void checkData(String valueCheck, String head, PlateImportExcelVO data) {
//        长宽厚、价格判断非空
        if (valueCheck == null || valueCheck.equals("")) {
            this.flag = false;
            data.setResult(data.getResult() + "," + head + "信息缺少");
        } else {
            try {
                if (!data.checkPrecision(Double.valueOf(valueCheck))) {
                    data.setResult(data.getResult() + "," + head + "数据有误");
                    this.flag = false;
                }
            } catch (NumberFormatException e) {
                this.flag = false;
                data.setResult(data.getResult() + "," + head + "需要填写数字");
            }
        }
    }

    /**
     * 读取完后操作
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        if (this.flag)
            log.info("PlateExcelListener 所有数据读取完成");
    }

    /**
     * 返回数据
     *
     * @return 返回读取的数据集合
     **/
    public List<PlateImportExcelVO> getDatas() {
        return datas;
    }

    /**
     * 返回读取结果
     *
     * @return 是否读取成功
     **/
    public boolean getFlag() {
        return flag;
    }

    /**
     * 返回错误信息
     *
     * @return String
     **/
    public Map<Integer, String> getValueMap() {
        return valueMap;
    }

}