using Distribution.Data; using Distribution.Models; using Microsoft.EntityFrameworkCore; namespace Distribution.Features.Ride; public class RideRepository(AppDBContext context) : IRideRepository { public async Task GetByIdAsync(Guid id) => await context.DeliveryRuns .Include(r => r.Vehicle) .Include(r => r.DriverProfile).ThenInclude(dp => dp.User) .Include(r => r.Route) .Include(r => r.SourceWarehouse) .FirstOrDefaultAsync(r => r.Id == id); public async Task> GetAllAsync(RideStatus? status, RideType? type, Guid? driverProfileId, Guid? vehicleId, int page, int pageSize) => await context.DeliveryRuns .Include(r => r.Vehicle) .Include(r => r.DriverProfile).ThenInclude(dp => dp.User) .Include(r => r.Route) .Include(r => r.SourceWarehouse) .Where(r => (status == null || r.Status == status) && (type == null || r.RideType == type) && (driverProfileId == null || r.FK_DriverProfileId == driverProfileId) && (vehicleId == null || r.FK_VehicleId == vehicleId)) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); public async Task GetCountAsync(RideStatus? status, RideType? type, Guid? driverProfileId, Guid? vehicleId) => await context.DeliveryRuns .CountAsync(r => (status == null || r.Status == status) && (type == null || r.RideType == type) && (driverProfileId == null || r.FK_DriverProfileId == driverProfileId) && (vehicleId == null || r.FK_VehicleId == vehicleId)); public async Task HasOpenOrActiveRideForVehicleAsync(Guid vehicleId, Guid? excludeRideId = null) => await context.DeliveryRuns.AnyAsync(r => r.FK_VehicleId == vehicleId && r.Id != excludeRideId && (r.Status == RideStatus.Open || r.Status == RideStatus.Active)); public async Task> GetActiveRidesAsync(Guid? excludeRideId = null) => await context.DeliveryRuns .Include(r => r.Vehicle) .Include(r => r.DriverProfile).ThenInclude(dp => dp.User) .Include(r => r.Route) .Where(r => r.Id != excludeRideId && r.Status == RideStatus.Active) .ToListAsync(); public async Task> GetActiveOrdersByRouteIdAsync(Guid routeId) => await context.Orders .Include(o => o.Store) .Where(o => o.IsActive && o.Store.FK_RouteId == routeId) .OrderByDescending(o => o.OrderDate) .Select(o => new OrderSummaryModel( o.Id, o.FK_StoreId, o.Store.StoreName, o.OrderDate, o.TotalAmount)) .ToListAsync(); public async Task AddAsync(DeliveryRun ride) => await context.DeliveryRuns.AddAsync(ride); public void Update(DeliveryRun ride) => context.DeliveryRuns.Update(ride); }