package com.example.system.utils;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.DateFormatConverter;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Excel处理工具类
 */
public class ExcelUtils {

    /**
     * 将Excel文件转换为CSV格式字符串
     * @param multipartFile Excel文件
     * @return CSV格式字符串
     */
    public static String excelToCsv(MultipartFile multipartFile) {
        try (InputStream inputStream = multipartFile.getInputStream()) {
            // 创建工作簿
            Workbook workbook = WorkbookFactory.create(inputStream);
            // 获取第一个工作表
            Sheet sheet = workbook.getSheetAt(0);

            // 存储CSV行
            List<String> csvLines = new ArrayList<>();

            // 遍历行
            for (Row row : sheet) {
                List<String> cellValues = new ArrayList<>();

                // 遍历单元格
                for (int i = 0; i < row.getLastCellNum(); i++) {
                    Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    cellValues.add(getCellValueAsString(cell));
                }

                // 生成CSV行，用逗号分隔
                csvLines.add(cellValues.stream().collect(Collectors.joining(",")));
            }

            // 将所有行连接起来，每行以换行符分隔
            return String.join("\n", csvLines);
        } catch (IOException e) {
            throw new RuntimeException("Excel文件处理失败: " + e.getMessage(), e);
        }
    }

    /**
     * 处理CSV文件
     * @param multipartFile CSV文件
     * @return CSV内容字符串
     */
    public static String processCsv(MultipartFile multipartFile) {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(multipartFile.getInputStream()))) {
            return reader.lines().collect(Collectors.joining("\n"));
        } catch (IOException e) {
            throw new RuntimeException("CSV文件处理失败: " + e.getMessage(), e);
        }
    }

    /**
     * 获取单元格的字符串值
     * @param cell 单元格
     * @return 单元格的字符串表示
     */
    private static String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue().toString();
                } else {
                    // 避免数值显示为科学计数法
                    double value = cell.getNumericCellValue();
                    if (value == Math.floor(value)) {
                        return String.valueOf((long) value);
                    } else {
                        return String.valueOf(value);
                    }
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                try {
                    return String.valueOf(cell.getNumericCellValue());
                } catch (Exception e) {
                    try {
                        return cell.getStringCellValue();
                    } catch (Exception ex) {
                        return cell.getCellFormula();
                    }
                }
            default:
                return "";
        }
    }

    /**
     * 检查是否为Excel文件
     * @param filename 文件名
     * @return 是否为Excel文件
     */
    public static boolean isExcelFile(String filename) {
        if (filename == null) {
            return false;
        }
        String lowerCase = filename.toLowerCase();
        return lowerCase.endsWith(".xlsx") || lowerCase.endsWith(".xls");
    }
}