import '../../../../api/marianumconnect/queries/timetable_get_subjects/timetable_get_subjects_response.dart';
import '../../../../state/app/modules/timetable/bloc/timetable_state.dart';

/// Fach-Kürzel, die im geladenen Stundenplan des Nutzers vorkommen.
Set<String> planSubjectShortNames(TimetableState state) => state
    .getAllKnownLessons()
    .expand((lesson) => lesson.subjects)
    .map((s) => s.trim())
    .where((s) => s.isNotEmpty)
    .toSet();

/// Anzeigename eines Fachs: langer Name, sonst Kürzel.
String subjectDisplayLabel(McSubject s) =>
    s.longName.trim().isEmpty ? s.shortName : s.longName;

/// Fächer, die im Stundenplan vorkommen ([planShorts]) oder bereits eine Farbe
/// haben — gefärbte zuerst, sonst alphabetisch nach Anzeigename. So verschwindet
/// ein gefärbtes Fach nicht, nur weil es in den geladenen Wochen gerade nicht
/// stattfindet. Fächer ohne Kürzel werden verworfen.
List<McSubject> filterAndSortSubjects(
  List<McSubject> all,
  Set<String> planShorts,
) {
  return all
      .where(
        (s) =>
            s.shortName.trim().isNotEmpty &&
            (planShorts.contains(s.shortName) || s.color != null),
      )
      .toList()
    ..sort((a, b) {
      final aColored = a.color != null;
      final bColored = b.color != null;
      if (aColored != bColored) return aColored ? -1 : 1;
      return subjectDisplayLabel(
        a,
      ).toLowerCase().compareTo(subjectDisplayLabel(b).toLowerCase());
    });
}

/// Filtert nach Kürzel oder langem Namen (case-insensitive). Leere Query → alle.
List<McSubject> searchSubjects(List<McSubject> subjects, String query) {
  final q = query.trim().toLowerCase();
  if (q.isEmpty) return subjects;
  return subjects
      .where(
        (s) =>
            s.shortName.toLowerCase().contains(q) ||
            s.longName.toLowerCase().contains(q),
      )
      .toList();
}
