package com.chinaweal.aiccs.common.util;


import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

/**
 * CSV 读取工具类（Java 8 原生实现）
 */
public class CsvReaderUtil {

    /**
     * 按行读取 CSV 并转换为实体对象
     *
     * @param filePath    CSV 文件路径
     * @param skipHeader  是否跳过表头
     * @param delimiter   分隔符（默认为逗号）
     * @param rowMapper   行数据转换函数
     * @param batchSize   每批处理数量
     * @param batchHandler 批量处理函数（如保存到数据库/Solr）
     * @param <T>         实体类型
     */
    public static <T> void readCsv(
            String filePath,
            boolean skipHeader,
            char delimiter,
            Function<String[], T> rowMapper,
            int batchSize,
            BatchHandler<T> batchHandler,
            String charsetName) throws IOException {

        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(new FileInputStream(filePath), charsetName))) {
            String line;
            List<T> buffer = new ArrayList<>();
            int linesRead = 0;

            while ((line = br.readLine()) != null) {
                if (skipHeader) {
                    skipHeader = false;
                    continue;
                }

                String[] fields = line.split(String.valueOf(delimiter), -1); // 保留空字段
                T entity = rowMapper.apply(fields);

                if (entity != null) {
                    buffer.add(entity);
                    linesRead++;
                }

                if (buffer.size() >= batchSize) {
                    batchHandler.handle(buffer);
                    buffer.clear();
                }
            }

            // 处理剩余数据
            if (!buffer.isEmpty()) {
                batchHandler.handle(buffer);
            }
            System.out.println("共读取 " + linesRead + " 行数据");
        }
    }

    /**
     * 批量处理接口
     * @param <T>
     */
    @FunctionalInterface
    public interface BatchHandler<T> {
        void handle(List<T> items);
    }
}
