import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:get_it/get_it.dart';
import 'package:okane/database/sqlite.dart';
import 'package:okane/i18n/strings.g.dart';
import 'package:okane/screen.dart';
import 'package:okane/ui/navigation.dart';
import 'package:okane/ui/pages/budgets/budget_details.dart';
import 'package:okane/ui/pages/transaction_details.dart';
import 'package:okane/ui/state/core.dart';
import 'package:okane/ui/state/settings.dart';
import 'package:sentry_flutter/sentry_flutter.dart';

import 'ui/pages/loans/loan_details.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  LocaleSettings.useDeviceLocale();

  final settings = SettingsCubit();
  await settings.loadSettings();

  GetIt.I.registerSingleton<SettingsCubit>(settings);
  GetIt.I.registerSingleton<CoreCubit>(CoreCubit());
  GetIt.I.registerSingleton<OkaneDatabase>(OkaneDatabase());

  final appRunner = () => runApp(const MyApp());
  if (settings.sentryDsn != null) {
    print("Setting up Sentry!");
    await SentryFlutter.init((options) {
      options.dsn = settings.sentryDsn!;
    }, appRunner: appRunner);
  } else {
    appRunner();
  }
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: MultiBlocProvider(
        providers: [
          BlocProvider<CoreCubit>(create: (_) => GetIt.I.get<CoreCubit>()),
          BlocProvider<SettingsCubit>(
            create: (_) => GetIt.I.get<SettingsCubit>(),
          ),
        ],
        child: BlocBuilder<SettingsCubit, SettingsWrapper>(
          builder:
              (context, state) => MaterialApp(
                title: 'Okane',
                theme: ThemeData(
                  colorSchemeSeed: Colors.deepPurple,
                  brightness: switch (state.settings.colorScheme) {
                    ColorSchemeSettings.dark => Brightness.dark,
                    ColorSchemeSettings.light => Brightness.light,
                    ColorSchemeSettings.system =>
                      View.of(context).platformDispatcher.platformBrightness,
                  },
                  pageTransitionsTheme: PageTransitionsTheme(
                    builders: Map.fromIterable(
                      TargetPlatform.values,
                      value: (_) => const FadeForwardsPageTransitionsBuilder(),
                    ),
                  ),
                ),
                home: const MyHomePage(),
                onGenerateRoute:
                    (settings) => switch (settings.name) {
                      "/transactions/details" =>
                        TransactionDetailsPage.mobileRoute,
                      "/budgets/details" => BudgetDetailsPage.mobileRoute,
                      "/loans/details" => LoanDetailsPage.mobileRoute,
                      _ => MaterialPageRoute<void>(
                        builder: (_) => Text("Unknown!!"),
                      ),
                    },
              ),
        ),
      ),
    );
  }
}

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

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final Completer<int> _initCompleter = Completer();

  @override
  void initState() {
    super.initState();
    asyncInit();
  }

  Future<void> asyncInit() async {
    print("Starting async init");
    await GetIt.I.get<CoreCubit>().init();
    _initCompleter.complete(1);
    print("Async init done");
  }

  @override
  Widget build(BuildContext context) {
    final screenSize = getScreenSize(context);
    if (screenSize == ScreenSize.normal) {
      SchedulerBinding.instance.addPostFrameCallback((_) {
        Navigator.of(context).popUntil((route) => route.isFirst);
      });
    }
    return FutureBuilder(
      future: _initCompleter.future,
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return Center(child: CircularProgressIndicator());
        }

        return Scaffold(
          drawer: OkaneNavigationDrawer(),
          body: switch (screenSize) {
            ScreenSize.normal => const Row(
              children: [
                OkaneNavigationRail(),
                VerticalDivider(thickness: 1, width: 1),
                Expanded(child: OkaneNavigationLayout()),
              ],
            ),
            ScreenSize.small => const OkaneNavigationLayout(),
          },
        );
      },
    );
  }
}