import 'package:common/.generated/l10n/app_localizations.dart';
import 'package:common/localization/l10n_utils.dart';
import 'package:comwell_key_app/domain/repositories/booking_details_repository.dart';
import 'package:comwell_key_app/connection_state/connection_state_cubit.dart';
import 'package:comwell_key_app/key/bloc/key_bloc.dart';
import 'package:comwell_key_app/key/repository/key_repository.dart';
import 'package:comwell_key_app/overview/cubit/overview_cubit.dart';
import 'package:comwell_key_app/presentation/app/bloc/app_cubit.dart';
import 'package:comwell_key_app/presentation/app/bloc/profile_cubit.dart';
import 'package:comwell_key_app/routing/app_router.dart';
import 'package:comwell_key_app/themes/app_button_styles.dart';
import 'package:comwell_key_app/themes/app_textstyles.dart';
import 'package:comwell_key_app/themes/dark_theme.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/tracking/comwell_tracking.dart';
import 'package:comwell_key_app/utils/context_utils.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:comwell_key_app/utils/seos_repository.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:payment_plugin/presentation/app/bloc/payment_cards_cubit.dart';
import 'package:payment_plugin/presentation/app/bloc/payment_cubit.dart';

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

  @override
  Widget build(BuildContext context) {
    return MultiRepositoryProvider(
      providers: [
        RepositoryProvider(create: (context) => lightTheme),
        RepositoryProvider(create: (context) => AppTextStyles()),
        RepositoryProvider(
          create: (context) {
            final theme = Theme.of(context);
            return AppButtonStyles(theme.colorScheme, context.read());
          },
        ),
        RepositoryProvider(create: (context) => ComwellTracking()),
      ],
      child: MultiBlocProvider(
        providers: [
          BlocProvider(
            create: (context) => AppCubit(locator.get()),
          ),
          BlocProvider(
            create: (context) => ConnectionStateCubit(
              locator.get(),
              locator.get(),
            ),
          ),
          BlocProvider<KeyBloc>(
            lazy: true,
            create: (BuildContext context) => KeyBloc(
              keyRepository: locator<KeyRepository>(),
              seosRepository: locator<SeosRepository>(),
              bookingDetailsRepository: locator<BookingDetailsRepository>(),
            ),
          ),
          BlocProvider<OverviewCubit>(
            lazy: true,
            create: (BuildContext context) => OverviewCubit(
              locator.get(),
              locator.get(),
            ),
          ),
          BlocProvider<ProfileCubit>(
            create: (BuildContext context) => ProfileCubit(
              locator.get(),
              locator.get(),
            ),
          ),
          BlocProvider<PaymentCubit>(
            lazy: false,
            create: (context) => PaymentCubit(adyenRepository: locator()),
          ),
          BlocProvider<PaymentCardsCubit>(
            create: (context) => PaymentCardsCubit(adyenRepository: locator()),
          ),
        ],
        child: MaterialApp.router(
          title: 'Comwell Key App',
          routerConfig: router,
          supportedLocales: AppLocalizations.supportedLocales,
          localizationsDelegates: localizationDelegates,
          builder: (context, child) {
            if (child != null) {
              return MediaQuery(
                data: context.mq.copyWith(textScaler: TextScaler.noScaling),
                child: child,
              );
            }
            return const SizedBox.shrink();
          },
          theme: lightTheme,
          darkTheme: darkTheme,
          themeMode: ThemeMode.system,
        ),
      ),
    );
  }
}