using XFEEDToolBox.Core.Engineering; namespace XFEEDToolBox.Core.Planning; /// Tracks materials that needed collecting, so later restocking can mark them complete. public sealed class MaterialChecklist { private readonly HashSet included = new(StringComparer.OrdinalIgnoreCase); public IReadOnlyList Keys => included.Order(StringComparer.OrdinalIgnoreCase).ToArray(); public void Clear() => included.Clear(); public void Restore(IEnumerable keys) { included.Clear(); foreach (var key in keys.Where(key => !string.IsNullOrWhiteSpace(key))) included.Add(key.Trim()); } public IReadOnlyList Update(IReadOnlyList aggregatedNeeds) { var needed = aggregatedNeeds.Where(material => material.Required > 0).ToArray(); included.IntersectWith(needed.Select(material => material.Key)); foreach (var material in needed.Where(material => material.Missing > 0)) included.Add(material.Key); return needed.Where(material => included.Contains(material.Key)).OrderBy(material => material.Missing == 0).ThenByDescending(material => material.Missing).ToArray(); } }