/**
 * Excel导出工具（云原生：前端生成，零文件落盘）
 * 
 * 使用 xlsx 库在浏览器内存中生成Excel文件，完全避免文件落盘。
 * 符合云原生架构原则。
 */

import * as XLSX from 'xlsx';
import { ScreeningResult } from '../types';

/**
 * 导出筛选结果到Excel（混合方案格式）
 * 
 * @param results 筛选结果数组
 * @param options 导出选项
 * @param options.filter 筛选类型（用于文件名）
 * @param options.projectName 项目名称（用于文件名）
 */
export function exportScreeningResults(
  results: ScreeningResult[],
  options: {
    filter?: 'all' | 'included' | 'excluded' | 'pending';
    projectName?: string;
  } = {}
) {
  // 1. ⭐ 混合方案：准备完整的导出数据（一个文献一行，信息全面）
  const exportData = results.map((r, idx) => {
    // AI共识状态
    const isAIConsistent = r.dsConclusion === r.qwenConclusion;
    const aiConsensus = isAIConsistent 
      ? `${r.dsConclusion === 'include' ? '纳入' : '排除'}(一致)` 
      : `冲突(DS:${r.dsConclusion === 'include' ? '纳入' : '排除'}, QW:${r.qwenConclusion === 'include' ? '纳入' : '排除'})`;
    
    // 人工决策状态
    let humanDecision = '未复核';
    let reviewStatus = '待复核';
    if (r.finalDecision) {
      humanDecision = r.finalDecision === 'include' ? '纳入' : '排除';
      const isOverride = r.dsConclusion !== r.finalDecision || r.qwenConclusion !== r.finalDecision;
      reviewStatus = isOverride ? '已复核-推翻AI' : '已复核-与AI一致';
    } else {
      reviewStatus = isAIConsistent ? '待复核-AI一致' : '待复核-有冲突';
    }

    return {
      // 基础信息
      '序号': idx + 1,
      '文献标题': r.literature.title,
      '摘要': r.literature.abstract || '',
      '作者': r.literature.authors || '',
      '期刊': r.literature.journal || '',
      '发表年份': r.literature.publicationYear || '',
      'PMID': r.literature.pmid || '',
      'DOI': r.literature.doi || '',
      
      // ⭐ 混合方案：AI共识
      'AI共识': aiConsensus,
      'AI是否一致': isAIConsistent ? '是' : '否',
      
      // DeepSeek完整分析
      'DeepSeek决策': r.dsConclusion === 'include' ? '纳入' : '排除',
      'DeepSeek置信度': r.dsConfidence ? `${(r.dsConfidence * 100).toFixed(0)}%` : '',
      'DeepSeek-P判断': formatJudgment(r.dsPJudgment),
      'DeepSeek-P证据': r.dsPEvidence || '',
      'DeepSeek-I判断': formatJudgment(r.dsIJudgment),
      'DeepSeek-I证据': r.dsIEvidence || '',
      'DeepSeek-C判断': formatJudgment(r.dsCJudgment),
      'DeepSeek-C证据': r.dsCEvidence || '',
      'DeepSeek-S判断': formatJudgment(r.dsSJudgment),
      'DeepSeek-S证据': r.dsSEvidence || '',
      'DeepSeek排除理由': r.dsReason || '',
      
      // Qwen完整分析
      'Qwen决策': r.qwenConclusion === 'include' ? '纳入' : '排除',
      'Qwen置信度': r.qwenConfidence ? `${(r.qwenConfidence * 100).toFixed(0)}%` : '',
      'Qwen-P判断': formatJudgment(r.qwenPJudgment),
      'Qwen-P证据': r.qwenPEvidence || '',
      'Qwen-I判断': formatJudgment(r.qwenIJudgment),
      'Qwen-I证据': r.qwenIEvidence || '',
      'Qwen-C判断': formatJudgment(r.qwenCJudgment),
      'Qwen-C证据': r.qwenCEvidence || '',
      'Qwen-S判断': formatJudgment(r.qwenSJudgment),
      'Qwen-S证据': r.qwenSEvidence || '',
      'Qwen排除理由': r.qwenReason || '',
      
      // ⭐ 混合方案：人工决策
      '人工决策': humanDecision,
      '人工排除原因': r.exclusionReason || '',
      '复核人': r.finalDecisionBy || '',
      '复核时间': r.finalDecisionAt ? new Date(r.finalDecisionAt).toLocaleString('zh-CN') : '',
      
      // ⭐ 混合方案：状态
      '状态': reviewStatus,
      '冲突状态': r.conflictStatus === 'conflict' ? '冲突' : '无冲突',
    };
  });

  // 2. ⭐ 生成Excel（完全在内存中，零文件落盘）
  const ws = XLSX.utils.json_to_sheet(exportData);
  
  // 3. ⭐ 混合方案：设置列宽（信息全面，列可以很长）
  ws['!cols'] = [
    // 基础信息
    { wch: 6 },   // 序号
    { wch: 50 },  // 文献标题
    { wch: 80 },  // 摘要
    { wch: 30 },  // 作者
    { wch: 30 },  // 期刊
    { wch: 10 },  // 发表年份
    { wch: 12 },  // PMID
    { wch: 25 },  // DOI
    
    // AI共识
    { wch: 25 },  // AI共识
    { wch: 12 },  // AI是否一致
    
    // DeepSeek完整分析
    { wch: 12 },  // DeepSeek决策
    { wch: 12 },  // DeepSeek置信度
    { wch: 12 },  // DeepSeek-P判断
    { wch: 50 },  // DeepSeek-P证据
    { wch: 12 },  // DeepSeek-I判断
    { wch: 50 },  // DeepSeek-I证据
    { wch: 12 },  // DeepSeek-C判断
    { wch: 50 },  // DeepSeek-C证据
    { wch: 12 },  // DeepSeek-S判断
    { wch: 50 },  // DeepSeek-S证据
    { wch: 60 },  // DeepSeek排除理由
    
    // Qwen完整分析
    { wch: 12 },  // Qwen决策
    { wch: 12 },  // Qwen置信度
    { wch: 12 },  // Qwen-P判断
    { wch: 50 },  // Qwen-P证据
    { wch: 12 },  // Qwen-I判断
    { wch: 50 },  // Qwen-I证据
    { wch: 12 },  // Qwen-C判断
    { wch: 50 },  // Qwen-C证据
    { wch: 12 },  // Qwen-S判断
    { wch: 50 },  // Qwen-S证据
    { wch: 60 },  // Qwen排除理由
    
    // 人工决策
    { wch: 12 },  // 人工决策
    { wch: 40 },  // 人工排除原因
    { wch: 15 },  // 复核人
    { wch: 20 },  // 复核时间
    
    // 状态
    { wch: 18 },  // 状态
    { wch: 12 },  // 冲突状态
  ];

  // 4. 创建工作簿并添加工作表
  const wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, ws, '筛选结果');

  // 5. 生成文件名
  const timestamp = new Date().toISOString().slice(0, 10);
  const filterSuffix = options.filter && options.filter !== 'all' ? `_${options.filter}` : '';
  const filename = `${options.projectName || '筛选结果'}${filterSuffix}_${timestamp}.xlsx`;

  // 6. ⭐ 触发浏览器下载（零文件落盘）
  XLSX.writeFile(wb, filename);
}

