import type { StatusVariantMap } from "@/shared/components/ui/status-badge"

export type GradeRecordType = "exam" | "quiz" | "homework" | "other"
export type GradeRecordSemester = "1" | "2"

/** 成绩记录类型 → Badge variant 映射（用于 grade-record-list / student-grade-summary） */
export const GRADE_TYPE_VARIANT: StatusVariantMap<GradeRecordType> = {
  exam: "default",
  quiz: "secondary",
  homework: "outline",
  other: "outline",
}

export interface GradeRecord {
  id: string
  studentId: string
  classId: string
  subjectId: string
  examId: string | null
  academicYearId: string | null
  title: string
  score: string
  fullScore: string
  type: GradeRecordType
  semester: GradeRecordSemester
  recordedBy: string
  remark: string | null
  createdAt: string
  updatedAt: string
}

export interface GradeRecordListItem {
  id: string
  studentId: string
  studentName: string
  classId: string
  className: string
  subjectId: string
  subjectName: string
  examId: string | null
  title: string
  score: number
  fullScore: number
  type: GradeRecordType
  semester: GradeRecordSemester
  recordedBy: string
  recorderName: string
  remark: string | null
  createdAt: string
}

export interface GradeStats {
  average: number
  median: number
  max: number
  min: number
  stdDev: number
  passRate: number
  excellentRate: number
  count: number
}

export interface ClassGradeStats {
  classId: string
  className: string
  stats: GradeStats
  studentCount: number
}

/**
 * v3-P2-9: 全校成绩汇总（按年级聚合）。
 */
export interface SchoolWideGradeSummaryItem {
  gradeId: string
  gradeName: string
  schoolName: string
  classCount: number
  studentCount: number
  averageScore: number
  passRate: number
  excellentRate: number
  recordCount: number
}

export interface SchoolWideGradeSummary {
  grades: SchoolWideGradeSummaryItem[]
  totals: {
    gradeCount: number
    classCount: number
    studentCount: number
    recordCount: number
    averageScore: number
    passRate: number
    excellentRate: number
  }
}

export interface StudentGradeSummary {
  studentId: string
  studentName: string
  records: GradeRecordListItem[]
  averageScore: number
  rank: number
}

export interface ClassRankingItem {
  studentId: string
  studentName: string
  averageScore: number
  rank: number
  recordCount: number
}

export interface GradeQueryParams {
  classId?: string
  subjectId?: string
  studentId?: string
  type?: GradeRecordType
  semester?: GradeRecordSemester
  examId?: string
}

// --- Analytics Types ---

export interface GradeTrendPoint {
  /** ISO date string of the grade record creation */
  date: string
  /** Title of the exam/assessment */
  title: string
  /** Raw score */
  score: number
  /** Full score for this record */
  fullScore: number
  /** Score normalized to 0-100 scale for cross-record comparison */
  normalizedScore: number
  /** Type of grade record */
  type: GradeRecordType
}

export interface GradeTrendResult {
  /** Label for the trend series (e.g. class name + subject) */
  label: string
  /** Sorted ascending by date */
  points: GradeTrendPoint[]
  /** Average of normalized scores */
  averageScore: number
}

export interface ClassComparisonItem {
  classId: string
  className: string
  /** Average score (normalized to 0-100) */
  averageScore: number
  /** Median score */
  medianScore: number
  /** Pass rate (score/fullScore >= 0.6) */
  passRate: number
  /** Excellent rate (score/fullScore >= 0.85) */
  excellentRate: number
  /** Number of grade records */
  count: number
  /** Number of unique students */
  studentCount: number
}

/**
 * P3-5: 班级对比的统计显著性结果。
 * 由 data-access 层使用 stats-service.computeSignificance 计算后注入到 UI。
 */
export interface ClassComparisonSignificance {
  /** 最高分班级 ID */
  topClassId: string
  /** 最低分班级 ID */
  bottomClassId: string
  /** Cohen's d 效应量 */
  cohensD: number
  /** 效应量标签 */
  effectSizeLabel: "negligible" | "small" | "medium" | "large"
  /** p 值（双侧） */
  pValue: number
  /** 是否统计显著（p < 0.05） */
  isSignificant: boolean
}

/**
 * P3-5: 班级对比结果（聚合 items + 显著性分析）。
 */
export interface ClassComparisonResult {
  items: ClassComparisonItem[]
  significance: ClassComparisonSignificance | null
}

export interface SubjectComparisonItem {
  subjectId: string
  subjectName: string
  /** Average normalized score (0-100) */
  averageScore: number
  /** Median normalized score */
  medianScore: number
  /** Pass rate */
  passRate: number
  /** Excellent rate */
  excellentRate: number
  /** Number of records */
  count: number
}

export interface GradeDistributionBucket {
  /** Bucket label e.g. "90-100" */
  label: string
  /** Lower bound (inclusive) */
  min: number
  /** Upper bound (inclusive) */
  max: number
  /** Number of students in this bucket */
  count: number
}

