using Fitness_core_BE.Interfaces; using Fitness_core_BE.Models; using Microsoft.EntityFrameworkCore; namespace Fitness_core_BE.Repos { public class BookingRepository : IBookingRepository { private readonly TenantDbContext _context; public BookingRepository(TenantDbContext context) { _context = context; } public async Task CreateBooking(Booking booking) { booking.BookingId = Guid.NewGuid(); booking.CreatedAt = DateTime.UtcNow; _context.Bookings.Add(booking); return booking; } public Task GetBookingById(Guid bookingId) => _context.Bookings .Include(b => b.FacilitySession).ThenInclude(s => s.Facility) .FirstOrDefaultAsync(b => b.BookingId == bookingId); public Task GetActiveBookingByOtp(string otpCode) => _context.Bookings .Include(b => b.FacilitySession).ThenInclude(s => s.Facility) .FirstOrDefaultAsync(b => b.OtpCode == otpCode && b.Status == "Confirmed"); public Task> GetBookingsForSession(Guid facilitySessionId) => _context.Bookings .Where(b => b.FKFacilitySessionId == facilitySessionId) .OrderBy(b => b.BookedAt) .ToListAsync(); public Task> GetBookingsForCustomer(Guid customerId) => _context.Bookings .Include(b => b.FacilitySession).ThenInclude(s => s.Facility) .Where(b => b.FKCustomerId == customerId) .OrderByDescending(b => b.BookedAt) .ToListAsync(); public Task CustomerHasActiveBookingForSession(Guid facilitySessionId, Guid customerId) => _context.Bookings.AnyAsync(b => b.FKFacilitySessionId == facilitySessionId && b.FKCustomerId == customerId && b.Status != "Cancelled"); } }