import 'package:comwell_key_app/base/base_cubit.dart';
import 'package:comwell_key_app/my_booking/cubit/my_booking_state.dart';
import 'package:comwell_key_app/my_booking/my_booking_repository.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/domain/repositories/profile_repository.dart';
import 'package:comwell_key_app/tracking/comwell_tracking.dart';
import 'package:comwell_key_app/tracking/models/analytics_event_item.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:payment_plugin/presentation/app/bloc/payment_cubit.dart';
import 'package:url_launcher/url_launcher.dart';

import '../../utils/urls.dart';

class MyBookingCubit extends BaseCubit<MyBookingState> {
  final MyBookingRepository myBookingRepository;
  final ProfileRepository profileRepository = locator<ProfileRepository>();
  late Booking booking;
  final _tracking = locator<ComwellTracking>();
  final PaymentCubit paymentServicesCubit;

  MyBookingCubit(
    this.myBookingRepository,
    this.paymentServicesCubit, {
    required Booking initialBooking,
  }) : super(
         MyBookingState(
           booking: initialBooking,
           isLoading: false,
           error: null,
           applyClubPoints: false,
           clubPoints: 500,
           isTermsAccepted: false,
           showTermsError: false,
           items: initialBooking.addOnItems ?? [],
         ),
       ) {
    booking = initialBooking;
    init();
  }

  void init() async {
    try {
      // final user = await profileRepository.fetchProfileSettings();
      // safeEmit(state.clubPointsFetched(user.points));
    } catch (e, st) {
      logError(e, st);
      // safeEmit(state.copyWith(error: e));
    }
  }

  int get totalAddonBalance =>
      booking.addOnItems?.fold(0, (sum, item) => sum! + item.price.toInt()) ?? 0;

  bool get canContinueToPayment => booking.balance != 0 || (state.items.isNotEmpty);

  void onAcceptTermsChanged(bool value) {
    if (value) {
      safeEmit(state.termsAccepted());
    } else {
      safeEmit(state.termsDenied());
    }
  }

  void onApplyClubPointsClicked(bool value) {
    if (value) {
      safeEmit(state.clubPointsApplied());
    } else {
      safeEmit(state.clubPointsRemoved());
    }
  }

  void showTermsAndConditions() {
    launchUrl(Uri.parse(ComwellUrls.termsAndConditions));
  }

  Future<void> processPayment() async {
    //TODO: Finish this when upsales are implemented
    final analyticsEventItem = AnalyticsEventItem(
      hotelName: booking.hotelName,
      currency: "DKK",
      value: booking.balance?.toInt() ?? 0,
      placement: "placement",
      items: booking.addOnItems?.map((e) => e.description).toList() ?? [],
      itemIds: booking.addOnItems?.map((e) => e.code).toList() ?? [],
      itemName: "itemName",
      price: booking.balance?.toInt() ?? 0,
      quantity: 1,
      bookingReference: booking.confirmationNumber,
    );
    _tracking.trackBeginCheckout(analyticsEventItem);
    try {
      await paymentServicesCubit.createSession(
        booking.balance?.toInt() ?? 0,
        booking.confirmationNumber,
        state.applyClubPoints,
        booking.hotelCode,
      );
      await Future<void>.delayed(const Duration(milliseconds: 4000));
    } catch (e, st) {
      logError(e, st);
      safeEmit(state.setError());
    }
  }
}