using Data.SeaHavenIndustries; using Microsoft.EntityFrameworkCore; using SeaHaven.DataServices.Helpers; using SeaHaven.DataServices.Interfaces; namespace SeaHaven.DataServices.Implementation { public class WorkOrderAdvancedSearchDataService : IWorkOrderAdvancedSearchDataService { private readonly ApplicationDbContext _context; public WorkOrderAdvancedSearchDataService(ApplicationDbContext context) { _context = context; } public async Task SearchAsync(WorkOrderAdvancedSearchQuery query) { var baseQuery = WorkOrderBoardQueryFilters.ApplyBaseScope(_context.workOrders.AsNoTracking()); if (query.AccountId.HasValue) baseQuery = WorkOrderBoardQueryFilters.ApplyAccountScope(baseQuery, query.AccountId.Value); baseQuery = WorkOrderBoardQueryFilters.ApplyDateRangeFilter(baseQuery, query.DateFrom, query.DateTo); baseQuery = WorkOrderBoardQueryFilters.ApplySiteFilter(baseQuery, query.Sites); baseQuery = WorkOrderBoardQueryFilters.ApplyTypeFilter(baseQuery, query.Types, query.Overdue); baseQuery = WorkOrderBoardQueryFilters.ApplyDispatcherFilter( baseQuery, query.Dispatchers, query.MyWorkOrders, query.CurrentUserId); baseQuery = WorkOrderBoardQueryFilters.ApplyStatusFilter(baseQuery, query.Statuses); baseQuery = WorkOrderBoardQueryFilters.ApplyPmTypeFilter(baseQuery, query.PmTypes); baseQuery = WorkOrderBoardQueryFilters.ApplyVendorFilter(baseQuery, query.VendorIds); baseQuery = WorkOrderBoardQueryFilters.ApplyDocStatusFilter(baseQuery, query.DocStatuses); var normalizedSearch = WorkOrderBoardSearchFilter.NormalizeSearch(query.Search); if (normalizedSearch != null) baseQuery = WorkOrderBoardSearchFilter.Apply(baseQuery, normalizedSearch); var totalCount = await baseQuery.CountAsync(); var sorted = ApplySort(baseQuery, query.SortBy, query.SortDir); var paged = sorted .Skip(query.Page * query.PageSize) .Take(query.PageSize); var rows = await WorkOrderBoardProjection.ProjectRowsAsync(_context, paged, isUnscheduled: false); return new WorkOrderAdvancedSearchResult(rows, totalCount); } private static IQueryable ApplySort(IQueryable query, string sortBy, string sortDir) { var descending = string.Equals(sortDir, "desc", StringComparison.OrdinalIgnoreCase); var field = (sortBy ?? "scheduledDate").Trim().ToLowerInvariant(); return field switch { "wonumber" or "woNumber" => descending ? query.OrderByDescending(w => w.InternalWONumber) : query.OrderBy(w => w.InternalWONumber), "duedate" or "dueDate" => descending ? query.OrderByDescending(w => w.DueDate).ThenBy(w => w.InternalWONumber) : query.OrderBy(w => w.DueDate).ThenBy(w => w.InternalWONumber), _ => descending ? query.OrderByDescending(w => w.ScheduledDate).ThenByDescending(w => w.InternalWONumber) : query.OrderBy(w => w.ScheduledDate).ThenBy(w => w.InternalWONumber) }; } } }