using System.Text.Json; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using MMDAL.DTO.MMHead; using MMDAL.Query.MMHead; using Newtonsoft.Json; using static GB5Shared.GB5Constant.Constant; namespace MMDAL.CustomCode.MMHead { public class MMHeadDimensionDAL : IMMHeadDimensionDAL { private readonly IQueryExecutor _QueryExecutor; public MMHeadDimensionDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } public async Task GetDimensionPicklist(int Type, int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { try { if (LoginDTO.DatabaseType != DBType.SQL) throw new Exception("Unsupported database type"); var attrs = CriteriaDTO?.SectionCriteriaList? .SelectMany(s => s.AttributesCriteriaList ?? []) .ToList() ?? []; int d1 = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "D1")?.FieldValue, -1); int d2 = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "D2")?.FieldValue, -1); int d3 = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "D3")?.FieldValue, -1); int d4 = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "D4")?.FieldValue, -1); string? Name(string field) => attrs.FirstOrDefault(a => a.FieldName == field)?.FieldValue?.ToString() is string s && !string.IsNullOrWhiteSpace(s) ? s : null; int firstNumber = FirstNumber < 0 ? 0 : FirstNumber; int maxResult = MaxResult <= 0 ? 50 : MaxResult; object result = Type switch { 1 => await _QueryExecutor.QueryAsync(LoginDTO, MMHeadDimensionQB.GET_DIMENSION_PICKLIST_L1, new { l1name = Name("L1Name"), firstnumber = firstNumber, maxresult = maxResult }), 2 => await _QueryExecutor.QueryAsync(LoginDTO, MMHeadDimensionQB.GET_DIMENSION_PICKLIST_L2, new { d1, l2name = Name("L2Name"), firstnumber = firstNumber, maxresult = maxResult }), 3 => await _QueryExecutor.QueryAsync(LoginDTO, MMHeadDimensionQB.GET_DIMENSION_PICKLIST_L3, new { d1, d2, l3name = Name("L3Name"), firstnumber = firstNumber, maxresult = maxResult }), 4 => await _QueryExecutor.QueryAsync(LoginDTO, MMHeadDimensionQB.GET_DIMENSION_PICKLIST_L4, new { d1, d2, d3, l4name = Name("L4Name"), firstnumber = firstNumber, maxresult = maxResult }), 5 => await _QueryExecutor.QueryAsync(LoginDTO, MMHeadDimensionQB.GET_DIMENSION_PICKLIST_L5, new { d1, d2, d3, d4, l5name = Name("L5Name"), firstnumber = firstNumber, maxresult = maxResult }), _ => throw new ArgumentException("Type is not supported. Supported values are 1 to 5.", nameof(Type)) }; return JsonConvert.SerializeObject(result); } catch (Exception) { throw; } } private static int ParseInt(object? value, int defaultValue) => value switch { null => defaultValue, JsonElement je => je.ValueKind == JsonValueKind.Number ? je.GetInt32() : int.Parse(je.GetString()!), IConvertible ic => Convert.ToInt32(ic), _ => int.Parse(value.ToString()!) }; } }