/**
 * v4-P3-7: 诊断报告数据置信度工具。
 * v2-P1-5: 改进为基于知识点数量的多级置信度计算。
 *
 * 置信度等级用于指示报告基于的数据量是否充足，帮助教师判断报告可信度。
 * 提取到独立文件供 report-list 和 student-diagnostic-view 共享，避免重复定义。
 */

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

export type ConfidenceLevel = "high" | "medium" | "low" | "insufficient"

/** 置信度阈值（基于知识点数量 = strengths.length + weaknesses.length） */
const CONFIDENCE_INSUFFICIENT_MAX = 0
const CONFIDENCE_LOW_MAX = 3
const CONFIDENCE_MEDIUM_MAX = 8

/**
 * v2-P1-5: 根据报告数据计算置信度。
 *
 * 置信度基于报告中涉及的知识点数量（strengths + weaknesses 数组长度之和）：
 * - 0 个知识点 → insufficient（数据不足）
 * - 1-3 个 → low（数据较少，结论仅供参考）
 * - 4-8 个 → medium（数据量一般，建议结合其他信息参考）
 * - >8 个 → high（数据充足，报告结论可靠）
 *
 * 若 overallScore 为 null 也视为 insufficient。
 *
 * @param report 诊断报告（含详情）
 * @param totalKnowledgePoints 可选：显式传入知识点总数（优先于数组长度推断）
 */
export function getConfidenceLevel(
  report: DiagnosticReportWithDetails,
  totalKnowledgePoints?: number,
): ConfidenceLevel {
  if (report.overallScore === null) return "insufficient"

  // 优先使用显式传入的知识点数；否则从 strengths + weaknesses 数组推断
  const kpCount =
    totalKnowledgePoints ??
    (report.strengths?.length ?? 0) + (report.weaknesses?.length ?? 0)

  if (kpCount <= CONFIDENCE_INSUFFICIENT_MAX) return "insufficient"
  if (kpCount <= CONFIDENCE_LOW_MAX) return "low"
  if (kpCount <= CONFIDENCE_MEDIUM_MAX) return "medium"
  return "high"
}

export const confidenceBadgeVariant: Record<
  ConfidenceLevel,
  "default" | "secondary" | "destructive" | "outline"
> = {
  high: "default",
  medium: "secondary",
  low: "destructive",
  insufficient: "outline",
}
