/**
 * 通用 CSV 导出工具（共享层）。
 *
 * 纯函数实现，便于单测。支持 CSV 格式导出，兼容 Excel（含 UTF-8 BOM）。
 * PDF 导出需要客户端库（如 jsPDF），作为后续扩展点。
 */

/** 导出数据行类型 */
export interface ExportRow {
  [key: string]: string | number | boolean | null
}

/** 导出列配置 */
export interface ExportColumn {
  /** 数据字段名 */
  key: string
  /** 导出列标题 */
  label: string
}

/**
 * 将数据行数组转换为 CSV 字符串。
 *
 * - 添加 UTF-8 BOM 以支持 Excel 正确显示中文
 * - 字段值包含逗号、换行、引号时自动转义
 * - null/undefined 转为空字符串
 */
export function toCSV(rows: readonly ExportRow[], columns: readonly ExportColumn[]): string {
  const BOM = "\uFEFF"
  const escapeCell = (value: string | number | boolean | null): string => {
    if (value === null || value === undefined) return ""
    const str = String(value)
    if (str.includes(",") || str.includes("\n") || str.includes('"')) {
      return `"${str.replace(/"/g, '""')}"`
    }
    return str
  }

  const header = columns.map((c) => escapeCell(c.label)).join(",")
  const body = rows
    .map((row) => columns.map((c) => escapeCell(row[c.key] ?? null)).join(","))
    .join("\n")

  return `${BOM}${header}\n${body}`
}

/**
 * 触发浏览器下载文件（客户端调用）。
 *
 * 创建临时 Blob URL 并模拟点击下载，
 * 下载完成后自动清理 URL。
 */
export function downloadFile(content: string, filename: string, mimeType = "text/csv;charset=utf-8"): void {
  const blob = new Blob([content], { type: mimeType })
  const url = URL.createObjectURL(blob)
  const link = document.createElement("a")
  link.href = url
  link.download = filename
  link.style.display = "none"
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
  URL.revokeObjectURL(url)
}

/**
 * 导出数据为 CSV（便捷方法）。
 *
 * @param rows 数据行
 * @param columns 列配置
 * @param filename 文件名（不含扩展名）
 */
export function exportCSV(
  rows: readonly ExportRow[],
  columns: readonly ExportColumn[],
  filename: string,
): void {
  const csv = toCSV(rows, columns)
  downloadFile(csv, `${filename}.csv`)
}
