/**
 * Excel工具函数
 * 包含模板生成、文件解析、去重等功能
 */

import * as XLSX from 'xlsx';

/**
 * 文献数据接口（临时，用于Excel解析）
 */
export interface LiteratureData {
  tempId?: string;
  key?: string;           // 文献ID编号（本项目的文献编号）
  title: string;          // 标题（必填）✅
  year?: number;          // 发表年份
  journal?: string;       // 期刊名称
  authors?: string;       // 作者列表
  language?: string;      // 语言（如：English, Chinese）
  abstract: string;       // 摘要（必填）✅
  pmid?: string;          // PubMed ID（可选）
  doi?: string;           // DOI编号（可选，用于去重）
  
  // 注意：以下字段是输出字段（AI筛选结果），导入时不需要
  // decision?: 'Included' | 'Excluded';
  // reasonForExcluded?: string;
  // notes?: string;
}

/**
 * 解析统计信息
 */
export interface ParseStatistics {
  total: number;          // 总数
  afterDedup: number;     // 去重后数量
  duplicates: number;     // 重复数量
  invalid: number;        // 无效数量
  errors: string[];       // 错误信息列表
}

/**
 * 生成并下载Excel模板
 */
export function downloadExcelTemplate(): void {
  // 创建工作簿
  const wb = XLSX.utils.book_new();
  
  // 模板数据（包含示例）- 按照测试数据的列顺序
  const templateData = [
    {
      'key': 'LIT001',
      'title': 'Effect of Empagliflozin on Cardiovascular Outcomes in Type 2 Diabetes',
      'year': 2015,
      'journal': 'N Engl J Med',
      'authors': 'Zinman B, Wanner C, Lachin JM, et al',
      'language': 'English',
      'abstract': 'Background: The effects of empagliflozin, a sodium-glucose cotransporter 2 inhibitor, in addition to standard care, on cardiovascular morbidity and mortality in patients with type 2 diabetes at high cardiovascular risk are not known. Methods: We randomly assigned patients with type 2 diabetes and established cardiovascular disease...',
      'PMID': '26378978',
      'DOI': '10.1056/NEJMoa1504720'
    },
    {
      'key': 'LIT002',
      'title': 'Dapagliflozin and Cardiovascular Outcomes in Type 2 Diabetes',
      'year': 2019,
      'journal': 'N Engl J Med',
      'authors': 'Wiviott SD, Raz I, Bonaca MP, et al',
      'language': 'English',
      'abstract': 'Background: Additional therapeutic interventions are needed to reduce the risk of cardiovascular events in patients with type 2 diabetes mellitus. Methods: We randomly assigned patients with type 2 diabetes who had or were at risk for atherosclerotic cardiovascular disease...',
      'PMID': '30415602',
      'DOI': '10.1056/NEJMoa1812389'
    },
    {
      'key': 'LIT003',
      'title': '请删除此示例行，并填写您自己的文献数据',
      'year': '',
      'journal': '',
      'authors': '',
      'language': '',
      'abstract': '摘要至少需要50个字符。title和abstract是必填字段，其他字段可选。系统会自动根据DOI和title去重。',
      'PMID': '',
      'DOI': ''
    }
  ];
  
  // 创建工作表
  const ws = XLSX.utils.json_to_sheet(templateData);
  
  // 设置列宽
  ws['!cols'] = [
    { wch: 10 },  // key
    { wch: 60 },  // title
    { wch: 8 },   // year
    { wch: 30 },  // journal
    { wch: 40 },  // authors
    { wch: 12 },  // language
    { wch: 80 },  // abstract
    { wch: 12 },  // PMID
    { wch: 25 },  // DOI
  ];
  
  // 添加工作表到工作簿
  XLSX.utils.book_append_sheet(wb, ws, '文献列表');
  
  // 添加说明工作表
  const instructionData = [
    { '字段名': 'key', '是否必填': '❌ 否', '说明': '文献ID编号（本项目的文献编号，如：LIT001）' },
    { '字段名': 'title', '是否必填': '✅ 是', '说明': '文献标题，至少10个字符' },
    { '字段名': 'year', '是否必填': '❌ 否', '说明': '发表年份（如：2019）' },
    { '字段名': 'journal', '是否必填': '❌ 否', '说明': '期刊名称（如：N Engl J Med）' },
    { '字段名': 'authors', '是否必填': '❌ 否', '说明': '作者列表（如：Smith A, Li B, et al）' },
    { '字段名': 'language', '是否必填': '❌ 否', '说明': '语言（如：English, Chinese）' },
    { '字段名': 'abstract', '是否必填': '✅ 是', '说明': '文献摘要，至少50个字符' },
    { '字段名': 'PMID', '是否必填': '❌ 否', '说明': 'PubMed ID（可选）' },
    { '字段名': 'DOI', '是否必填': '❌ 否', '说明': 'DOI编号（可选，用于去重）' },
  ];
  
  const wsInstruction = XLSX.utils.json_to_sheet(instructionData);
  wsInstruction['!cols'] = [
    { wch: 15 },
    { wch: 12 },
    { wch: 60 },
  ];
  XLSX.utils.book_append_sheet(wb, wsInstruction, '字段说明');
  
  // 生成Excel文件并下载
  XLSX.writeFile(wb, '文献导入模板.xlsx');
}

