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:isar/isar.dart';
import 'package:okane/database/database.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';

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

  GetIt.I.registerSingleton<CoreCubit>(CoreCubit());
  GetIt.I.registerSingleton<Isar>(await openDatabase());

  runApp(const MyApp());
}

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>()),
        ],
        child: MaterialApp(
          title: 'Okane',
          theme: ThemeData(
            colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
            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,
                _ => 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(),
          },
        );
      },
    );
  }
}