import 'dart:developer';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:marianum_mobile/data/incommingPackets/timetablePacket.dart';
import 'package:marianum_mobile/widget/loadingPacket.dart';
import 'package:provider/provider.dart';
import 'package:timetable_view/timetable_view.dart';

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

  @override
  State<Timetable> createState() => _TimetableState();
}

class _TimetableState extends State<Timetable> {

  @override
  void initState() {
    Provider.of<TimetablePacket>(context, listen: false).invoke();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Consumer<TimetablePacket>(
      builder: (context, data, child) {

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

  List<LaneEvents> _buildLaneEvents(context, TimetablePacket data) {
    List<LaneEvents> laneEvents = List<LaneEvents>.empty(growable: true);
    data.timeTable.days.forEach((day) {
      List<TableEvent> tableEvents = List<TableEvent>.empty(growable: true);

      day.entries.forEach((element) {
        tableEvents.add(
            TableEvent(
                backgroundColor: Theme.of(context).primaryColor,
                padding: const EdgeInsets.all(5),
                title: element.subject,
                location: "\n${element.room}",
                eventId: tableEvents.length,
                laneIndex: tableEvents.length,
                startTime: TableEventTime(hour: element.start.hour, minute: element.start.minute),
                endTime: TableEventTime(hour: element.end.hour, minute: element.end.minute)
            )
        );
      });

      laneEvents.add(
          LaneEvents(
              lane: Lane(laneIndex: laneEvents.length, name: day.name, textStyle: TextStyle(color: Theme.of(context).primaryColor, fontWeight: FontWeight.bold)),
              events: tableEvents
          )
      );
    });


    return laneEvents;
  }

  void onEventTapCallBack(TableEvent event) {
    print(
        "Event Clicked!! LaneIndex ${event.laneIndex} Title: ${event.title} StartHour: ${event.startTime.hour} EndHour: ${event.endTime.hour}");
  }

  void onTimeSlotTappedCallBack(
      int laneIndex, TableEventTime start, TableEventTime end) {
    print(
        "Empty Slot Clicked !! LaneIndex: $laneIndex StartHour: ${start.hour} EndHour: ${end.hour}");
  }
}

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


  @override
  int get startHour => 07;
  @override
  int get endHour => 17;
  @override
  double get laneWidth => 200;
  @override
  Color get cornerColor => Theme.of(this.context).primaryColor;
  @override
  Color get timeItemTextColor => Theme.of(this.context).primaryColor;
  @override
  // TODO: implement timeItemHeight
  double get timeItemHeight => 60;
}