import 'package:common/services/msal_service.dart';
import 'package:common/utils/env_utils.dart';
import 'package:concierge/data/remote/api/concierge_interceptor.dart';
import 'package:concierge/data/remote/api/concierge_service.dart';
import 'package:concierge/domain/repositories/property_repository.dart';
import 'package:concierge/presentation/navigation/router.dart';
import 'package:concierge/presentation/screens/hotel_overview_page/bloc/hotel_overview_page_cubit.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:payment_plugin/payment_plugin.dart';
import 'package:pretty_dio_logger/pretty_dio_logger.dart';

import 'flavors.dart';

class ConciergeApp extends StatelessWidget {
  const ConciergeApp({
    super.key,
    required this.authToken,
    required this.flavor,
    required this.hotelCode,
  });

  final String hotelCode;
  final String authToken;
  final String flavor;

  Future<ConciergeService> _getDependencies() async {
    F.appFlavor = Flavor.values.firstWhere((flavor) {
      return flavor.name == this.flavor.toLowerCase();
    });
    final msal = MSALService();
    await msal.init();
    final conciergeDio = Dio(BaseOptions(baseUrl: F.baseConciergeUrl));
    conciergeDio.interceptors.addAll([
      ConciergeInterceptor(msal),
      if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
    ]);
    final apimDio = Dio(
      BaseOptions(baseUrl: dotenv.SERVICE_URL),
    );
    apimDio.interceptors.addAll([
      ConciergeInterceptor(msal),
      if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
    ]);
    await PaymentPlugin.initialize(config: PaymentConfig(dio: apimDio));
    return (ConciergeService(conciergeDio));
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _getDependencies(),
      builder: (context, asyncSnapshot) {
        if (asyncSnapshot.connectionState == ConnectionState.waiting) {
          return Center(child: CircularProgressIndicator());
        }
        if (asyncSnapshot.hasError) {
          return Center(child: Text(asyncSnapshot.error.toString()));
        }
        final (service) = asyncSnapshot.data!;
        return MultiRepositoryProvider(
          providers: [
            RepositoryProvider(create: (context) => PropertyRepository(service)),
            RepositoryProvider(create: (context) => PaymentPlugin.instance),
          ],
          child: MultiBlocProvider(
            providers: [
              BlocProvider(
                create: (context) => HotelOverviewPageCubit(
                  context.read(),
                  context.read(),
                  hotelCode: hotelCode,
                ),
              ),
            ],
            child: Builder(
              builder: (context) {
                return MaterialApp.router(
                  routerConfig: router,
                );
              },
            ),
          ),
        );
      },
    );
  }
}