import 'dart:io';

import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hive/hive.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:path_provider/path_provider.dart';
import 'package:petitbac/cubit/theme_cubit.dart';
import 'package:provider/provider.dart';

import 'package:petitbac/config/theme.dart';
import 'package:petitbac/cubit/bottom_nav_cubit.dart';
import 'package:petitbac/cubit/game_cubit.dart';
import 'package:petitbac/cubit/settings_cubit.dart';
import 'package:petitbac/provider/data.dart';
import 'package:petitbac/ui/skeleton.dart';

void main() async {
  /// Initialize packages
  WidgetsFlutterBinding.ensureInitialized();
  await EasyLocalization.ensureInitialized();
  final Directory tmpDir = await getTemporaryDirectory();
  Hive.init(tmpDir.toString());
  HydratedBloc.storage = await HydratedStorage.build(
    storageDirectory: tmpDir,
  );

  runApp(
    EasyLocalization(
      path: 'assets/translations',
      supportedLocales: const <Locale>[
        Locale('en'),
        Locale('fr'),
      ],
      fallbackLocale: const Locale('en'),
      useFallbackTranslations: true,
      child: const MyApp(),
    ),
  );
}

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

  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
      providers: [
        BlocProvider<BottomNavCubit>(create: (context) => BottomNavCubit()),
        BlocProvider<GameCubit>(create: (context) => GameCubit()),
        BlocProvider<SettingsCubit>(create: (context) => SettingsCubit()),
        BlocProvider<ThemeCubit>(create: (context) => ThemeCubit()),
      ],
      child: BlocBuilder<ThemeCubit, ThemeModeState>(
          builder: (BuildContext context, ThemeModeState state) {
        return ChangeNotifierProvider(
          create: (BuildContext context) => Data(),
          child: Consumer<Data>(
            builder: (context, data, child) {
              return MaterialApp(
                title: 'Petit Bac',
                theme: lightTheme,
                darkTheme: darkTheme,
                themeMode: state.themeMode,
                home: const SkeletonScreen(),
                localizationsDelegates: context.localizationDelegates,
                supportedLocales: context.supportedLocales,
                locale: context.locale,
                debugShowCheckedModeBanner: false,
              );
            },
          ),
        );
      }),
    );
  }
}