import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/services/api.dart';
import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
import 'package:comwell_key_app/services/models/bookings_dto.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:comwell_key_app/utils/secure_storage.dart';
import 'package:flutter/widgets.dart';
class BookingDetailsRepository {
final api = Api();
final secureStorage = locator<SecureStorage>();
Future<String?> doesInvitationCodeExist(String key) async {
return await secureStorage.read(key);
}
Future<Booking> getRemoteBookingDetails(
String hmsConfirmationNumber, String hotelCode) async {
final response =
await api.getBookingDetails(hmsConfirmationNumber, hotelCode);
return response!.toBooking();
}
Future<Booking> getBookingDetails(
String hmsConfirmationNumber, String hotelCode) async {
final booking = await _checkIfBookingDetailsExists(hmsConfirmationNumber);
if (booking != null) {
return booking;
}
final newBooking = await _fetchAndSaveBookingDetailsToDatabase(
hmsConfirmationNumber, hotelCode);
return newBooking;
}
Future<Booking?> _checkIfBookingDetailsExists(
String hmsConfirmationNumber) async {
try {
final booking = await locator<ComwellDatabase>()
.bookingsDao
.getBookingDetails(hmsConfirmationNumber);
return booking;
} catch (e) {
debugPrint("Error checking if booking details exists: $e");
return null;
}
}
Future<Booking> _fetchAndSaveBookingDetailsToDatabase(
String hmsConfirmationNumber, String hotelCode) async {
try {
final response =
await api.getBookingDetails(hmsConfirmationNumber, hotelCode);
await locator<ComwellDatabase>().bookingsDao.insertBookings(
BookingsDTO(current: [response!], past: [], cancelled: []));
final booking = response.toBooking();
debugPrint("Booking saved to database: ${booking.confirmationNumber}");
return booking;
} on Exception catch (e) {
debugPrint("Error fetching booking details: $e");
rethrow;
}
}
}