using Data.SeaHavenIndustries; using SeaHaven.DataServices.Models; namespace SeaHaven.DataServices.Interfaces { public interface IWorkOrderDataService { // Query operations Task GetByIdAsync(int id); Task GetByIdWithDetailsAsync(int id); Task GetByInternalNumberAsync(string internalNumber); Task> GetAllAsync(); Task> GetByLocationIdAsync(int locationId); Task> GetByAssigneeAsync(string assigneeId); Task> GetByStatusAsync(string status); Task> GetByPriorityAsync(string priority); // Paged results Task<(IEnumerable Items, int TotalCount)> GetPagedAsync( int page, int pageSize, string? search = null, string? status = null, string? priority = null); // Paged list with detailed information (for GetWorkOrderList endpoint) Task<(IEnumerable Items, int TotalCount)> GetWorkOrderListPagedAsync( int page, int pageSize, string? search = null, string? status = null, string? assignee = null, int? locationId = null, string? sortBy = "lastUpdated", string? sortDir = "desc"); // Command operations Task AddAsync(WorkOrder workOrder); Task UpdateAsync(WorkOrder workOrder); Task DeleteAsync(int id); // Related entities - Read Task> GetWorkOrderContactsAsync(int workOrderId); Task> GetWorkOrderCategoriesAsync(int workOrderId); Task> GetWorkOrderAttachmentsAsync(int workOrderId); Task> GetWorkOrderCommentsAsync(int workOrderId); Task> GetWorkOrderAuditLogsAsync(int workOrderId); // Related entities - Write Task AddWorkOrderContactsAsync(int workOrderId, IEnumerable contactIds); Task AddWorkOrderCategoriesAsync(int workOrderId, IEnumerable categoryIds); Task AddWorkOrderAttachmentAsync(WorkOrderAttachments attachment); Task AddAuditLogAsync(WorkOrderAuditLog auditLog); Task AddAuditLogsAsync(IReadOnlyCollection auditLogs); // Related entities - Delete Task DeleteWorkOrderContactsAsync(int workOrderId); Task DeleteWorkOrderCategoriesAsync(int workOrderId); Task DeleteWorkOrderAttachmentsAsync(int workOrderId); // Validation Task ExistsAsync(int id); Task InternalNumberExistsAsync(string internalNumber, int? excludeId = null); // Internal number generation Task GenerateNextInternalWONumberAsync(); // Statistics Task CountAsync(); Task CountByStatusAsync(string status); Task CountByPriorityAsync(string priority); Task CountByLocationAsync(int locationId); Task> GetAllWithDetailsAsync(); // Batched lookup: server-filters the distinct requested ids, excludes templates, // eagerly loads the location detail, deduplicates, and returns results in input order. Task> GetByRequestedIdsWithDetailsAsync( IReadOnlyCollection ids, CancellationToken cancellationToken); // Complex read models Task GetWorkOrderDetailAsync(int id); Task> GetNonTemplateWorkOrdersWithLocationsAsync(); } }