import 'dart:async';
import 'dart:convert';
import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:home_widget/home_widget.dart';
import 'package:screenshot/screenshot.dart';
import 'package:syncfusion_flutter_calendar/calendar.dart';

import '../../model/accountData.dart';
import '../../model/timetable/timetableProps.dart';
import '../../storage/base/settingsProvider.dart';
import '../../theming/darkAppTheme.dart';
import '../../theming/lightAppTheme.dart';
import '../../view/pages/timetable/calendar.dart';

class TimetableHomeWidget {
  static Future<void> update(BuildContext context) async {
    await AccountData().waitForPopulation();
    var data = TimetableProps();
    var settings = SettingsProvider();
    settings.waitForPopulation();
    var completer = Completer();

    data.addListener(() async {
      if(completer.isCompleted) return;
      if(data.primaryLoading()) return;
      await _generate(data, settings);
      completer.complete();
    });

    data.run();
    await completer.future;
  }

  static Future<void> _generate(TimetableProps data, SettingsProvider settings) async {
    log('Generating widget screen...');
    var screenshotController = ScreenshotController();
    var calendarController = CalendarController();
    calendarController.displayDate = DateTime.now().copyWith(hour: 07, minute: 00);

    var imageData = await screenshotController.captureFromWidget(
      SizedBox(
        height: 700,
        width: 300,
        child: Directionality(
          textDirection: TextDirection.ltr,
          child: MediaQuery(
            data: MediaQueryData(),
            child: MaterialApp(
              localizationsDelegates: const [
                ...GlobalMaterialLocalizations.delegates,
                GlobalWidgetsLocalizations.delegate,
              ],
              supportedLocales: const [
                Locale('de'),
                Locale('en'),
              ],
              locale: const Locale('de'),
              darkTheme: DarkAppTheme.theme,
              theme: LightAppTheme.theme,
              themeMode: settings.val().appTheme,
              home: ClipRRect(
                borderRadius: BorderRadius.circular(20),
                child: Scaffold(
                  body: Calendar(
                    controller: calendarController,
                    timetableProps: data,
                    settings: settings,
                    isHomeWidget: true,
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );

    HomeWidget.saveWidgetData<String>('screen', base64.encode(imageData));
    HomeWidget.updateWidget(name: 'TimetableWidget');
    log('Widget screen successfully updated! (${imageData.length})');
  }
}