using System; using System.Globalization; using System.Text.Json; using GB5Shared.DTO.Framework.Criteria; using TMSDAL.DTO.Reports; namespace TMSBLL.Reports { // Shared CriteriaDTO -> TmsReportCriteria parsing for every TMS Reports-family endpoint -- // mirrors AccountsBLL.AccountReports.AccountReportCriteriaParser's shape/conventions exactly so // the wire format (SectionCriteriaList -> AttributesCriteriaList -> FieldName/FieldValue) behaves // identically across modules. public static class TmsReportCriteriaParser { public static TmsReportCriteria Parse(CriteriaDTO criteriaDTO) { var result = new TmsReportCriteria(); if (criteriaDTO?.SectionCriteriaList == null) return result; foreach (var section in criteriaDTO.SectionCriteriaList) { if (section?.AttributesCriteriaList == null) continue; foreach (var attr in section.AttributesCriteriaList) { if (attr.FieldValue == null) continue; var field = attr.FieldName?.ToLowerInvariant() ?? string.Empty; switch (field) { case "fromdate": result.FromDate = ParseDate(attr.FieldValue); break; case "todate": result.ToDate = ParseDate(attr.FieldValue); break; case "trainingdomainid": result.TrainingDomainId = ParseInt(attr.FieldValue, -1); break; case "departmentid": result.DepartmentId = ParseInt(attr.FieldValue, -1); break; case "programmeid": result.ProgrammeId = ParseInt(attr.FieldValue, -1); break; case "instanceid": result.InstanceId = ParseInt(attr.FieldValue, -1); break; case "trainerid": result.TrainerId = ParseInt(attr.FieldValue, -1); break; case "employeeid": result.EmployeeId = ParseInt(attr.FieldValue, -1); break; case "vendorid": result.VendorId = ParseInt(attr.FieldValue, -1); break; case "venueid": result.VenueId = ParseInt(attr.FieldValue, -1); break; case "mandatoryonly": result.MandatoryOnly = ParseInt(attr.FieldValue, 0); break; case "rollingwindowdays": result.RollingWindowDays = ParseInt(attr.FieldValue, 0); break; } } } return result; } private static DateTime? ParseDate(object fieldValue) { var raw = RawString(fieldValue); if (string.IsNullOrWhiteSpace(raw)) return null; if (long.TryParse(raw, out var epoch)) return DateTimeOffset.FromUnixTimeMilliseconds(epoch).UtcDateTime; return DateTime.TryParse(raw, null, DateTimeStyles.None, out var dt) ? dt : null; } private static int ParseInt(object fieldValue, int fallback) { var raw = RawString(fieldValue); return int.TryParse(raw, out var v) ? v : fallback; } private static string RawString(object fieldValue) { return fieldValue is JsonElement je ? (je.ValueKind == JsonValueKind.Number ? je.GetRawText() : je.GetString() ?? string.Empty) : fieldValue?.ToString() ?? string.Empty; } } }