private static CoreStandards ApplyPatchToCoreStandards(StandardIdentifier identifier,
                                                               CoreStandards coreStandards,
                                                               CoreStandardsXml standardsXml,
                                                               ItemPatch patch)
        {
            string claimNumber = Regex.Match(input: patch.Claim, pattern: @"\d+").Value;

            if (identifier == null)
            {
                identifier = StandardIdentifier.Create(claim: claimNumber, target: patch.Target);
            }
            else
            {
                string target = (!string.IsNullOrEmpty(patch.Target)) ? patch.Target : identifier.Target;
                claimNumber = (!string.IsNullOrEmpty(claimNumber)) ? claimNumber : identifier.Claim;
                identifier  = identifier.WithClaimAndTarget(claimNumber, target);
            }

            string targetDesc = (!string.IsNullOrEmpty(patch.TargetDescription)) ? patch.TargetDescription : coreStandards?.TargetDescription;
            string ccssDesc   = (!string.IsNullOrEmpty(patch.CCSSDescription)) ? patch.CCSSDescription : coreStandards?.CommonCoreStandardsDescription;

            coreStandards = StandardIdentifierTranslation.CoreStandardFromIdentifier(standardsXml, identifier);
            coreStandards = coreStandards.WithTargetCCSSDescriptions(targetDesc, ccssDesc);

            return(coreStandards);
        }
        /// <summary>
        /// Translates metadata, itemcontents and lookups to item digest
        /// </summary>
        public static SampleItem ToSampleItem(
            ItemDigest itemDigest,
            CoreStandardsXml standardsXml,
            IList <Subject> subjects,
            IList <InteractionType> interactionTypes,
            IList <MergedAccessibilityFamily> resourceFamilies,
            IList <ItemPatch> patches,
            IList <BrailleFileInfo> brailleFileInfo,
            AppSettings settings)
        {
            var supportedPubs       = settings.SettingsConfig.SupportedPublications;
            var rubrics             = GetRubrics(itemDigest, settings);
            var brailleItemCodes    = GetBrailleItemCodes(itemDigest.ItemKey, brailleFileInfo);
            var braillePassageCodes = GetBraillePassageCodes(itemDigest, brailleFileInfo);
            var interactionType     = interactionTypes.FirstOrDefault(t => t.Code == itemDigest.InteractionTypeCode);
            var grade            = GradeLevelsUtils.FromString(itemDigest.GradeCode);
            var patch            = patches.FirstOrDefault(p => p.ItemId == itemDigest.ItemKey);
            var copiedItemPatch  = patches.FirstOrDefault(p => p.BrailleCopiedId == itemDigest.ItemKey.ToString());
            var subject          = subjects.FirstOrDefault(s => s.Code == itemDigest.SubjectCode);
            var depthOfKnowledge = itemDigest.DepthOfKnowledge;
            var itemType         = itemDigest.ItemType;

            var fieldTestUseAttribute = itemDigest.ItemMetadataAttributes?.FirstOrDefault(a => a.Code == "itm_FTUse");
            var fieldTestUse          = FieldTestUse.Create(fieldTestUseAttribute, itemDigest.SubjectCode);

            StandardIdentifier identifier    = StandardIdentifierTranslation.ToStandardIdentifier(itemDigest, supportedPubs);
            CoreStandards      coreStandards = StandardIdentifierTranslation.CoreStandardFromIdentifier(standardsXml, identifier);
            int?copiedFromItem = null;

            if (patch != null)
            {
                int tmp;
                copiedFromItem   = int.TryParse(patch.BrailleCopiedId, out tmp) ? (int?)tmp : null;
                depthOfKnowledge = !string.IsNullOrEmpty(patch.DepthOfKnowledge) ? patch.DepthOfKnowledge : depthOfKnowledge;
                itemType         = !string.IsNullOrEmpty(patch.ItemType) ? patch.ItemType : itemType;
                coreStandards    = ApplyPatchToCoreStandards(identifier, coreStandards, standardsXml, patch);
            }

            if (copiedItemPatch != null)
            {
                var copyBrailleItemCodes = GetBrailleItemCodes(copiedItemPatch.ItemId, brailleFileInfo);
                brailleItemCodes = brailleItemCodes.Concat(copyBrailleItemCodes).Distinct().ToImmutableArray();
            }

            if (patch != null && !string.IsNullOrEmpty(patch.QuestionNumber))
            {
                fieldTestUse = ApplyPatchFieldTestUse(fieldTestUse, patch);
            }

            var  claim         = subject?.Claims.FirstOrDefault(t => t.ClaimNumber == coreStandards.ClaimId);
            bool brailleOnly   = copiedFromItem.HasValue;
            bool isPerformance = fieldTestUse != null && itemDigest.AssociatedPassage.HasValue;

            if (itemDigest.AssociatedPassage.HasValue)
            {
                braillePassageCodes = brailleFileInfo
                                      .Where(f => f.ItemKey == itemDigest.AssociatedPassage.Value)
                                      .Select(b => b.BrailleType).ToImmutableArray();
            }
            else
            {
                braillePassageCodes = ImmutableArray.Create <string>();
            }

            bool aslSupported = AslSupported(itemDigest);

            var groups = GetAccessibilityResourceGroups(itemDigest, resourceFamilies, grade,
                                                        isPerformance, aslSupported, claim, interactionType, brailleItemCodes, settings);

            string interactionTypeSubCat = "";

            settings.SettingsConfig.InteractionTypesToItem.TryGetValue(itemDigest.ToString(), out interactionTypeSubCat);

            SampleItem sampleItem = new SampleItem(
                itemType: itemType,
                itemKey: itemDigest.ItemKey,
                bankKey: itemDigest.BankKey,
                targetAssessmentType: itemDigest.TargetAssessmentType,
                depthOfKnowledge: depthOfKnowledge,
                sufficentEvidenceOfClaim: itemDigest.SufficentEvidenceOfClaim,
                associatedStimulus: itemDigest.AssociatedStimulus,
                aslSupported: aslSupported,
                allowCalculator: itemDigest.AllowCalculator,
                isPerformanceItem: isPerformance,
                accessibilityResourceGroups: groups,
                rubrics: rubrics,
                interactionType: interactionType,
                subject: subject,
                claim: claim,
                grade: grade,
                coreStandards: coreStandards,
                fieldTestUse: fieldTestUse,
                interactionTypeSubCat: interactionTypeSubCat,
                brailleItemCodes: brailleItemCodes,
                braillePassageCodes: braillePassageCodes,
                brailleOnlyItem: brailleOnly,
                copiedFromitem: copiedFromItem);

            return(sampleItem);
        }