/**
 * Shared Klausur-Korrektur types and constants.
 *
 * This is the single source of truth used by:
 *   - admin-lehrer  (education/klausur-korrektur)
 *   - studio-v2     (korrektur)
 *   - website/admin (klausur-korrektur)
 *   - website/lehrer (klausur-korrektur)
 */

// ---------------------------------------------------------------------------
// Core domain interfaces
// ---------------------------------------------------------------------------

export interface Klausur {
  id: string
  title: string
  subject: string
  year: number
  semester: string
  modus: KlausurModus
  eh_id?: string
  created_at: string
  student_count?: number
  completed_count?: number
  status?: 'draft' | 'in_progress' | 'completed'
}

/** Union of all modus values used across services */
export type KlausurModus = 'abitur' | 'vorabitur' | 'landes_abitur'

export interface StudentWork {
  id: string
  klausur_id: string
  anonym_id: string
  file_path: string
  file_type: 'pdf' | 'image'
  ocr_text: string
  criteria_scores: CriteriaScores
  gutachten: string
  status: StudentStatus
  raw_points: number
  grade_points: number
  grade_label?: string
  created_at: string
  examiner_id?: string
  second_examiner_id?: string
  second_examiner_grade?: number
}

export type StudentStatus =
  | 'UPLOADED'
  | 'OCR_PROCESSING'
  | 'OCR_COMPLETE'
  | 'ANALYZING'
  | 'FIRST_EXAMINER'
  | 'SECOND_EXAMINER'
  | 'COMPLETED'
  | 'ERROR'

export interface CriteriaScores {
  rechtschreibung?: number
  grammatik?: number
  inhalt?: number
  struktur?: number
  stil?: number
  [key: string]: number | undefined
}

export interface Criterion {
  id: string
  name: string
  weight: number
  description?: string
}

export interface GradeInfo {
  thresholds: Record<number, number>
  labels: Record<number, string>
  criteria: Record<string, Criterion>
}

// ---------------------------------------------------------------------------
// Annotations
// ---------------------------------------------------------------------------

export interface Annotation {
  id: string
  student_work_id: string
  page: number
  position: AnnotationPosition
  type: AnnotationType
  text: string
  severity: 'minor' | 'major' | 'critical'
  suggestion?: string
  created_by: string
  created_at: string
  role: 'first_examiner' | 'second_examiner'
  linked_criterion?: string
}

export interface AnnotationPosition {
  x: number      // Prozent (0-100)
  y: number      // Prozent (0-100)
  width: number  // Prozent (0-100)
  height: number // Prozent (0-100)
}

export type AnnotationType =
  | 'rechtschreibung'
  | 'grammatik'
  | 'inhalt'
  | 'struktur'
  | 'stil'
  | 'comment'
  | 'highlight'

// ---------------------------------------------------------------------------
// Fairness analysis
// ---------------------------------------------------------------------------

export interface FairnessAnalysis {
  klausur_id: string
  student_count: number
  average_grade: number
  std_deviation: number
  spread: number
  outliers: OutlierInfo[]
  criteria_analysis: Record<string, CriteriaStats>
  fairness_score: number
  warnings: string[]
}

export interface OutlierInfo {
  student_id: string
  anonym_id: string
  grade_points: number
  deviation: number
  reason: string
}

export interface CriteriaStats {
  min: number
  max: number
  average: number
  std_deviation: number
}

// ---------------------------------------------------------------------------
// EH suggestions
// ---------------------------------------------------------------------------

export interface EHSuggestion {
  criterion: string
  excerpt: string
  relevance_score: number
  source_chunk_id: string
  // Attribution fields (CTRL-SRC-002)
  source_document?: string
  source_url?: string
  license?: string
  license_url?: string
  publisher?: string
}

/** Default Attribution for NiBiS documents (CTRL-SRC-002) */
export const NIBIS_ATTRIBUTION = {
  publisher: 'Niedersaechsischer Bildungsserver (NiBiS)',
  license: 'DL-DE-BY-2.0',
  license_url: 'https://www.govdata.de/dl-de/by-2-0',
  source_url: 'https://nibis.de',
} as const

// ---------------------------------------------------------------------------
// Gutachten
// ---------------------------------------------------------------------------

