using System.Security.Claims; using SeaHaven.DataServices.Interfaces; using SeaHaven.Services.DTOs; using SeaHaven.Services.Exceptions; using SeaHaven.Services.Helpers; using SeaHaven.Services.Interfaces; namespace SeaHaven.Services.Implementation { public class DashboardService : IDashboardService { private readonly IDashboardDataService _dataService; private readonly IWorkOrderAccountResolver _accountResolver; public DashboardService( IDashboardDataService dataService, IWorkOrderAccountResolver accountResolver) { _dataService = dataService; _accountResolver = accountResolver; } public async Task GetStatsAsync( ClaimsPrincipal user, DashboardStatsQueryDTO query, CancellationToken cancellationToken) { var accountId = _accountResolver.ResolveAccountFilter(user); var dispatcherId = user.IsInRole("Dispatcher") ? user.FindFirstValue(ClaimTypes.NameIdentifier) : null; if (user.IsInRole("Dispatcher") && string.IsNullOrWhiteSpace(dispatcherId)) throw new WorkOrderBoardValidationException("Forbidden", "Dispatcher identity is required."); var counts = await _dataService.GetWorkOrderCountsAsync(accountId, cancellationToken); var workOrders = await _dataService.GetDashboardWorkOrdersAsync( accountId, dispatcherId, query.DateFrom, query.DateTo, cancellationToken); var metrics = DashboardMetrics.Calculate(workOrders, DashboardBusinessTime.Today()); var useMetrics = query.DateFrom.HasValue && query.DateTo.HasValue || dispatcherId is not null; return new DashboardStatsDTO { Total = useMetrics ? metrics.Total : counts.Total, Open = useMetrics ? metrics.Open : counts.Open, NotDispatched = useMetrics ? metrics.NotDispatched : counts.NotDispatched, Completed = useMetrics ? metrics.Completed : counts.Completed, Breakdown = metrics.Breakdown, DueCount = metrics.DueCount, CompletedDueCount = metrics.CompletedDueCount, CompletionRate = metrics.CompletionRate, AverageResolutionDays = metrics.AverageResolutionDays }; } } }