import 'dart:io';

import 'package:easy_localization/easy_localization.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:hmg_patient_app_new/core/app_state.dart';
import 'package:hmg_patient_app_new/core/dependencies.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart';
import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart';
import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart';
import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart';
import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart';
import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart';
import 'package:hmg_patient_app_new/routes/app_routes.dart';
import 'package:hmg_patient_app_new/services/logger_service.dart';
import 'package:hmg_patient_app_new/services/navigation_service.dart';
import 'package:hmg_patient_app_new/theme/app_theme.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';

import 'core/utils/size_utils.dart';
import 'firebase_options.dart';

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  getIt.get<LoggerService>().logInfo("Firebase backgroundMessageHandler Main!!!");
}

class MyHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext? context) {
    return super.createHttpClient(context)..badCertificateCallback = (X509Certificate cert, String host, int port) => true;
  }
}

Future<void> callAppStateInitializations() async {
  final String deviceTypeId = (Platform.isIOS
      ? "1"
      : await Utils.isGoogleServicesAvailable()
          ? "2"
          : "3");
  AppState appState = getIt.get<AppState>();
  appState.setDeviceTypeID = deviceTypeId;
}

Future<void> callInitializations() async {
  WidgetsFlutterBinding.ensureInitialized();
  await EasyLocalization.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  AppDependencies.addDependencies();
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  HttpOverrides.global = MyHttpOverrides();
  await callAppStateInitializations();
}

void main() async {
  await callInitializations();
  runApp(
    EasyLocalization(
      supportedLocales: const <Locale>[
        Locale('en', 'US'),
        Locale('ar', 'SA'),
      ],
      path: 'assets/langs',
      fallbackLocale: Locale('en', 'US'),
      child: MultiProvider(providers: <SingleChildWidget>[
        ChangeNotifierProvider<LabViewModel>(
          create: (_) => LabViewModel(
            labRepo: getIt(),
            errorHandlerService: getIt(),
          ),
        ),
        ChangeNotifierProvider<RadiologyViewModel>(
          create: (_) => RadiologyViewModel(
            radiologyRepo: getIt(),
            errorHandlerService: getIt(),
          ),
        ),
        ChangeNotifierProvider<PrescriptionsViewModel>(
          create: (_) => PrescriptionsViewModel(
            prescriptionsRepo: getIt(),
            errorHandlerService: getIt(),
          ),
        ),
        ChangeNotifierProvider<InsuranceViewModel>(
          create: (_) => InsuranceViewModel(
            insuranceRepo: getIt(),
            errorHandlerService: getIt(),
          ),
        ),
        ChangeNotifierProvider<MedicalFileViewModel>(
          create: (_) => MedicalFileViewModel(),
        ),
        ChangeNotifierProvider<MyAppointmentsViewModel>(
          create: (_) => MyAppointmentsViewModel(
            myAppointmentsRepo: getIt(),
            errorHandlerService: getIt(),
          ),
        ),
        ChangeNotifierProvider<PayfortViewModel>(
          create: (_) => PayfortViewModel(
            payfortRepo: getIt(),
            errorHandlerService: getIt(),
          ),
        ),
        ChangeNotifierProvider<AuthenticationViewModel>(
          create: (_) => AuthenticationViewModel(
            authenticationRepo: getIt(),
            appState: getIt(),
            dialogService: getIt(),
            errorHandlerService: getIt(),
            navigationService: getIt(),
            cacheService: getIt(),
          ),
        ),
      ], child: MyApp()),
    ),
  );
}

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

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      top: false, // Set to true if you want to avoid the notch area as well
      bottom: Platform.isIOS ? false : true,
      child: LayoutBuilder(
        builder: (context, constraints) {
          return Sizer(
            builder: (context, orientation, deviceType) {
              // SizeConfig().init(constraints, orientation);
              return MaterialApp(
                title: 'Dr. AlHabib',
                builder: (context, mchild) {
                  return MediaQuery(
                      data: MediaQuery.of(context).copyWith(
                        textScaler: TextScaler.linear(1.0),
                      ),
                      child: mchild!);
                },
                showSemanticsDebugger: false,
                debugShowCheckedModeBanner: false,
                localizationsDelegates: context.localizationDelegates,
                supportedLocales: context.supportedLocales,
                locale: context.locale,
                initialRoute: AppRoutes.initialRoute,
                routes: AppRoutes.routes,
                theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"),
                navigatorKey: getIt.get<NavigationService>().navigatorKey,
              );
            },
          );
        },
      ),
    );
  }
}