export interface GutachtenSection {
  title: string
  content: string
  evidence_links?: string[]
}

export interface Gutachten {
  einleitung: string
  hauptteil: string
  fazit: string
  staerken: string[]
  schwaechen: string[]
  generated_at?: string
}

// ---------------------------------------------------------------------------
// API response types
// ---------------------------------------------------------------------------

export interface KlausurenResponse {
  klausuren: Klausur[]
  total: number
}

export interface StudentsResponse {
  students: StudentWork[]
  total: number
}

export interface AnnotationsResponse {
  annotations: Annotation[]
}

// ---------------------------------------------------------------------------
// Create / update types
// ---------------------------------------------------------------------------

export interface CreateKlausurData {
  title: string
  subject?: string
  year?: number
  semester?: string
  modus?: KlausurModus
}

// ---------------------------------------------------------------------------
// Constants — annotation colors
// ---------------------------------------------------------------------------

export const ANNOTATION_COLORS: Record<AnnotationType, string> = {
  rechtschreibung: '#dc2626', // Red
  grammatik: '#2563eb',       // Blue
  inhalt: '#16a34a',          // Green
  struktur: '#9333ea',        // Purple
  stil: '#ea580c',            // Orange
  comment: '#6b7280',         // Gray
  highlight: '#eab308',       // Yellow
}

// ---------------------------------------------------------------------------
// Constants — status colors & labels
// ---------------------------------------------------------------------------

export const STATUS_COLORS: Record<StudentStatus, string> = {
  UPLOADED: '#6b7280',
  OCR_PROCESSING: '#eab308',
  OCR_COMPLETE: '#3b82f6',
  ANALYZING: '#8b5cf6',
  FIRST_EXAMINER: '#f97316',
  SECOND_EXAMINER: '#06b6d4',
  COMPLETED: '#22c55e',
  ERROR: '#ef4444',
}

export const STATUS_LABELS: Record<StudentStatus, string> = {
  UPLOADED: 'Hochgeladen',
  OCR_PROCESSING: 'OCR laeuft',
  OCR_COMPLETE: 'OCR fertig',
  ANALYZING: 'Analyse laeuft',
  FIRST_EXAMINER: 'Erstkorrektur',
  SECOND_EXAMINER: 'Zweitkorrektur',
  COMPLETED: 'Abgeschlossen',
  ERROR: 'Fehler',
}

// ---------------------------------------------------------------------------
// Constants — criteria & grades
// ---------------------------------------------------------------------------

/** Default criteria with weights (Niedersachsen standard) */
export const DEFAULT_CRITERIA: Record<string, { name: string; weight: number }> = {
  rechtschreibung: { name: 'Rechtschreibung', weight: 15 },
  grammatik: { name: 'Grammatik', weight: 15 },
  inhalt: { name: 'Inhalt', weight: 40 },
  struktur: { name: 'Struktur', weight: 15 },
  stil: { name: 'Stil', weight: 15 },
}

/** Grade thresholds (15-point system) */
export const GRADE_THRESHOLDS: Record<number, number> = {
  15: 95, 14: 90, 13: 85, 12: 80, 11: 75,
  10: 70, 9: 65, 8: 60, 7: 55, 6: 50,
  5: 45, 4: 40, 3: 33, 2: 27, 1: 20, 0: 0,
}

// ---------------------------------------------------------------------------
// Helper functions
// ---------------------------------------------------------------------------

/** Calculate grade points from a percentage (0-100). */
export function calculateGrade(percentage: number): number {
  for (const [grade, threshold] of Object.entries(GRADE_THRESHOLDS).sort(
    (a, b) => Number(b[0]) - Number(a[0]),
  )) {
    if (percentage >= threshold) {
      return Number(grade)
    }
  }
  return 0
}

/** Human-readable label for a 15-point grade value. */
export function getGradeLabel(points: number): string {
  const labels: Record<number, string> = {
    15: '1+', 14: '1', 13: '1-',
    12: '2+', 11: '2', 10: '2-',
    9: '3+', 8: '3', 7: '3-',
    6: '4+', 5: '4', 4: '4-',
    3: '5+', 2: '5', 1: '5-',
    0: '6',
  }
  return labels[points] || String(points)
}

// ---------------------------------------------------------------------------
// Examiner workflow types (workspace)
// ---------------------------------------------------------------------------

