import 'dart:io';

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

import 'package:minehunter/common/cubit/nav/nav_cubit_pages.dart';
import 'package:minehunter/common/cubit/nav/nav_cubit_screens.dart';

import 'package:minehunter/config/application_config.dart';
import 'package:minehunter/config/default_global_settings.dart';
import 'package:minehunter/cubit/activity/activity_cubit.dart';
import 'package:minehunter/cubit/settings/settings_activity_cubit.dart';
import 'package:minehunter/cubit/settings/settings_global_cubit.dart';
import 'package:minehunter/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: [
        // default providers
        BlocProvider<NavCubitPage>(
          create: (context) => NavCubitPage(),
        ),
        BlocProvider<NavCubitScreen>(
          create: (context) => NavCubitScreen(),
        ),
        BlocProvider<ApplicationThemeModeCubit>(
          create: (context) => ApplicationThemeModeCubit(),
        ),
        BlocProvider<ActivityCubit>(
          create: (context) => ActivityCubit(),
        ),
        BlocProvider<GlobalSettingsCubit>(
          create: (context) => GlobalSettingsCubit(),
        ),
        BlocProvider<ActivitySettingsCubit>(
          create: (context) => ActivitySettingsCubit(),
        ),
      ],
      child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>(
        builder: (BuildContext context, ApplicationThemeModeState state) {
          return MaterialApp(
            title: ApplicationConfig.appTitle,
            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 = [
      'game_fail',
      'game_win',
      'placeholder',
    ];

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

    final List<String> skinImages = [
      'button_mark_mine_off',
      'button_mark_mine_on',
      'empty',
      'indicator_report_off',
      'indicator_report_on',
      'indicator_walk_off',
      'indicator_walk_on',
      'tile_flag_ko',
      'tile_flag_ok',
      'tile_flag',
      'tile_mine_not_found',
      'tile_mine',
      'tile_unknown',
    ];
    for (int value = 0; value <= 8; value++) {
      skinImages.add('tile_$value');
    }

    for (String skin in DefaultGlobalSettings.allowedSkinValues) {
      for (String image in skinImages) {
        assets.add('assets/skins/${skin}_$image.png');
      }
    }

    return assets;
  }
}