/**
 * TypeScript Types for Companion Module
 * Migration from Flask companion.py/companion_js.py
 */

// ============================================================================
// Phase System
// ============================================================================

export type PhaseId = 'einstieg' | 'erarbeitung' | 'sicherung' | 'transfer' | 'reflexion'

export interface Phase {
  id: PhaseId
  shortName: string // E, A, S, T, R
  displayName: string
  duration: number // minutes
  status: 'planned' | 'active' | 'completed'
  actualTime?: number // seconds (actual time spent)
  color: string // hex color
}

export interface PhaseContext {
  currentPhase: PhaseId
  phaseDisplayName: string
}

// ============================================================================
// Dashboard / Companion Mode
// ============================================================================

export interface CompanionStats {
  classesCount: number
  studentsCount: number
  learningUnitsCreated: number
  gradesEntered: number
}

export interface Progress {
  percentage: number
  completed: number
  total: number
}

export type SuggestionPriority = 'urgent' | 'high' | 'medium' | 'low'

export interface Suggestion {
  id: string
  title: string
  description: string
  priority: SuggestionPriority
  icon: string // lucide icon name
  actionTarget: string // navigation path
  estimatedTime: number // minutes
}

export type EventType = 'exam' | 'parent_meeting' | 'deadline' | 'other'

export interface UpcomingEvent {
  id: string
  title: string
  date: string // ISO date string
  type: EventType
  inDays: number
}

export interface CompanionData {
  context: PhaseContext
  stats: CompanionStats
  phases: Phase[]
  progress: Progress
  suggestions: Suggestion[]
  upcomingEvents: UpcomingEvent[]
}

// ============================================================================
// Lesson Mode
// ============================================================================

export type LessonStatus =
  | 'not_started'
  | 'in_progress'
  | 'paused'
  | 'completed'
  | 'overtime'

export interface LessonPhase {
  phase: PhaseId
  duration: number // planned duration in minutes
  status: 'planned' | 'active' | 'completed' | 'skipped'
  actualTime: number // actual time spent in seconds
  startedAt?: string // ISO timestamp
  completedAt?: string // ISO timestamp
}

export interface Homework {
  id: string
  title: string
  description?: string
  dueDate: string // ISO date
  attachments?: string[]
  completed?: boolean
}

export interface Material {
  id: string
  title: string
  type: 'document' | 'video' | 'presentation' | 'link' | 'other'
  url?: string
  fileName?: string
}

export interface LessonReflection {
  rating: number // 1-5 stars
  notes: string
  nextSteps: string
  savedAt?: string
}

export interface LessonSession {
  sessionId: string
  classId: string
  className: string
  subject: string
  topic?: string
  startTime: string // ISO timestamp
  endTime?: string // ISO timestamp
  phases: LessonPhase[]
  totalPlannedDuration: number // minutes
  currentPhaseIndex: number
  elapsedTime: number // seconds
  isPaused: boolean
  pausedAt?: string
  pauseDuration: number // total pause time in seconds
  overtimeMinutes: number
  status: LessonStatus
  homeworkList: Homework[]
  materials: Material[]
  reflection?: LessonReflection
}

// ============================================================================
// Lesson Templates
// ============================================================================

export interface PhaseDurations {
  einstieg: number
  erarbeitung: number
  sicherung: number
  transfer: number
  reflexion: number
}

export interface LessonTemplate {
  templateId: string
  name: string
  description?: string
  subject?: string
  durations: PhaseDurations
  isSystemTemplate: boolean
  createdBy?: string
  createdAt?: string
}

// ============================================================================
// Settings
// ============================================================================

export interface TeacherSettings {
  defaultPhaseDurations: PhaseDurations
  preferredLessonLength: number // minutes (default 45)
  autoAdvancePhases: boolean
  soundNotifications: boolean
  showKeyboardShortcuts: boolean
  highContrastMode: boolean
  onboardingCompleted: boolean
  selectedTemplateId?: string
}

// ============================================================================
// Timer State
// ============================================================================

export type TimerColorStatus = 'plenty' | 'warning' | 'critical' | 'overtime'

export interface TimerState {
  isRunning: boolean
  isPaused: boolean
  elapsedSeconds: number
  remainingSeconds: number
  totalSeconds: number
  progress: number // 0-1
  colorStatus: TimerColorStatus
  currentPhase: LessonPhase | null
}

// ============================================================================
// Forms
// ============================================================================

export interface LessonStartFormData {
  classId: string
  subject: string
  topic?: string
  templateId?: string
  customDurations?: PhaseDurations
}

export interface Class {
  id: string
  name: string
  grade: string
  studentCount: number
}

// ============================================================================
// Feedback
// ============================================================================

export type FeedbackType = 'bug' | 'feature' | 'feedback'

export interface FeedbackSubmission {
  type: FeedbackType
  title: string
  description: string
  screenshot?: string // base64
  sessionId?: string
  metadata?: Record<string, unknown>
}

// ============================================================================
// Onboarding
// ============================================================================

export interface OnboardingStep {
  step: number
  title: string
  description: string
  completed: boolean
}

export interface OnboardingState {
  currentStep: number
  totalSteps: number
  steps: OnboardingStep[]
  selectedState?: string // Bundesland
  selectedSchoolType?: string
  completed: boolean
}

// ============================================================================
// WebSocket Messages
// ============================================================================

export type WSMessageType =
  | 'phase_update'
  | 'timer_tick'
  | 'overtime_warning'
  | 'pause_toggle'
  | 'session_end'
  | 'sync_request'

export interface WSMessage {
  type: WSMessageType
  payload: {
    sessionId: string
    phase?: number
    elapsed?: number
    isPaused?: boolean
    overtimeMinutes?: number
    [key: string]: unknown
  }
  timestamp: string
}

// ============================================================================
// API Responses
// ============================================================================

export interface APIResponse<T> {
  success: boolean
  data?: T
  error?: string
  message?: string
}

export interface DashboardResponse extends APIResponse<CompanionData> {}

export interface LessonResponse extends APIResponse<LessonSession> {}

export interface TemplatesResponse extends APIResponse<{ templates: LessonTemplate[] }> {}

export interface SettingsResponse extends APIResponse<TeacherSettings> {}

// ============================================================================
// Component Props
// ============================================================================

export type CompanionMode = 'companion' | 'lesson' | 'classic'

export interface ModeToggleProps {
  currentMode: CompanionMode
  onModeChange: (mode: CompanionMode) => void
}

export interface PhaseTimelineProps {
  phases: Phase[]
  currentPhaseIndex: number
  onPhaseClick?: (index: number) => void
}

export interface VisualPieTimerProps {
  progress: number // 0-1
  remainingSeconds: number
  totalSeconds: number
  colorStatus: TimerColorStatus
  isPaused: boolean
  currentPhaseName: string
  phaseColor: string
}

export interface QuickActionsBarProps {
  onExtend: (minutes: number) => void
  onPause: () => void
  onResume: () => void
  onSkip: () => void
  isPaused: boolean
  isLastPhase: boolean
  disabled?: boolean
}
