import 'package:flutter/material.dart';

/// Kuratierte Palette für Timetable-Farben (Fächer **und** eigene Termine). Die
/// Werte sind bewusst von den Status-Signalfarben in [lesson_color.dart]
/// abgesetzt (Marianum-Rot, Schwarz, Signallila, Signalblau, Event-Grün,
/// Duty-Petrol), damit gefärbte Regelstunden nicht mit Entfall/Vertretung
/// verwechselt werden. Der Server speichert nur den Enum-Namen; die konkrete
/// [Color] wird hier gemappt.
enum SubjectColor {
  amber,
  deepOrange,
  pink,
  purple,
  indigo,
  cyan,
  teal,
  lime,
  brown,
  blueGrey,
}

class SubjectColorPalette {
  const SubjectColorPalette._();

  /// Standardfarbe für neue eigene Termine (Fächer haben keinen Default —
  /// dort bedeutet „keine Farbe" das Status-Rot).
  static const SubjectColor defaultColor = SubjectColor.amber;

  /// Altbestand: eigene Termine wurden früher mit der 4er-Palette
  /// (orange/red/green/blue) gespeichert. Diese Namen bleiben auflösbar und
  /// bilden auf die nächstliegende neue Farbe ab, damit bestehende Termine
  /// nicht ihre Farbe verlieren.
  static const Map<String, SubjectColor> _legacyAliases = {
    'orange': SubjectColor.amber,
    'red': SubjectColor.deepOrange,
    'green': SubjectColor.teal,
    'blue': SubjectColor.indigo,
  };

  static ColorModeDisplay displayOf(SubjectColor color) => switch (color) {
    SubjectColor.amber => ColorModeDisplay(
      color: Colors.amber.shade700,
      displayName: 'Bernstein',
    ),
    SubjectColor.deepOrange => ColorModeDisplay(
      color: Colors.deepOrange.shade600,
      displayName: 'Dunkelorange',
    ),
    SubjectColor.pink => ColorModeDisplay(
      color: Colors.pink.shade500,
      displayName: 'Pink',
    ),
    SubjectColor.purple => ColorModeDisplay(
      color: Colors.deepPurple.shade400,
      displayName: 'Violett',
    ),
    SubjectColor.indigo => ColorModeDisplay(
      color: Colors.indigo.shade400,
      displayName: 'Indigo',
    ),
    SubjectColor.cyan => ColorModeDisplay(
      color: Colors.cyan.shade700,
      displayName: 'Cyan',
    ),
    SubjectColor.teal => ColorModeDisplay(
      color: Colors.teal.shade400,
      displayName: 'Türkis',
    ),
    SubjectColor.lime => ColorModeDisplay(
      color: Colors.lime.shade800,
      displayName: 'Limette',
    ),
    SubjectColor.brown => ColorModeDisplay(
      color: Colors.brown.shade400,
      displayName: 'Braun',
    ),
    SubjectColor.blueGrey => ColorModeDisplay(
      color: Colors.blueGrey.shade400,
      displayName: 'Blaugrau',
    ),
  };

  /// Löst einen gespeicherten Namen (neue Palette oder Legacy-Alias) zum
  /// [SubjectColor] auf. `null`, wenn der Name leer/unbekannt ist.
  static SubjectColor? fromName(String? name) {
    if (name == null || name.isEmpty) return null;
    final match = SubjectColor.values.where((e) => e.name == name).firstOrNull;
    return match ?? _legacyAliases[name];
  }

  /// Wie [fromName], liefert aber die konkrete [Color]. `null`, wenn der Name
  /// leer/unbekannt ist — der Aufrufer fällt dann auf die Status-Farbe zurück.
  static Color? colorFromName(String? name) {
    final option = fromName(name);
    return option == null ? null : displayOf(option).color;
  }
}

class ColorModeDisplay {
  final Color color;
  final String displayName;

  ColorModeDisplay({required this.color, required this.displayName});
}
