using System.Xml.Linq; using Serilog; using CRIF.ACTion.Common; using CRIF.ACTion.Common.Parsers; namespace CRIF.ACTion.Configuration { public class CustomFieldRequestResponseParser : IResponseParser { private const string _customFieldsPath = "/actionAPI/getCustomFields/msg:maintExportResponse/msg:maintenanceEntities/maint:maintenanceEntity/maint:fields/common:customLookupField"; public CustomFieldRequestResponseParser() { } public CustomFieldConfigs Parse(XElement xElement) { CustomFieldConfigs customFieldConfig = new(); try { var namespaceManager = CrifNamespaces.GetNamespaceManager(xElement); IEnumerable customFieldNodeList = xElement.XElementXPathSelectElements(_customFieldsPath, namespaceManager); List RenovationMatchCriteria = ["IS THE PROPERTY CURRENTLY BEING REMODELED OR IMPROVED?"]; List SaleMatchCriteria = ["IS THE PROPERTY CURRENTLY LISTED FOR SALE?"]; List JointMatchCriteria = ["INTENT FOR JOINT CREDIT"]; customFieldConfig.CustomPropertyRenovationFieldData = ParseCustomPropertyStatusData(customFieldNodeList, RenovationMatchCriteria); customFieldConfig.CustomPropertySaleFieldData = ParseCustomPropertyStatusData(customFieldNodeList, SaleMatchCriteria); customFieldConfig.CustomJointCreditFieldData = ParseCustomJointCreditData(customFieldNodeList, JointMatchCriteria); } catch (Exception ex) { Log.Error("Error trying to parse CRIF Custom Field Configuration Response", ex.Message, ex.StackTrace); } return customFieldConfig; } private List ParseCustomJointCreditData(IEnumerable customFieldNodeList, List MatchCriteria) { List customDataSet = []; foreach (XElement node in customFieldNodeList) { try { string nodeAttributeValue = node.Attribute(CrifNamespaces.Common + "name").Value; if (CustomFieldIsActive(nodeAttributeValue, MatchCriteria)) { string individuallyId = ""; string jointlyId = ""; string productCategoryId = ""; IEnumerable childNodes = node.Descendants().Elements(); foreach (XElement option in childNodes) { if (option.Name.LocalName.Equals("FIELDSELECTION", StringComparison.CurrentCultureIgnoreCase)) { var attributes = option.Attributes(); foreach (var attribute in attributes) { string idValue = ""; string nameValue = ""; if (attribute.Name.LocalName.Equals("FIELDSELECTIONID", StringComparison.CurrentCultureIgnoreCase)) { idValue = attribute.Value; nameValue = attribute.NextAttribute.Value.ToUpper(); switch (nameValue) { case "INDIVIDUALLY": individuallyId = idValue; break; case "JOINTLY": jointlyId = idValue; break; default: break; } } } } else if (option.Name.LocalName.ToUpper() == "PRODUCTCATEGORY") { productCategoryId = option.LastAttribute.Value; } } CustomJointCreditData data = new() { CustomFieldId = node.Attribute(CrifNamespaces.Common + "ID").Value, ProductCategoryId = productCategoryId, SortOrder = node.Attribute(CrifNamespaces.Common + "sortOrder").Value, JointlyId = jointlyId, IndividuallyId = individuallyId }; customDataSet.Add(data); } } catch (Exception ex) { Log.Error("Error trying to parse CRIF Custom Field Configuration Response", ex.Message, ex.StackTrace); } } return customDataSet; } private List ParseCustomPropertyStatusData(IEnumerable customFieldNodeList, List MatchCriteria) { List customDataSet = []; foreach (XElement node in customFieldNodeList) { try { string nodeAttributeValue = node.Attribute(CrifNamespaces.Common + "name").Value; if (CustomFieldIsActive(nodeAttributeValue, MatchCriteria)) { string yesId = ""; string noId = ""; string naId = ""; string productCategoryId = ""; IEnumerable childNodes = node.Descendants().Elements(); foreach (XElement option in childNodes) { if (option.Name.LocalName.Equals("FIELDSELECTION", StringComparison.CurrentCultureIgnoreCase)) { var attributes = option.Attributes(); foreach (var attribute in attributes) { string idValue = ""; string nameValue = ""; if (attribute.Name.LocalName.ToUpper() == "FIELDSELECTIONID") { idValue = attribute.Value; nameValue = attribute.NextAttribute.Value.ToUpper(); switch (nameValue) { case "YES": yesId = idValue; break; case "NO": noId = idValue; break; case "N/A (FLEX FIXED DRAWS ONLY)": naId = idValue; break; default: break; } } } } else if (option.Name.LocalName.ToUpper() == "PRODUCTCATEGORY") { productCategoryId = option.LastAttribute.Value; } } CustomPropertyStatusData data = new CustomPropertyStatusData { CustomFieldId = node.Attribute(CrifNamespaces.Common + "ID").Value, ProductCategoryId = productCategoryId, SortOrder = node.Attribute(CrifNamespaces.Common + "sortOrder").Value, NoId = noId, YesId = yesId, NaId = naId }; customDataSet.Add(data); } } catch (Exception ex) { Log.Error("Error trying to parse CRIF Custom Field Configuration Response", ex.Message, ex.StackTrace); } } return customDataSet; } private bool CustomFieldIsActive(string NodeAttributeValue, List ActiveMatchCriteria) { bool isActive = false; foreach (string compare in ActiveMatchCriteria) { string standardizedNodeString = StandardizedStringValue(NodeAttributeValue); string standardizedCompareString = StandardizedStringValue(compare); bool validCompareInput = !string.IsNullOrWhiteSpace(standardizedNodeString) && !string.IsNullOrWhiteSpace(compare); if (validCompareInput && !isActive) { isActive = ( standardizedNodeString.Equals(standardizedCompareString) ); } } return isActive; } private string StandardizedStringValue(string InputString) { string standardizedString = ""; if (!string.IsNullOrWhiteSpace(InputString)) { standardizedString = InputString.Trim().ToUpper(); } return standardizedString; } } }