using System.Security.Claims; using SeaHaven.DataServices.Helpers; using SeaHaven.DataServices.Interfaces; using SeaHaven.Services.DTOs; using SeaHaven.Services.Helpers; using SeaHaven.Services.Interfaces; namespace SeaHaven.Services.Implementation { public class WorkOrderAdvancedSearchService : IWorkOrderAdvancedSearchService { private const int DefaultPageSize = 100; private const int MaxPageSize = 200; private readonly IWorkOrderAdvancedSearchDataService _searchDataService; private readonly IWorkOrderAccountResolver _accountResolver; public WorkOrderAdvancedSearchService( IWorkOrderAdvancedSearchDataService searchDataService, IWorkOrderAccountResolver accountResolver) { _searchDataService = searchDataService; _accountResolver = accountResolver; } public async Task> SearchAsync( WorkOrderAdvancedSearchQueryDto query, ClaimsPrincipal user, string? currentUserId) { var accountId = _accountResolver.ResolveAccountFilter(user); var page = query.Page < 0 ? 0 : query.Page; var pageSize = query.PageSize < 1 ? DefaultPageSize : Math.Min(query.PageSize, MaxPageSize); // Unscheduled-only mode ignores the scheduled-date range entirely; // the inert wide range keeps the data contract satisfied. var dateRange = query.UnscheduledOnly ? new WorkOrderSearchDateRange(DateOnly.MinValue, DateOnly.MaxValue) : WorkOrderSearchDateRangeResolver.Resolve( query.DatePreset, query.DateFrom, query.DateTo); var sortBy = WorkOrderBoardSortFields.NormalizeOrThrow(query.SortBy); var ids = WorkOrderIdSet.ParseOrThrow(query.Ids); var dataQuery = new WorkOrderAdvancedSearchQuery( WorkOrderBoardSearchFilter.NormalizeSearch(query.Search), dateRange.From, dateRange.To, query.UnscheduledOnly, query.Sites, query.Regions, query.Types, query.Overdue, query.Dispatchers, query.Statuses, query.PmTypes, query.VendorIds, query.DocStatuses, query.Severities, query.Rescheduled, query.CarriedOver, query.AddOn, query.AvetaOnly, query.FlagColors, query.InternalOnly, query.HasUplift, query.UpliftStatuses, query.MyWorkOrders, currentUserId, page, pageSize, sortBy, query.SortDir ?? "asc", accountId, WorkOrderSearchDateRangeResolver.ResolveIncludeDateless( query.IncludeDateless, query.DatePreset, query.DateFrom, query.DateTo), ids); var result = await _searchDataService.SearchAsync(dataQuery); var utcNow = DateTime.UtcNow; return new PagedResult { Items = result.Rows.Select(r => WorkOrderBoardService.MapRawRow(r, utcNow)).ToList(), TotalCount = result.TotalCount, Page = page, PageSize = pageSize, PageBase = 0 }; } } }