package cn.report.excel.easyexcel.custom;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.report.excel.easyexcel.api.context.AnalysisContext;
import cn.report.excel.easyexcel.api.event.AnalysisEventListener;
import cn.report.excel.easyexcel.api.exception.ExcelDataConvertException;

/**
 * 模板的读取类
 * 执行顺序是先执行invokeHeadMap然后是invoke遍历每一行，最后执行doAfterAllAnalysed结束
 * 
 * Object 可以替换为：Map<Integer, String>
 */
public class SamDataListener extends AnalysisEventListener<Object> //
{
	 private static final Logger LOGGER = LoggerFactory.getLogger(SamDataListener.class);
	 
	/**
	 * 每隔5条存储数据库，实际使用中可以3000条，然后清理list ，方便内存回收
	 */
	private static final int BATCH_COUNT = 5;

	private Map<Integer, String> head = new LinkedHashMap<>();//表头
	private List<Object> data = new ArrayList<>();
	
	public Map<Integer, String> getHead() {
		return head;
	}

	
	// List<Map<Integer, String>> data = new LinkedList<>();	
	public List<Object> getData() {
        return data;
    }

    public void setData(List<Object> data) {
        this.data = data;
    }
	
	/**每一条数据解析都会来调用*/
	@Override
	public void invoke(Object o, AnalysisContext context) {
		//list.add(data);
		 data.add(o);
		// 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
		/*if (data.size() >= BATCH_COUNT) {
			saveData();
			//存储完成清理 list
			data.clear();
		}*/
	}
	
	@Override
	public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
		head.putAll(headMap);
		//System.out.println("表头："+ headMap.toString());
		//LOGGER.info("解析表头:{}", JSON.toJSONString(headMap));
	}

	/**所有数据解析完成了 都会来调用 */
	@Override
	public void doAfterAllAnalysed(AnalysisContext context) {
		//要保存数据，确保最后遗留的数据也存储到数据库
	//	saveData();
	}

	/**
     * 在转换异常 获取其他异常下会调用本接口。抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行。
     *
     * @param exception
     * @param context
     * @throws Exception
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) {
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
            LOGGER.error("第{}行，第{}列解析异常，数据为:{}", excelDataConvertException.getRowIndex(),
                excelDataConvertException.getColumnIndex(), excelDataConvertException.getCellData());
        }
    }
}
