courseTableGridRange function

CourseTableGridRange courseTableGridRange(
  1. CourseTableData courseTableData
)

Implementation

CourseTableGridRange courseTableGridRange(CourseTableData courseTableData) {
  final weekdays = DayOfWeek.values
      .where((day) => day.isWeekday)
      .toList(growable: false);
  final defaultPeriods = Period.values
      .where(
        (period) => period.isAM || period == .nPeriod || period.isPM,
      )
      .toList(growable: false);

  if (courseTableData.scheduled.isEmpty &&
      courseTableData.unscheduled.isEmpty) {
    return (visibleDaysOfWeek: weekdays, visiblePeriods: defaultPeriods);
  }

  final visibleDays = switch ((
    courseTableData.hasWeekdayCourse,
    courseTableData.hasSaturdayCourse,
    courseTableData.hasSundayCourse,
  )) {
    (true, true, true) => [...weekdays, DayOfWeek.saturday, DayOfWeek.sunday],
    (true, true, false) => [...weekdays, DayOfWeek.saturday],
    (true, false, true) => [...weekdays, DayOfWeek.sunday],
    (true, false, false) => [...weekdays],
    (false, true, true) => [DayOfWeek.saturday, DayOfWeek.sunday],
    (false, true, false) => [DayOfWeek.saturday],
    (false, false, true) => [DayOfWeek.sunday],
    (false, false, false) => <DayOfWeek>[],
  };
  final visiblePeriods = <Period>[];

  void addPeriod(Period period) {
    if (!visiblePeriods.contains(period)) {
      visiblePeriods.add(period);
    }
  }

  void addPeriods(Iterable<Period> periods) {
    for (final period in periods) {
      addPeriod(period);
    }
  }

  switch ((
    courseTableData.hasAMCourse,
    courseTableData.hasNoonCourse,
    courseTableData.hasPMCourse,
  )) {
    case (false, false, false):
      break;
    case (true, false, false):
      addPeriods(Period.values.where((period) => period.isAM));
      break;
    case (false, true, false):
      addPeriod(.nPeriod);
      break;
    case (false, false, true):
      addPeriods(Period.values.where((period) => period.isPM));
      break;
    case (true, true, false):
      addPeriods(Period.values.where((period) => period.isAM));
      addPeriod(.nPeriod);
      break;
    case (false, true, true):
      addPeriod(.nPeriod);
      addPeriods(Period.values.where((period) => period.isPM));
      break;
    case (true, false, true):
    case (true, true, true):
      addPeriods(Period.values.where((period) => period.isAM));
      addPeriod(.nPeriod);
      addPeriods(Period.values.where((period) => period.isPM));
      break;
  }

  final isEveningOnly =
      !courseTableData.hasAMCourse &&
      !courseTableData.hasPMCourse &&
      courseTableData.hasEveningCourse;

  switch ((
    courseTableData.hasEveningCourse,
    isEveningOnly,
    courseTableData.latestPeriod,
  )) {
    case (false, _, _):
      break;
    case (true, true, _):
      addPeriods(Period.values.where((period) => period.isEvening));
      break;
    case (true, false, Period lastPeriod):
      addPeriods(
        Period.values
            .skip(visiblePeriods.last.index + 1)
            .take(lastPeriod.index - visiblePeriods.last.index),
      );
      break;
    case (true, false, null):
      break;
  }

  return (
    visibleDaysOfWeek: visibleDays.isEmpty ? weekdays : visibleDays,
    visiblePeriods: visiblePeriods.isEmpty ? defaultPeriods : visiblePeriods,
  );
}