import 'package:common/services/msal_service.dart';
import 'package:concierge/data/remote/api/payment_interceptor.dart';
import 'package:concierge/presentation/app/cart_cubit.dart';
import 'package:concierge/presentation/app/concierge_cubit.dart';
import 'package:concierge/presentation/screens/confirm_order/confirm_order_route.dart';
import 'package:concierge/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart';
import 'package:concierge/presentation/screens/payment/payment_route.dart';
import 'package:concierge/presentation/screens/product_details/product_details_route.dart';
import 'package:concierge/presentation/screens/provide_location/provide_location_route.dart';
import 'package:concierge/presentation/screens/receipt/receipt_route.dart';
import 'package:concierge/presentation/screens/review_order/review_order_route.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:payment_plugin/payment_plugin.dart';
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
import 'data/remote/api/concierge_interceptor.dart';
import 'data/remote/api/concierge_service.dart';
import 'domain/repositories/property_repository.dart';
import 'flavors.dart';

final conciergeNavigatorKey = GlobalKey<NavigatorState>();

final conciergeShellRoute = StatefulShellRoute.indexedStack(
  branches: [
    StatefulShellBranch(
      navigatorKey: conciergeNavigatorKey,
      routes: [
        $hotelOverviewPageRoute,
        $productDetailsRoute,
        $reviewOrderRoute,
        $confirmOrderRoute,
        $paymentRoute,
        $provideLocationRoute,
        $receiptRoute,
      ],
    ),
  ],
  builder: (context, state, child) {
    Future<(ConciergeService, Dio)> getDependencies() async {
      try {
        F.appFlavor = Flavor.values.firstWhere((flavor) => flavor.name == appFlavor?.toLowerCase());
        final msal = MSALService();
        await msal.init();
        final dio = Dio(BaseOptions(baseUrl: F.baseConciergeUrl));
        dio.interceptors.addAll([
          ConciergeInterceptor(msal),
          if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
        ]);
        final apimDio = Dio(BaseOptions(baseUrl: F.baseApimUrl));
        apimDio.interceptors.addAll([
          PaymentInterceptor(msal),
          if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
        ]);
        await PaymentPlugin.initialize(config: PaymentConfig(dio: apimDio));
        return (ConciergeService(dio), apimDio);
      } catch (e, st) {
        if (kDebugMode) print("qqq concierge init error=$e, $st");
        rethrow;
      }
    }

    return FutureBuilder(
      future: getDependencies(),
      builder: (context, asyncSnapshot) {
        final (service, apimDio) = asyncSnapshot.requireData;
        return MultiRepositoryProvider(
          providers: [
            RepositoryProvider(create: (context) => PropertyRepository(service)),
            RepositoryProvider(create: (context) => AdyenRepository(dio: apimDio)),
            RepositoryProvider(create: (context) => PaymentPlugin.instance),
          ],
          child: MultiBlocProvider(
            providers: [
              BlocProvider(
                create: (context) => ConciergeCubit(
                  context.read(),
                  launchParameters: state.uri.queryParameters,
                ),
              ),
              BlocProvider(create: (context) => CartCubit(context.read())),
            ],
            child: child,
          ),
        );
      },
    );
  },
);