using System; using System.Collections.ObjectModel; namespace Model { public partial class RunePage { public string Name { get => name; private init { if(string.IsNullOrWhiteSpace(value)) { throw new ArgumentException("a Rune Page must have a name"); } name = value; } } private readonly string name = null!; public ReadOnlyDictionary Runes { get; private set; } private Dictionary runes = new Dictionary(); public RunePage(string name) { Name = name; Runes = new ReadOnlyDictionary(runes); } public Rune? this[Category category] { get { if(runes.TryGetValue(category, out Rune? rune)) { return rune; } return null; } set { if(value == null) { runes.Remove(category); } runes[category] = value!; CheckRunes(category); } } private void CheckRunes(Category newRuneCategory) { switch(newRuneCategory) { case Category.Major: UpdateMajorFamily(Category.Minor1, true); UpdateMajorFamily(Category.Minor2, true); UpdateMajorFamily(Category.Minor3, true); UpdateMajorFamily(Category.OtherMinor1, false); UpdateMajorFamily(Category.OtherMinor2, false); break; case Category.Minor1: case Category.Minor2: case Category.Minor3: UpdateMajorFamily(newRuneCategory, true); break; case Category.OtherMinor1: case Category.OtherMinor2: UpdateMajorFamily(newRuneCategory, false); break; } } private bool? CheckFamilies(Category cat1, Category cat2) { runes.TryGetValue(cat1, out Rune? rune1); runes.TryGetValue(cat2, out Rune? rune2); if(rune1 == null || rune2 == null) { return null; } return rune1.Family == rune2.Family; } private void UpdateMajorFamily(Category minor, bool expectedValue) { if(CheckFamilies(Category.Major, minor).GetValueOrDefault(expectedValue) == expectedValue) { runes.Remove(minor); } } } }