/**
 * 格式化判断结果为中文
 */
function formatJudgment(judgment: string | null): string {
  switch (judgment) {
    case 'match':
      return '匹配';
    case 'partial':
      return '部分匹配';
    case 'mismatch':
      return '不匹配';
    default:
      return '';
  }
}

/**
 * 导出统计摘要到Excel（额外功能，可选）
 * 
 * @param stats 统计数据
 * @param projectName 项目名称
 */
export function exportStatisticsSummary(
  stats: {
    total: number;
    included: number;
    excluded: number;
    pending: number;
    conflict: number;
    exclusionReasons: Record<string, number>;
  },
  projectName?: string
) {
  // 准备统计摘要数据
  const summaryData = [
    { '项目': '统计项', '数量': '值', '百分比': '比例' },
    { '项目': '总文献数', '数量': stats.total, '百分比': '100%' },
    { '项目': '已纳入', '数量': stats.included, '百分比': `${((stats.included / stats.total) * 100).toFixed(1)}%` },
    { '项目': '已排除', '数量': stats.excluded, '百分比': `${((stats.excluded / stats.total) * 100).toFixed(1)}%` },
    { '项目': '待复核', '数量': stats.pending, '百分比': `${((stats.pending / stats.total) * 100).toFixed(1)}%` },
    { '项目': '有冲突', '数量': stats.conflict, '百分比': `${((stats.conflict / stats.total) * 100).toFixed(1)}%` },
  ];

  // 准备排除原因数据
  const reasonsData = Object.entries(stats.exclusionReasons).map(([reason, count]) => ({
    '排除原因': reason,
    '数量': count,
    '占排除总数比例': `${((count / stats.excluded) * 100).toFixed(1)}%`,
  }));

  const wb = XLSX.utils.book_new();
  
  // Sheet 1: 统计摘要
  const ws1 = XLSX.utils.json_to_sheet(summaryData);
  XLSX.utils.book_append_sheet(wb, ws1, '统计摘要');
  
  // Sheet 2: 排除原因
  const ws2 = XLSX.utils.json_to_sheet(reasonsData);
  XLSX.utils.book_append_sheet(wb, ws2, '排除原因分析');

  // 生成文件名
  const timestamp = new Date().toISOString().slice(0, 10);
  const filename = `${projectName || '项目'}_统计摘要_${timestamp}.xlsx`;

  // 触发下载
  XLSX.writeFile(wb, filename);
}

