package com.easyproject.common.utils.file;

import cn.hutool.core.io.FileUtil;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.File;
import java.io.FileInputStream;

public class FileContentReader {
    /**
     * 读取文件内容（支持PDF/TXT/DOC/DOCX/MD）
     * @param file 文件对象
     * @return 文件内容字符串
     */
    public static String readFileContent(File file) {
        if (file == null || !file.exists()) {
            throw new IllegalArgumentException("文件不存在或为null");
        }

        String fileName = file.getName().toLowerCase();

        try {
            if (fileName.endsWith(".txt") || fileName.endsWith(".md")) {
                return readTextFile(file);
            } else if (fileName.endsWith(".pdf")) {
                return readPdfFile(file);
            } else if (fileName.endsWith(".doc")) {
                return readDocFile(file);
            } else if (fileName.endsWith(".docx")) {
                return readDocxFile(file);
            } else {
                // 尝试按文本文件读取
                return readTextFile(file);
            }
        } catch (Exception e) {
            throw new RuntimeException("读取文件失败: " + file.getName(), e);
        }
    }

    /**
     * 读取文本文件内容（包括TXT和MD）
     */
    private static String readTextFile(File file) {
        return FileUtil.readUtf8String(file);
    }

    /**
     * 读取PDF文件内容
     */
    private static String readPdfFile(File file) throws Exception {
        try (PDDocument document = PDDocument.load(file)) {
            if (document.isEncrypted()) {
                throw new RuntimeException("加密的PDF文件无法读取");
            }
            PDFTextStripper stripper = new PDFTextStripper();
            stripper.setSortByPosition(true);
            return stripper.getText(document);
        }
    }

    /**
     * 读取DOC文件内容（Word 97-2003格式）
     */
    private static String readDocFile(File file) throws Exception {
        try (FileInputStream fis = new FileInputStream(file);
             WordExtractor extractor = new WordExtractor(fis)) {
            return extractor.getText();
        }
    }

    /**
     * 读取DOCX文件内容（Word 2007+格式）
     */
    private static String readDocxFile(File file) throws Exception {
        try (FileInputStream fis = new FileInputStream(file);
             XWPFDocument document = new XWPFDocument(fis);
             XWPFWordExtractor extractor = new XWPFWordExtractor(document)) {
            return extractor.getText();
        }
    }
}
