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());
}
}
}