import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/cubit/game_cubit.dart';
import 'package:puissance4/cubit/nav_cubit.dart';
import 'package:puissance4/cubit/settings_game_cubit.dart';
import 'package:puissance4/cubit/settings_global_cubit.dart';
import 'package:puissance4/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,
  );

  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
      .then((value) => 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) {
    final List<String> assets = getImagesAssets();
    for (String asset in assets) {
      precacheImage(AssetImage(asset), context);
    }

    return MultiBlocProvider(
      providers: [
        BlocProvider<NavCubit>(create: (context) => NavCubit()),
        BlocProvider<ApplicationThemeModeCubit>(
            create: (context) => ApplicationThemeModeCubit()),
        BlocProvider<GameCubit>(create: (context) => GameCubit()),
        BlocProvider<GlobalSettingsCubit>(create: (context) => GlobalSettingsCubit()),
        BlocProvider<GameSettingsCubit>(create: (context) => GameSettingsCubit()),
      ],
      child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>(
        builder: (BuildContext context, ApplicationThemeModeState state) {
          return MaterialApp(
            title: 'Puissance4',
            home: const SkeletonScreen(),

            // Theme stuff
            theme: lightTheme,
            darkTheme: darkTheme,
            themeMode: state.themeMode,

            // Localization stuff
            localizationsDelegates: context.localizationDelegates,
            supportedLocales: context.supportedLocales,
            locale: context.locale,
            debugShowCheckedModeBanner: false,
          );
        },
      ),
    );
  }

  List<String> getImagesAssets() {
    final List<String> assets = [];

    const List<String> gameImages = [
      'button_back',
      'button_delete_saved_game',
      'button_resume_game',
      'button_start',
      'game_fail',
      'game_win',
      'placeholder',
    ];

    for (String image in gameImages) {
      assets.add('assets/ui/$image.png');
    }

    return assets;
  }
}