using System; using System.Globalization; using System.Text.Json; using GB5Shared.DTO.Framework.Criteria; using RecruitmentDAL.DTO.Reports; namespace RecruitmentBLL.Reports { // Shared CriteriaDTO -> RecruitmentReportCriteria parsing for every Recruitment Reports-family // endpoint — mirrors TMSBLL.Reports.TmsReportCriteriaParser's shape/conventions exactly so the // wire format (SectionCriteriaList -> AttributesCriteriaList -> FieldName/FieldValue) behaves // identically across modules. public static class RecruitmentReportCriteriaParser { public static RecruitmentReportCriteria Parse(CriteriaDTO criteriaDTO) { var result = new RecruitmentReportCriteria(); 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 "assignedrecruiterid": result.AssignedRecruiterId = ParseInt(attr.FieldValue, -1); 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; } } }