export interface ExaminerInfo {
  id: string
  assigned_at: string
  notes?: string
}

export interface ExaminerResult {
  grade_points: number
  criteria_scores?: CriteriaScores
  notes?: string
  submitted_at: string
}

export interface ExaminerWorkflow {
  student_id: string
  workflow_status: string
  visibility_mode: string
  user_role: 'ek' | 'zk' | 'dk' | 'viewer'
  first_examiner?: ExaminerInfo
  second_examiner?: ExaminerInfo
  third_examiner?: ExaminerInfo
  first_result?: ExaminerResult
  first_result_visible?: boolean
  second_result?: ExaminerResult
  third_result?: ExaminerResult
  grade_difference?: number
  final_grade?: number
  consensus_reached?: boolean
  consensus_type?: string
  einigung?: {
    final_grade: number
    notes: string
    type: string
    submitted_by: string
    submitted_at: string
    ek_grade: number
    zk_grade: number
  }
  drittkorrektur_reason?: string
}

export type ActiveTab = 'kriterien' | 'gutachten' | 'annotationen' | 'eh-vorschlaege'

export interface GradeTotals {
  raw: number
  weighted: number
  gradePoints: number
}

// ---------------------------------------------------------------------------
// Constants — workflow status & roles
// ---------------------------------------------------------------------------

export const GRADE_LABELS: Record<number, string> = {
  15: '1+', 14: '1', 13: '1-', 12: '2+', 11: '2', 10: '2-',
  9: '3+', 8: '3', 7: '3-', 6: '4+', 5: '4', 4: '4-',
  3: '5+', 2: '5', 1: '5-', 0: '6',
}

export const WORKFLOW_STATUS_LABELS: Record<string, { label: string; color: string }> = {
  not_started: { label: 'Nicht gestartet', color: 'bg-slate-100 text-slate-700' },
  ek_in_progress: { label: 'EK in Arbeit', color: 'bg-blue-100 text-blue-700' },
  ek_completed: { label: 'EK abgeschlossen', color: 'bg-blue-200 text-blue-800' },
  zk_assigned: { label: 'ZK zugewiesen', color: 'bg-amber-100 text-amber-700' },
  zk_in_progress: { label: 'ZK in Arbeit', color: 'bg-amber-200 text-amber-800' },
  zk_completed: { label: 'ZK abgeschlossen', color: 'bg-amber-300 text-amber-900' },
  einigung_required: { label: 'Einigung erforderlich', color: 'bg-orange-100 text-orange-700' },
  einigung_completed: { label: 'Einigung abgeschlossen', color: 'bg-green-100 text-green-700' },
  drittkorrektur_required: { label: 'DK erforderlich', color: 'bg-red-100 text-red-700' },
  drittkorrektur_assigned: { label: 'DK zugewiesen', color: 'bg-red-200 text-red-800' },
  drittkorrektur_in_progress: { label: 'DK in Arbeit', color: 'bg-red-300 text-red-900' },
  completed: { label: 'Abgeschlossen', color: 'bg-green-200 text-green-800' },
}

export const ROLE_LABELS: Record<string, { label: string; color: string }> = {
  ek: { label: 'Erstkorrektor', color: 'bg-blue-500' },
  zk: { label: 'Zweitkorrektor', color: 'bg-amber-500' },
  dk: { label: 'Drittkorrektor', color: 'bg-purple-500' },
  viewer: { label: 'Betrachter', color: 'bg-slate-500' },
}

// ---------------------------------------------------------------------------
// Form types (create / upload)
// ---------------------------------------------------------------------------

export interface CreateKlausurForm {
  title: string
  subject: string
  year: number
  semester: string
  modus: 'abitur' | 'vorabitur'
}

export interface VorabiturEHForm {
  aufgabentyp: string
  titel: string
  text_titel: string
  text_autor: string
  aufgabenstellung: string
}

export interface EHTemplate {
  aufgabentyp: string
  name: string
  description: string
  category: string
}

export interface DirektuploadForm {
  files: File[]
  ehFile: File | null
  ehText: string
  aufgabentyp: string
  klausurTitle: string
}

export type TabId = 'willkommen' | 'klausuren' | 'erstellen' | 'direktupload' | 'statistiken'
