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/getRooms.dart';
import 'package:marianum_mobile/widget/loadingSpinner.dart';
import 'package:marianum_mobile/widget/offlineError.dart';
import 'package:timetable_view/timetable_view.dart';

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

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

	@override
	State<TestTimeTable> createState() => _TestTimeTableState();
}

class _TestTimeTableState extends State<TestTimeTable> {

	late Future<GetTimetableResponse> data;

	@override
	void initState() {
		data = GetTimetable(
				GetTimetableParams(
						options: GetTimetableParamsOptions(
								element: GetTimetableParamsOptionsElement(
									id: 92,
									type: 5,
									keyType: GetTimetableParamsOptionsElementKeyType.id,
								),
								startDate: 20230206,
								endDate: 20230212,
						)
				)
		).run();


		GetRooms().run().then((value) => {
			log(value.rawResponse.body)
		});

		super.initState();
	}

	@override
	Widget build(BuildContext context) {
		return FutureBuilder(
			builder: (BuildContext context, AsyncSnapshot<GetTimetableResponse> snapshot) {
				if(snapshot.hasData) {
					return Center(
						child: TimetableView(
							laneEventsList: _buildLaneEvents(snapshot.data!),
							onEventTap: (TableEvent event) {},
							timetableStyle: CustomTableStyle(context),
							onEmptySlotTap: (int laneIndex, TableEventTime start, TableEventTime end) => {},
						),
					);
				} else if(snapshot.hasError) {
					return const OfflineBanner(text: "Der Stundenplan konnte nicht geladen werden!");
				} else {
					return const Center(
						child: CircularProgressIndicator(),
					);
				}
			},
			future: data,
		);
	}

	List<LaneEvents> _buildLaneEvents(GetTimetableResponse data) {
		List<LaneEvents> laneEvents = List<LaneEvents>.empty(growable: true);
		Jiffy.locale("de");

		List<int> dayList = data.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(
						data.result.where((element) => element.date == day).length,
						(index) {
							GetTimetableResponseObject tableEvent = data.result.where((element) => element.date == day).elementAt(index);
							return TableEvent(
								title: "${tableEvent.substText}",
								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${tableEvent.statflags}",
							);
						}
					)
				)
			);

		});

		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)));
	}
}

class CustomTableStyle extends TimetableStyle {
	dynamic context;
	CustomTableStyle(this.context);

	@override
	int get startHour => 07;
	@override
	int get endHour => 17;
	@override
	double get laneWidth => 300;
	@override
	Color get cornerColor => Theme.of(context).primaryColor;
	@override
	Color get timeItemTextColor => Theme.of(context).primaryColor;
	@override
	double get timeItemHeight => 80;
	@override
	double get timeItemWidth => 70;

}