import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/overview/models/bookings.dart';
import 'package:comwell_key_app/overview/repository/overview_repository.dart';

class MockOverviewRepository extends Mock implements OverviewRepository {}

void main() {
  late OverviewRepository overviewRepository;

  setUp(() {
    overviewRepository = MockOverviewRepository();
  });

  group('OverviewRepository', () {
    test('fetchAllBookingsForUser returns Bookings', () async { 
      const userId = '1';
      final bookings = Bookings(
        current: [
          Booking(
            id: '1',
            firstName: 'John',
            lastName: 'Doe',
            reservationStatus: ReservationStatus.newreservation,
            roomNumber: '101',
            startDate: DateTime.now(),
            endDate: DateTime.now().add(const Duration(days: 1)),
            confirmationNumber: "confirmationNumber",
            image: 'image_url',
            hotelName: 'Hotel Name',
            roomType: 'Deluxe',
            children: 2,
            adults: 2,
            hotelCode: 'H001',
            bookerFirstName: "John",
            bookerLastName: "Doe",
            isPrimaryGuest: true,
            bookingDate: DateTime.now(),
            digitalCard: true,
            balance: 100,
            maskedCardNumber: "1234567890",
            addOnItems: const []
          ),
        ],
        past: const [],
        cancelled: const [],
      );

      when(() => overviewRepository.fetchAllBookingsForUser())
          .thenAnswer((_) async => bookings);

      final result = await overviewRepository.fetchAllBookingsForUser();

      expect(result, bookings);
      verify(() => overviewRepository.fetchAllBookingsForUser())
          .called(1);
    });

    test('findBooking returns Booking', () async {
      const bookingReference = '1';
      const lastName = 'Doe';
      final booking = Booking(
        id: '1',
        roomNumber: '101',
        startDate: DateTime.now(),
        endDate: DateTime.now().add(const Duration(days: 1)),
        image: 'image_url',
        hotelName: 'Hotel Name',
        roomType: 'Deluxe',
        confirmationNumber: "confirmationNumber",
        children: 2,
        adults: 2,
        hotelCode: 'H001',
        firstName: "John",
        lastName: "Doe",
        bookerFirstName: "John",
        bookerLastName: "Doe",
        isPrimaryGuest: true,
        bookingDate: DateTime.now(),
        digitalCard: true,
        balance: 100,
        reservationStatus: ReservationStatus.newreservation,
        maskedCardNumber: "1234567890",
        addOnItems: const []
      );

      when(() => overviewRepository.findBooking(bookingReference, lastName))
          .thenAnswer((_) async => booking);

      final result =
          await overviewRepository.findBooking(bookingReference, lastName);

      expect(result, booking);
      verify(() => overviewRepository.findBooking(bookingReference, lastName))
          .called(1);
    });

    test('findBooking returns null when booking is not found', () async {
      const bookingReference = '1';
      const lastName = 'Doe';

      when(() => overviewRepository.findBooking(bookingReference, lastName))
          .thenAnswer((_) async => null);

      final result =
          await overviewRepository.findBooking(bookingReference, lastName);

      expect(result, isNull);
      verify(() => overviewRepository.findBooking(bookingReference, lastName))
          .called(1);
    });
  });
}