import 'dart:io';

import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.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:plotter/config/theme.dart';
import 'package:plotter/cubit/activity_cubit.dart';
import 'package:plotter/cubit/nav_cubit_pages.dart';
import 'package:plotter/cubit/nav_cubit_screens.dart';
import 'package:plotter/cubit/settings_global_cubit.dart';
import 'package:plotter/cubit/theme_cubit.dart';
import 'package:plotter/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) {
    return MultiBlocProvider(
      providers: [
        BlocProvider<NavCubitPage>(create: (context) => NavCubitPage()),
        BlocProvider<NavCubitScreen>(create: (context) => NavCubitScreen()),
        BlocProvider<ThemeCubit>(create: (context) => ThemeCubit()),
        BlocProvider<ActivityCubit>(create: (context) => ActivityCubit()),
        BlocProvider<GlobalSettingsCubit>(create: (context) => GlobalSettingsCubit()),
      ],
      child: BlocBuilder<ThemeCubit, ThemeModeState>(
        builder: (BuildContext context, ThemeModeState state) {
          return MaterialApp(
            title: 'Stepper plotter assistant',
            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,
          );
        },
      ),
    );
  }
}