import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/domain/repositories/booking_details_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/services/api.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:comwell_key_app/utils/seos_repository.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';

class CheckInRepository {
  final api = Api();
  final db = locator.get<ComwellDatabase>();
  final seosRepository = locator<SeosRepository>();
  final profileRepository = locator<ProfileRepository>();
  final bookingDetailsRepository = locator<BookingDetailsRepository>();

  Future<dynamic> checkIn(String confirmationNumber) async {
    try {
      final response = await api.checkIn(confirmationNumber);
      return response;
    } on DioException catch (err) {
      if (err.response?.data != null) {
        final errorData = err.response?.data as Map<String, dynamic>;
        throw Exception("${errorData['title']}: ${errorData['detail']}");
      }
      throw Exception("Failed to check in: ${err.message}");
    } catch (err, st) {
      debugPrint("error in checkInRepository: $err, $st");
      throw Exception("An unexpected error occurred during check-in");
    }
  }

  Future<Booking> getBookingDetails(String hmsConfirmationNumber, String hotelCode) async {
    final booking = await bookingDetailsRepository.getBookingDetails(hmsConfirmationNumber, hotelCode);
    return booking;
  }

  Future<void> checkIfSetup() async {
    final isSetup = await seosRepository.isEndpointSetup();
    if (!isSetup) await seosRepository.startMobilePlugin();
  }

  Future<void> provisionKey(String hmsConfirmationNumber, String hotelCode) async {
    await seosRepository.provisionKey(bookingId: hmsConfirmationNumber, hotelCode: hotelCode);
  }

  Future<void> getKeys(String hmsConfirmationNumber, String hotelCode) async {
    final keys = await seosRepository.refreshKeys();
    debugPrint("keys: $keys");
    if (keys.isEmpty) {
      throw Exception("Could not provision key for this booking");
    }
  }

  static final mockBooking = Booking(
    id: "helloworld",
    firstName: "firstName",
    lastName: "lastName",
    bookerFirstName: "bookerFirstName",
    bookerLastName: "bookerLastName",
    isPrimaryGuest: false,
    roomNumber: "1234",
    startDate: DateTime.now(),
    endDate: DateTime.now(),
    confirmationNumber: "confirmationNumber",
    reservationStatus: ReservationStatus.newreservation,
    image: "",
    hotelName: "hotelName",
    roomType: "roomType",
    children: 0,
    adults: 2,
    hotelCode: "hotelCode",
    balance: 100,
    maskedCardNumber: "1234567890",
    bookingDate: DateTime.now(),
    digitalCard: true,
    guests: null,
    addOnItems: const [],
  );
}