calculateSlots function

List<Map<String, dynamic>> calculateSlots(
  1. List<String> slots
)

Implementation

List<Map<String, dynamic>> calculateSlots(List<String> slots) {
  List<Map<String, dynamic>> mappedSlots = [];
  for (var element in slots) {
    var timeList = element.split('-');
    var splitTime = timeList[0].split(':');
    var splitTime2 = timeList[1].split(':');
    TimeOfDay start = TimeOfDay(
      hour: int.parse(splitTime[0]),
      minute: int.parse(splitTime[1]),
    );
    TimeOfDay end = TimeOfDay(
      hour: int.parse(splitTime2[0]) == 0 ? 24 : int.parse(splitTime2[0]),
      minute: int.parse(splitTime2[1]),
    );
    int totalSlots = 0;
    var hourMinus = end.hour - start.hour;
    var minuteMinus = (end.minute - start.minute);
    int minuteSlots = minuteMinus == 30
        ? 1
        : minuteMinus == -30
            ? -1
            : 0;
    totalSlots += hourMinus * 2;
    totalSlots += minuteSlots;
    Map<String, dynamic> firstSlotToAdd = {
      'i': int.parse(splitTime[0]),
      'firstHalf': int.parse(splitTime[1]) == 0,
      'secondHalf': int.parse(splitTime[1]) == 30,
    };

    if (totalSlots % 2 == 0) {
      if (firstSlotToAdd['firstHalf'] == true) {
        for (int i = 0; i < hourMinus; i++) {
          Map<String, dynamic> slotToAdd = {
            'i': int.parse(splitTime[0]) + i,
            'firstHalf': true,
            'secondHalf': true,
          };
          final mappedSlot = mappedSlots.firstWhere(
            (mapped) => mapped['i'] == slotToAdd['i'],
            orElse: () => {},
          );
          if (mappedSlot.isNotEmpty) {
            slotToAdd = {
              'i': int.parse(splitTime[0]) + i,
              'firstHalf': mappedSlot['firstHalf']
                  ? mappedSlot['firstHalf']
                  : slotToAdd['firstHalf'],
              'secondHalf': mappedSlot['secondHalf']
                  ? mappedSlot['secondHalf']
                  : slotToAdd['secondHalf'],
            };
            mappedSlots.removeWhere(
                (mappedElement) => mappedElement['i'] == mappedSlot['i']);
          }
          mappedSlots.add(slotToAdd);
        }
      } else {
        final mappedSlotFirst = mappedSlots.firstWhere(
          (mapped) => mapped['i'] == firstSlotToAdd['i'],
          orElse: () => {},
        );
        if (mappedSlotFirst.isNotEmpty) {
          firstSlotToAdd = {
            'i': firstSlotToAdd['i'],
            'firstHalf': mappedSlotFirst['firstHalf']
                ? mappedSlotFirst['firstHalf']
                : firstSlotToAdd['firstHalf'],
            'secondHalf': mappedSlotFirst['secondHalf']
                ? mappedSlotFirst['secondHalf']
                : firstSlotToAdd['secondHalf'],
          };
          mappedSlots.removeWhere(
              (mappedElement) => mappedElement['i'] == mappedSlotFirst['i']);
        }
        mappedSlots.add(firstSlotToAdd);
        for (int i = 1; i < hourMinus; i++) {
          Map<String, dynamic> slotToAdd = {
            'i': int.parse(splitTime[0]) + i,
            'firstHalf': true,
            'secondHalf': true,
          };
          final mappedSlot = mappedSlots.firstWhere(
            (mapped) => mapped['i'] == slotToAdd['i'],
            orElse: () => {},
          );
          if (mappedSlot.isNotEmpty) {
            slotToAdd = {
              'i': int.parse(splitTime[0]) + i,
              'firstHalf': mappedSlot['firstHalf']
                  ? mappedSlot['firstHalf']
                  : slotToAdd['firstHalf'],
              'secondHalf': mappedSlot['secondHalf']
                  ? mappedSlot['secondHalf']
                  : slotToAdd['secondHalf'],
            };
            mappedSlots.removeWhere(
                (mappedElement) => mappedElement['i'] == mappedSlot['i']);
          }
          mappedSlots.add(slotToAdd);
        }
        final mappedSlot = mappedSlots.firstWhere(
          (mapped) => mapped['i'] == (int.parse(splitTime[0]) + hourMinus),
          orElse: () => {},
        );
        if (mappedSlot.isNotEmpty) {
          mappedSlots.removeWhere(
              (mappedElement) => mappedElement['i'] == mappedSlot['i']);
          mappedSlots.add({
            'i': (int.parse(splitTime[0]) + hourMinus),
            'firstHalf': true,
            'secondHalf':
                mappedSlot['secondHalf'] ? mappedSlot['secondHalf'] : false,
          });
        } else {
          mappedSlots.add({
            'i': int.parse(splitTime[0]) + hourMinus,
            'firstHalf': true,
            'secondHalf': false,
          });
        }
      }
    } else {
      Map<String, dynamic> slotToAdd = {};
      if (firstSlotToAdd['firstHalf'] == true) {
        if (hourMinus > 0) {
          for (int i = 0; i < hourMinus; i++) {
            slotToAdd = {
              'i': int.parse(splitTime[0]) + i,
              'firstHalf': true,
              'secondHalf': true,
            };
            final mappedSlot = mappedSlots.firstWhere(
              (mapped) => mapped['i'] == slotToAdd['i'],
              orElse: () => {},
            );
            if (mappedSlot.isNotEmpty) {
              slotToAdd = {
                'i': int.parse(splitTime[0]) + i,
                'firstHalf': mappedSlot['firstHalf']
                    ? mappedSlot['firstHalf']
                    : slotToAdd['firstHalf'],
                'secondHalf': mappedSlot['secondHalf']
                    ? mappedSlot['secondHalf']
                    : slotToAdd['secondHalf'],
              };
              mappedSlots.removeWhere(
                  (mappedElement) => mappedElement['i'] == mappedSlot['i']);
            }
            mappedSlots.add(slotToAdd);
          }
          slotToAdd = {
            'i': int.parse(splitTime[0]) + hourMinus,
            'firstHalf': true,
            'secondHalf': false,
          };
          final mappedSlot = mappedSlots.firstWhere(
            (mapped) => mapped['i'] == slotToAdd['i'],
            orElse: () => {},
          );
          if (mappedSlot.isNotEmpty) {
            slotToAdd = {
              'i': (int.parse(splitTime[0]) + hourMinus),
              'firstHalf': mappedSlot['firstHalf']
                  ? mappedSlot['firstHalf']
                  : slotToAdd['firstHalf'],
              'secondHalf': mappedSlot['secondHalf']
                  ? mappedSlot['secondHalf']
                  : slotToAdd['secondHalf'],
            };
            mappedSlots.removeWhere(
                (mappedElement) => mappedElement['i'] == mappedSlot['i']);
          }
          mappedSlots.add(slotToAdd);
        } else {
          slotToAdd = {
            'i': int.parse(splitTime[0]),
            'firstHalf': true,
            'secondHalf': false,
          };
          final mappedSlot = mappedSlots.firstWhere(
            (mapped) => mapped['i'] == [slotToAdd['i']],
            orElse: () => {},
          );
          if (mappedSlot.isNotEmpty) {
            slotToAdd = {
              'i': int.parse(splitTime[0]),
              'firstHalf': mappedSlot['firstHalf']
                  ? mappedSlot['firstHalf']
                  : slotToAdd['firstHalf'],
              'secondHalf': mappedSlot['secondHalf']
                  ? mappedSlot['secondHalf']
                  : slotToAdd['secondHalf'],
            };
            mappedSlots.removeWhere(
                (mappedElement) => mappedElement['i'] == mappedSlot['i']);
          }
          mappedSlots.add(slotToAdd);
        }
      } else {
        final mappedSlotFirst = mappedSlots.firstWhere(
          (mapped) => mapped['i'] == firstSlotToAdd['i'],
          orElse: () => {},
        );
        if (mappedSlotFirst.isNotEmpty) {
          firstSlotToAdd = {
            'i': firstSlotToAdd['i'],
            'firstHalf': mappedSlotFirst['firstHalf']
                ? mappedSlotFirst['firstHalf']
                : firstSlotToAdd['firstHalf'],
            'secondHalf': mappedSlotFirst['secondHalf']
                ? mappedSlotFirst['secondHalf']
                : firstSlotToAdd['secondHalf'],
          };
          mappedSlots.removeWhere(
              (mappedElement) => mappedElement['i'] == mappedSlotFirst['i']);
        }
        mappedSlots.add(firstSlotToAdd);
        for (int i = 1; i < hourMinus; i++) {
          slotToAdd = {
            'i': int.parse(splitTime[0]) + i,
            'firstHalf': true,
            'secondHalf': true,
          };
          final mappedSlot = mappedSlots.firstWhere(
            (mapped) => mapped['i'] == [slotToAdd['i']],
            orElse: () => {},
          );
          if (mappedSlot.isNotEmpty) {
            slotToAdd = {
              'i': int.parse(splitTime[0]) + i,
              'firstHalf': mappedSlot['firstHalf']
                  ? mappedSlot['firstHalf']
                  : slotToAdd['firstHalf'],
              'secondHalf': mappedSlot['secondHalf']
                  ? mappedSlot['secondHalf']
                  : slotToAdd['secondHalf'],
            };
            mappedSlots.removeWhere(
                (mappedElement) => mappedElement['i'] == mappedSlot['i']);
          }
          mappedSlots.add(slotToAdd);
        }
      }
    }
  }

  return mappedSlots;
}