export interface GradeDistributionResult {
  buckets: GradeDistributionBucket[]
  totalCount: number
}

/**
 * P3-9: 班级分布 + 学生位置（隐私保护视图）。
 * 用于学生视角查看班级分布时标注自己所在分数段。
 */
export interface GradeDistributionWithPosition {
  /** 班级分布（不含学生身份） */
  distribution: GradeDistributionResult
  /** 班级 ID */
  classId: string
  /** 班级名称（用于展示） */
  className: string
  /** 当前学生的最近一次归一化分数（0-100） */
  studentNormalizedScore: number | null
  /** 学生所在桶的索引（-1 表示无有效分数） */
  studentBucketIndex: number
}

/**
 * P3-4: 学生纵向成长档案的单个数据点。
 *
 * 每个点代表一个学年 + 学期的聚合统计。
 * 跨学年/学期的连续点串联成长轨迹，便于长期趋势分析。
 */
export interface StudentGrowthArchivePoint {
  /** 学年 ID */
  academicYearId: string
  /** 学年名称（如 "2024-2025"） */
  academicYearName: string
  /** 学期（"1" 第一学期 / "2" 第二学期） */
  semester: GradeRecordSemester
  /** 该学期归一化平均分（0-100） */
  averageScore: number
  /** 该学期归一化中位数 */
  medianScore: number
  /** 该学期及格率（0-100） */
  passRate: number
  /** 该学期优秀率（0-100） */
  excellentRate: number
  /** 该学期成绩记录数 */
  recordCount: number
  /** 该学期涉及科目数 */
  subjectCount: number
  /** 该学期参与的不同考试/作业数 */
  assessmentCount: number
  /** 学年开始时间（ISO 字符串，用于按时间排序） */
  academicYearStart: string
}

/**
 * P3-4: 学生纵向成长档案结果。
 *
 * 跨学年/学期的聚合统计，用于绘制长期成长趋势图。
 */
export interface StudentGrowthArchiveResult {
  /** 学生 ID */
  studentId: string
  /** 学生姓名 */
  studentName: string
  /** 按 (学年 start, 学期) 升序排列的成长点 */
  points: StudentGrowthArchivePoint[]
  /** 总览：所有记录的整体平均分 */
  overallAverage: number
  /** 总览：所有记录总数 */
  totalRecords: number
  /** 总览：所有涉及的科目数 */
  totalSubjects: number
  /** 总览：跨越的学年数 */
  totalAcademicYears: number
  /** 成长趋势：最新点平均分 - 第一个点平均分（>0 表示提升，<0 表示下降） */
  growthDelta: number
}

/**
 * 年级维度成绩分布（按班级拆分）。
 * 用于年级主任/教学主任仪表盘的"成绩分布"维度。
 */
export interface GradeDistributionByGradeClassItem {
  classId: string
  className: string
  distribution: GradeDistributionResult
  stats: GradeStats | null
}

export interface GradeDistributionByGradeResult {
  /** 年级整体分布（已应用 scope 过滤） */
  overall: GradeDistributionResult
  /** 年级整体统计（均分/及格率/优秀率等） */
  stats: GradeStats | null
  /** 按班级拆分的分布 + 统计 */
  byClass: GradeDistributionByGradeClassItem[]
}

export interface RankingTrendPoint {
  /** Title of the exam/assessment */
  title: string
  /** ISO date string */
  date: string
  /** Student's average score (normalized) */
  score: number
  /** Rank in class for this assessment (1-based) */
  rank: number
  /** Total students participating */
  totalStudents: number
}

export interface RankingTrendResult {
  studentId: string
  studentName: string
  points: RankingTrendPoint[]
}

/**
 * v3-P2-2: 班级平均成绩趋势点（按 assessment title 分组）。
 * 用于在学生个人趋势图上叠加班级平均对比线。
 */
export interface ClassAverageTrendPoint {
  /** Assessment title（与 RankingTrendPoint.title 对齐） */
  title: string
  /** ISO date string */
  date: string
  /** 班级本次 assessment 的平均分（normalized 0-100） */
  averageScore: number
  /** 参与本次 assessment 的学生数 */
  studentCount: number
}

export interface ClassAverageTrendResult {
  classId: string
  points: ClassAverageTrendPoint[]
}

/** 通用选项类型（id + name），供过滤器/选择器组件复用 */
export interface SelectOption {
  id: string
  name: string
}

// --- 按试卷批量录入（每题得分）---

/** 成绩每题得分记录（对应 grade_record_answers 表） */
export interface GradeRecordAnswer {
  id: string
  gradeRecordId: string
  questionId: string
  score: number
  fullScore: number
  feedback: string | null
  createdAt: string
  updatedAt: string
}

/** 单个学生的每题得分录入项 */
export interface BatchGradeEntryByExamQuestion {
  questionId: string
  score: number
}

/** 单个学生的录入项 */
export interface BatchGradeEntryByExamItem {
  studentId: string
  answers: BatchGradeEntryByExamQuestion[]
  remark?: string
}
