import type { ExportColumn, ExportRow } from "@/shared/lib/export-utils"
import { exportCSV } from "@/shared/lib/export-utils"

import type { CoursePlanWithItems } from "../types"

/**
 * course-plans 模块导出工具（纯函数 + 客户端下载）。
 *
 * 设计原则：
 * - `planToExportRows` 为纯函数，便于单测；不直接依赖 i18n，状态文本由调用方通过 columnLabels 传入
 * - `exportCoursePlanReport` 执行客户端下载，触发埋点由调用方处理
 */

/** 导出列标识（与 ExportRow 的 key 对应） */
export type CoursePlanExportColumnKey =
  | "week"
  | "topic"
  | "content"
  | "hours"
  | "textbookChapter"
  | "status"
  | "notes"

/** 列标签映射（由调用方传入已本地化的字符串） */
export interface CoursePlanColumnLabels {
  week: string
  topic: string
  content: string
  hours: string
  textbookChapter: string
  status: string
  notes: string
  /** 已完成状态文本 */
  completed: string
  /** 待完成状态文本 */
  pending: string
}

/**
 * 构建导出列配置（按固定顺序）。
 */
export function buildExportColumns(labels: CoursePlanColumnLabels): readonly ExportColumn[] {
  return [
    { key: "week", label: labels.week },
    { key: "topic", label: labels.topic },
    { key: "content", label: labels.content },
    { key: "hours", label: labels.hours },
    { key: "textbookChapter", label: labels.textbookChapter },
    { key: "status", label: labels.status },
    { key: "notes", label: labels.notes },
  ]
}

/**
 * 将课程计划转换为导出行（纯函数）。
 *
 * @param plan 课程计划
 * @param labels 列标签 + 状态文本
 */
export function planToExportRows(
  plan: CoursePlanWithItems,
  labels: CoursePlanColumnLabels,
): ExportRow[] {
  return plan.items.map((item) => ({
    week: item.week,
    topic: item.topic,
    content: item.content ?? "",
    hours: item.hours,
    textbookChapter: item.textbookChapter ?? "",
    status: item.isCompleted ? labels.completed : labels.pending,
    notes: item.notes ?? "",
  }))
}

/**
 * 客户端导出课程计划教学进度报告为 CSV。
 *
 * @param plan 课程计划
 * @param labels 列标签 + 状态文本
 * @param filename 文件名（不含扩展名）
 */
export function exportCoursePlanReport(
  plan: CoursePlanWithItems,
  labels: CoursePlanColumnLabels,
  filename: string,
): void {
  const columns = buildExportColumns(labels)
  const rows = planToExportRows(plan, labels)
  exportCSV(rows, columns, filename)
}