/**
 * 解析Excel文件（内存中，不落盘）
 */
export async function parseExcelFile(file: File): Promise<LiteratureData[]> {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    
    reader.onload = (e) => {
      try {
        const buffer = e.target?.result as ArrayBuffer;
        const workbook = XLSX.read(buffer, { type: 'array' });
        
        // 读取第一个工作表
        const firstSheetName = workbook.SheetNames[0];
        const worksheet = workbook.Sheets[firstSheetName];
        const jsonData = XLSX.utils.sheet_to_json<any>(worksheet);
        
        // 字段映射（支持中英文列名）
        const literatures: LiteratureData[] = jsonData.map((row, index) => {
          // 处理年份字段
          let year: number | undefined = undefined;
          const yearValue = row.year || row.Year || row['年份'];
          if (yearValue) {
            const parsed = parseInt(String(yearValue));
            if (!isNaN(parsed)) {
              year = parsed;
            }
          }
          
          return {
            tempId: `temp-${Date.now()}-${index}`,
            key: String(row.key || row.Key || row['文献ID'] || '').trim() || undefined,
            title: String(row.title || row.Title || row['标题'] || '').trim(),
            year: year,
            journal: String(row.journal || row.Journal || row['期刊'] || '').trim() || undefined,
            authors: String(row.authors || row.Authors || row['作者'] || '').trim() || undefined,
            language: String(row.language || row.Language || row['语言'] || '').trim() || undefined,
            abstract: String(row.abstract || row.Abstract || row['摘要'] || '').trim(),
            pmid: String(row.PMID || row.pmid || row['PMID编号'] || '').trim() || undefined,
            doi: String(row.DOI || row.doi || '').trim() || undefined,
          };
        });
        
        resolve(literatures);
      } catch (error) {
        reject(new Error(`Excel文件解析失败: ${(error as Error).message}`));
      }
    };
    
    reader.onerror = () => {
      reject(new Error('文件读取失败'));
    };
    
    reader.readAsArrayBuffer(file);
  });
}

/**
 * 验证单条文献数据
 */
export function validateLiterature(lit: LiteratureData): string[] {
  const errors: string[] = [];
  
  if (!lit.title) {
    errors.push('标题不能为空');
  } else if (lit.title.length < 10) {
    errors.push('标题太短（至少10个字符）');
  }
  
  if (!lit.abstract) {
    errors.push('摘要不能为空');
  } else if (lit.abstract.length < 50) {
    errors.push('摘要太短（至少50个字符）');
  }
  
  return errors;
}

/**
 * 批量验证文献数据
 */
export function validateLiteratures(literatures: LiteratureData[]): {
  valid: LiteratureData[];
  invalid: Array<{ literature: LiteratureData; errors: string[] }>;
} {
  const valid: LiteratureData[] = [];
  const invalid: Array<{ literature: LiteratureData; errors: string[] }> = [];
  
  literatures.forEach((lit) => {
    const errors = validateLiterature(lit);
    if (errors.length === 0) {
      valid.push(lit);
    } else {
      invalid.push({ literature: lit, errors });
    }
  });
  
  return { valid, invalid };
}

/**
 * 去重逻辑
 * 优先级：DOI > Title（标准化）
 */
export function deduplicateLiteratures(literatures: LiteratureData[]): {
  unique: LiteratureData[];
  duplicates: LiteratureData[];
} {
  const seen = new Map<string, LiteratureData>();
  const unique: LiteratureData[] = [];
  const duplicates: LiteratureData[] = [];
  
  for (const lit of literatures) {
    let key: string;
    
    // 优先使用DOI作为去重键
    if (lit.doi && lit.doi.trim() !== '') {
      key = `doi:${lit.doi.toLowerCase().trim()}`;
    } else {
      // 使用标题（标准化：转小写、去掉所有空白字符）
      key = `title:${lit.title.toLowerCase().replace(/\s+/g, '')}`;
    }
    
    if (seen.has(key)) {
      duplicates.push(lit);
    } else {
      seen.set(key, lit);
      unique.push(lit);
    }
  }
  
  return { unique, duplicates };
}

/**
 * 完整的Excel处理流程
 * 解析 → 验证 → 去重
 */
export async function processExcelFile(file: File): Promise<{
  valid: LiteratureData[];
  statistics: ParseStatistics;
}> {
  // 1. 解析Excel
  const parsedData = await parseExcelFile(file);
  
  // 2. 验证数据
  const { valid: validData, invalid: invalidData } = validateLiteratures(parsedData);
  
  // 3. 去重
  const { unique: uniqueData, duplicates: duplicateData } = deduplicateLiteratures(validData);
  
  // 4. 统计信息
  const statistics: ParseStatistics = {
    total: parsedData.length,
    afterDedup: uniqueData.length,
    duplicates: duplicateData.length,
    invalid: invalidData.length,
    errors: invalidData.slice(0, 5).map((item, index) => 
      `行 ${index + 1}: ${item.errors.join(', ')}`
    ),
  };
  
  return {
    valid: uniqueData,
    statistics,
  };
}

