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