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();
}
}