using Fitness_core_BE.Models; namespace Fitness_core_BE.Interfaces { public interface IFacilityRepository { Task> GetAllFacilities(Guid clientId, bool includeInactive = false); Task GetFacilityById(Guid facilityId); Task CreateFacility(Facility facility); Task UpdateFacility(Facility facility); Task SetFacilityActive(Guid facilityId, Guid clientId, bool isActive); Task CreateFacilitySession(FacilitySession session); Task GetFacilitySessionById(Guid facilitySessionId); Task> GetSessions(Guid clientId, Guid? facilityId, DateTime fromUtc, DateTime toUtc); Task GetActiveBookingCount(Guid facilitySessionId); Task CancelFacilitySession(Guid facilitySessionId, Guid clientId); // Device binding (absorbed from the old IPlaceRepo -- one AccessDevice per Facility). Task GetDeviceByIdForClientAsync(Guid deviceId, Guid clientId); Task> GetDevicesByFacilityIdsAsync(List facilityIds); Task IsDeviceAssignedToAnotherFacilityAsync(Guid deviceId, Guid facilityId); Task AssignDeviceAsync(Guid facilityId, Guid deviceId); Task UnassignDeviceAsync(Guid facilityId); // CustomerPlan <-> Facility access-scoping (many-to-many). Replace-all semantics, like a // tags field. Absorbed from the old IPlaceRepo. Task SetPlanFacilitiesAsync(Guid customerPlanId, List facilityIds); Task> GetFacilityIdsForPlanAsync(Guid customerPlanId); Task>> GetFacilityIdsByPlanIdsAsync(List customerPlanIds); Task> GetFacilityNamesByIdsAsync(List facilityIds); // AdHoc booking support (new). See TenantDbContext's Booking (FKFacilityId, StartTime, // EndTime) index comment -- overlap is checked here rather than by a DB constraint. /// Counts non-cancelled/non-completed AdHoc bookings on this facility whose /// [StartTime, EndTime) overlaps the given window. Pass excludeBookingId when /// re-checking a booking being rescheduled, so it doesn't count against itself. Task GetOverlappingAdhocBookingCountAsync(Guid facilityId, DateTime startTime, DateTime endTime, Guid? excludeBookingId = null); /// Issues a row lock on the facility (SELECT ... FOR UPDATE) inside the caller's /// already-open unit-of-work transaction, serializing concurrent AdHoc-slot claims on the /// same facility so two overlapping bookings can't both pass the overlap-count check. Task LockFacilityForUpdateAsync(Guid facilityId); } }