import 'dart:developer';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRoomsResponse.dart';
import 'package:marianum_mobile/api/webuntis/queries/getSubjects/getSubjectsResponse.dart';
import 'package:marianum_mobile/data/timetable/timetable.dart';
import 'package:marianum_mobile/screen/pages/timetable/testTimetable.dart';
import 'package:marianum_mobile/widget/loadingSpinner.dart';
import 'package:provider/provider.dart';
import 'package:timetable_view/timetable_view.dart';

import '../../../api/webuntis/queries/getTimetable/getTimetableResponse.dart';

class StoredTimetable extends StatefulWidget {
  const StoredTimetable({Key? key}) : super(key: key);

  @override
  State<StoredTimetable> createState() => _StoredTimetableState();
}

class _StoredTimetableState extends State<StoredTimetable> {
  @override
  void initState() {
    super.initState();

    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      Provider.of<Timetable>(context, listen: false).run();
    });
  }
  
  @override
  Widget build(BuildContext context) {
    return Consumer<Timetable>(
      builder: (context, value, child) {
        if(value.getTimetableResponse == null) {
          return const LoadingSpinner();
        }

        return TimetableView(
          laneEventsList: _buildLaneEvents(value),
          onEventTap: (TableEvent event) {},
          timetableStyle: CustomTableStyle(context),
          onEmptySlotTap: (int laneIndex, TableEventTime start, TableEventTime end) => {},
        );
      },
    );
  }


  List<LaneEvents> _buildLaneEvents(Timetable data) {
    List<LaneEvents> laneEvents = List<LaneEvents>.empty(growable: true);
    Jiffy.locale("de"); // todo move outwards

    GetTimetableResponse timetable = data.getTimetableResponse!;
    GetRoomsResponse rooms = data.getRoomsResponse!;
    GetSubjectsResponse subjects = data.getSubjectsResponse!;

    List<int> dayList = timetable.result.map((e) => e.date).toSet().toList();
    dayList.sort((a, b) => a-b);
    dayList.forEach((day) {
      //Every Day

      laneEvents.add(
          LaneEvents(
              lane: Lane(
                  laneIndex: day,
                  name: "${Jiffy(day.toString()).format("dd.MM.yy")}\n${Jiffy(day.toString()).format("EEEE")}",
                  textStyle: TextStyle(
                      color: Theme.of(context).primaryColor,
                      fontWeight: FontWeight.bold,
                      fontSize: 14
                  )
              ),
              events: List<TableEvent>.generate(
                  timetable.result.where((element) => element.date == day).length,
                      (index) {
                    GetTimetableResponseObject tableEvent = timetable.result.where((element) => element.date == day).elementAt(index);
                    return TableEvent(
                      title: subjects.result.firstWhere((subject) => subject.id == tableEvent.su[0]['id']).longName,
                      eventId: tableEvent.id,
                      laneIndex: day,
                      startTime: parseTime(tableEvent.startTime),
                      endTime: parseTime(tableEvent.endTime),
                      padding: const EdgeInsets.all(5),
                      backgroundColor: Theme.of(context).primaryColor,
                      location: "\n${rooms.result.firstWhere((room) => room.id == tableEvent.ro[0]['id']).name}",
                    );
                  }
              )
          )
      );

    });

    return laneEvents;
  }

  TableEventTime parseTime(int input) {
    String time = input.toString().length < 4 ? "0$input" : input.toString();
    return TableEventTime(hour: int.parse(time.substring(0, 2)), minute: int.parse(time.substring(2, 4)));
  }
}