import 'package:comwell_key_app/authentication/authentication_repository.dart';
import 'package:comwell_key_app/check_out/check_out_repository.dart';
import 'package:comwell_key_app/choose_share_room/choose_share_room_repository.dart';
import 'package:comwell_key_app/contact/repository/contact_repository.dart';
import 'package:common/services/msal_service.dart';
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/domain/repositories/bluetooth_repository.dart';
import 'package:comwell_key_app/domain/repositories/booking_details_repository.dart';
import 'package:comwell_key_app/domain/repositories/internet_status_repository.dart';
import 'package:comwell_key_app/find_booking/find_booking_repository.dart';
import 'package:comwell_key_app/hotel_information/repository/hotel_information_repository.dart';
import 'package:comwell_key_app/domain/repositories/housekeeping_repository.dart';
import 'package:comwell_key_app/key/repository/key_repository.dart';
import 'package:comwell_key_app/my_booking/my_booking_repository.dart';
import 'package:comwell_key_app/domain/repositories/notifications_repository.dart';
import 'package:comwell_key_app/overview/repository/overview_repository.dart';
import 'package:comwell_key_app/domain/repositories/pregistration_repository.dart';
import 'package:comwell_key_app/domain/repositories/profile_repository.dart';
import 'package:comwell_key_app/domain/repositories/profile_settings_repository.dart';
import 'package:comwell_key_app/services/api.dart';
import 'package:comwell_key_app/services/http_client.dart';
import 'package:comwell_key_app/share/share_booking_repository.dart';
import 'package:comwell_key_app/push_notifications/push_notification_repository.dart';
import 'package:comwell_key_app/tracking/comwell_tracking.dart';
import 'package:comwell_key_app/up_sales/up_sales_repository.dart';
import 'package:comwell_key_app/utils/secure_storage.dart';
import 'package:comwell_key_app/utils/seos_repository.dart';
import 'package:comwell_key_app/routing/app_router.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart';
import 'package:get_it/get_it.dart';
import 'package:payment_plugin/domain/repositories/adyen_repository.dart';
import 'package:seos_mobile_keys_plugin/seos_mobile_keys_plugin.dart';

final locator = GetIt.I;

void registerDatabase() {
  if (locator.isRegistered<ComwellDatabase>()) return;
  locator.registerLazySingleton<ComwellDatabase>(() {
    return ComwellDatabase();
  });
}

void setupLocator() {
  locator.registerFactory<DeviceInfoPlugin>(() => DeviceInfoPlugin());
  if (!kIsWeb) {
    locator.registerSingleton(ComwellPreferences());
    locator.registerSingleton(ComwellTracking());
    registerDatabase();
    locator.registerSingleton(SecureStorage());
    locator.registerSingleton(MSALService());
    locator.registerSingleton(SeosMobileKeysPlugin());
    locator.registerSingleton(ComwellHttpClient());
    locator.registerSingleton(Api());
    locator.registerFactory(() => KeyRepository(locator.get()));
    locator.registerSingleton(rootNavigatorKey);
    locator.registerSingleton(
      SeosRepository(
        locator.get(),
        locator.get(),
        locator.get(),
      ),
    );
    locator.registerFactory(() => OverviewRepository(locator.get()));
    locator.registerFactory(() => ProfileSettingsRepository());
    locator.registerSingleton(
      AuthenticationRepository(
        locator.get(),
        locator.get(),
        locator.get(),
        locator.get(),
      ),
    );
    locator.registerFactory(() => BookingDetailsRepository());
    locator.registerFactory(() => ProfileRepository(locator.get(), locator.get()));
    locator.registerFactory(() => PreregistrationRepository());
    locator.registerFactory(() => HotelInformationRepository());
    locator.registerFactory(
      () => NotificationsRepository(
        locator(),
        locator(),
      ),
    );
    locator.registerFactory(() => ContactRepository());
    locator.registerFactory(() => UpSalesRepository());
    locator.registerFactory(() => ChooseShareRoomRepository());
    locator.registerFactory(() => FindBookingRepository());
    locator.registerFactory(() => CheckOutRepository());
    locator.registerFactory(() => MyBookingRepository());
    locator.registerFactory(() => ShareBookingRepository());
    locator.registerFactory(() => HouseKeepingRepository());
    locator.registerFactory(() => PushNotificationRepository());
    locator.registerFactory(() => BluetoothRepository());
    locator.registerFactory(() => InternetStatusRepository());
    locator.registerFactory(() => AdyenRepository(dio: locator.get<ComwellHttpClient>().dio));
  }
}