using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using QMSDAL.DTO; using QMSDAL.Query.ChecklistAnalytics; namespace QMSDAL.CustomCode.ChecklistAnalytics { public class ChecklistAnalyticsDAL : IChecklistAnalyticsDAL { private readonly IQueryExecutor _QueryExecutor; public ChecklistAnalyticsDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } // ── KPI summary ─────────────────────────────────────────────────────── public async Task GetKpiAsync(LoginDTO login, CancellationToken ct = default) { try { var result = await _QueryExecutor .QuerySingleAsync( login, ChecklistAnalyticsQB.GET_KPI) .ConfigureAwait(false); return result ?? new ChecklistKpiDTO(); } catch (Exception) { throw; } } // ── Daily trend ─────────────────────────────────────────────────────── public async Task> GetTrendAsync( int days, LoginDTO login, CancellationToken ct = default) { try { var param = new { Days = days }; var result = await _QueryExecutor .QueryAsync( login, ChecklistAnalyticsQB.GET_TREND, param, cancellationToken: ct) .ConfigureAwait(false); return result ?? Enumerable.Empty(); } catch (Exception) { throw; } } // ── Timing phase breakdown ──────────────────────────────────────────── public async Task> GetTimingBreakdownAsync( LoginDTO login, CancellationToken ct = default) { try { var result = await _QueryExecutor .QueryAsync( login, ChecklistAnalyticsQB.GET_TIMING_BREAKDOWN, cancellationToken: ct) .ConfigureAwait(false); return result ?? Enumerable.Empty(); } catch (Exception) { throw; } } // ── Top failing items ───────────────────────────────────────────────── public async Task> GetTopFailuresAsync( int days, LoginDTO login, CancellationToken ct = default) { try { var param = new { Days = days }; var result = await _QueryExecutor .QueryAsync( login, ChecklistAnalyticsQB.GET_TOP_FAILURES, param, cancellationToken: ct) .ConfigureAwait(false); return result ?? Enumerable.Empty(); } catch (Exception) { throw; } } } }