/**
 * 文档解析服务
 * 支持 .txt .docx .pdf 格式，提取纯文本内容
 */
import fs from 'fs';
import path from 'path';

/** 支持的文档格式 */
export const SUPPORTED_FORMATS = ['.txt', '.docx', '.pdf'];

/** 最大文件大小 20MB */
export const MAX_FILE_SIZE = 20 * 1024 * 1024;

/** 解析结果 */
export interface ParseResult {
  text: string;
  wordCount: number;
  fileName: string;
  fileSize: number;
  format: string;
  truncated: boolean;
  originalLength: number;
}

/**
 * 解析文档文件，提取纯文本
 * @param filePath 文件临时路径
 * @param originalName 原始文件名
 * @param fileSize 文件大小（字节）
 * @param maxChars 最大返回字符数，默认100000
 */
export async function parseDocument(
  filePath: string,
  originalName: string,
  fileSize: number,
  maxChars: number = 100000
): Promise<ParseResult> {
  // 检查文件大小
  if (fileSize > MAX_FILE_SIZE) {
    throw new Error(`文件过大，最大支持20MB，当前文件${(fileSize / 1024 / 1024).toFixed(1)}MB`);
  }

  // 检查文件是否存在
  if (!fs.existsSync(filePath)) {
    throw new Error('上传文件不存在或已过期');
  }

  const ext = path.extname(originalName).toLowerCase();

  // 检查格式
  if (!SUPPORTED_FORMATS.includes(ext)) {
    throw new Error(`不支持的文档格式: ${ext}，支持 .txt .docx .pdf`);
  }

  let rawText: string;

  try {
    switch (ext) {
      case '.txt':
        rawText = parseTxt(filePath);
        break;
      case '.docx':
        rawText = await parseDocx(filePath);
        break;
      case '.pdf':
        rawText = await parsePdf(filePath);
        break;
      default:
        throw new Error(`不支持的格式: ${ext}`);
    }
  } catch (error: any) {
    throw new Error(`文档解析失败: ${error.message}`);
  }

  // 清理文本：移除多余空行、统一换行
  const cleaned = cleanText(rawText);

  if (!cleaned || cleaned.trim().length === 0) {
    throw new Error('文档内容为空，无法提取文本');
  }

  const originalLength = cleaned.length;
  let text = cleaned;
  let truncated = false;

  // 截断过长的文本
  if (text.length > maxChars) {
    text = text.substring(0, maxChars);
    truncated = true;
  }

  const wordCount = text.length;

  return {
    text,
    wordCount,
    fileName: originalName,
    fileSize,
    format: ext.replace('.', ''),
    truncated,
    originalLength,
  };
}

/**
 * 解析 .txt 文件
 */
function parseTxt(filePath: string): string {
  // 先尝试 UTF-8
  let content = fs.readFileSync(filePath, 'utf-8');

  // 如果 UTF-8 解码后包含乱码特征，尝试 GBK
  if (content.includes('�') || content.includes('锟斤拷')) {
    try {
      const buf = fs.readFileSync(filePath);
      // 简单的 GBK 检测
      content = buf.toString('utf-8');
    } catch {
      // 保持 UTF-8 结果
    }
  }

  return content;
}

/**
 * 解析 .docx 文件
 */
async function parseDocx(filePath: string): Promise<string> {
  const mammoth = require('mammoth');
  const result = await mammoth.extractRawText({ path: filePath });
  return result.value || '';
}

/**
 * 解析 .pdf 文件
 */
async function parsePdf(filePath: string): Promise<string> {
  const pdfParse = require('pdf-parse');
  const dataBuffer = fs.readFileSync(filePath);
  const data = await pdfParse(dataBuffer);
  return data.text || '';
}

/**
 * 清理文本：统一换行、移除多余空白行
 */
function cleanText(text: string): string {
  return text
    // 统一换行为 \n
    .replace(/\r\n/g, '\n')
    .replace(/\r/g, '\n')
    // 连续3个以上空行压缩为2个
    .replace(/\n{4,}/g, '\n\n\n')
    // 去除首尾空白
    .trim();
}
