import 'dart:async';

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:syncfusion_flutter_calendar/calendar.dart';

import '../../../homescreen_widgets/timetable/timetableHomeWidget.dart';
import '../../../model/timetable/timetableProps.dart';
import '../../../storage/base/settingsProvider.dart';
import '../../../widget/loadingSpinner.dart';
import '../../../widget/placeholderView.dart';
import 'calendar.dart';
import 'customTimetableEventEditDialog.dart';
import 'viewCustomTimetableEvents.dart';

class Timetable extends StatefulWidget {
  const Timetable({super.key});

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

enum CalendarActions { addEvent, viewEvents }

class _TimetableState extends State<Timetable> {
  CalendarController controller = CalendarController();
  late Timer updateTimings;
  late SettingsProvider settings;

  @override
  void initState() {
    settings = Provider.of<SettingsProvider>(context, listen: false);
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      Provider.of<TimetableProps>(context, listen: false).run();
    });

    controller.displayDate = DateTime.now().add(const Duration(days: 2));

    updateTimings = Timer.periodic(const Duration(seconds: 30), (Timer t) => setState((){}));

    super.initState();
  }

  @override
  Widget build(BuildContext context) => Scaffold(
      appBar: AppBar(
        title: const Text('Stunden & Vertretungsplan'),
        actions: [
          IconButton(onPressed: () => TimetableHomeWidget.update(context), icon: Icon(Icons.screen_share_outlined)),
          IconButton(
              icon: const Icon(Icons.home_outlined),
              onPressed: () {
                controller.displayDate = DateTime.now().add(const Duration(days: 2));
              }
          ),
          PopupMenuButton<CalendarActions>(
            icon: const Icon(Icons.edit_calendar_outlined),
            itemBuilder: (context) => CalendarActions.values.map(
                (e) {
                  String title;
                  Icon icon;
                  switch(e) {
                    case CalendarActions.addEvent:
                      title = 'Kalendereintrag hinzufügen';
                      icon = const Icon(Icons.add);
                    case CalendarActions.viewEvents:
                      title = 'Kalendereinträge anzeigen';
                      icon = const Icon(Icons.perm_contact_calendar_outlined);
                  }
                  return PopupMenuItem<CalendarActions>(
                    value: e,
                    child: ListTile(
                      title: Text(title),
                      leading: icon,
                    )
                  );
                }
              ).toList(),
            onSelected: (value) {
              switch(value) {
                case CalendarActions.addEvent:
                  showDialog(
                    context: context,
                    builder: (context) => const CustomTimetableEventEditDialog(),
                    barrierDismissible: false,
                  );
                case CalendarActions.viewEvents:
                  Navigator.of(context).push(MaterialPageRoute(builder: (context) => const ViewCustomTimetableEvents()));
              }
            },
          )
        ],
      ),
      body: Consumer<TimetableProps>(
        builder: (context, value, child) {

          if(value.hasError) {
            return PlaceholderView(
              icon: Icons.calendar_month,
              text: 'Webuntis error: ${value.error.toString()}',
              button: TextButton(
                child: const Text('Neu laden'),
                onPressed: () {
                  controller.displayDate = DateTime.now().add(const Duration(days: 2));
                  Provider.of<TimetableProps>(context, listen: false).resetWeek();
                },
              ),
            );
          }

          if(value.primaryLoading()) return const LoadingSpinner();

          return RefreshIndicator(
            child: Calendar(
              controller: controller,
              timetableProps: value,
              settings: settings,
            ),
            onRefresh: () async {
              Provider.of<TimetableProps>(context, listen: false).run(renew: true);
              return Future.delayed(const Duration(seconds: 3));
            }
          );
        },
      )
    );

  @override
  void dispose() {
    updateTimings.cancel();
    super.dispose();
  }
}