namespace LaaProductionWeb.Blazor.Components.HeliumTester.Models { using LaaPackages.Data.HeliumTester; using System; using System.Collections.Generic; using System.Linq; public class MatchCollectionModel { protected readonly List> regions = []; protected readonly List> meterSizes = []; protected readonly List> bodyLengths = []; protected readonly List> pressureSensors = []; public IReadOnlyCollection> Regions => this.regions; public IReadOnlyCollection> MeterSizes => this.meterSizes; public IReadOnlyCollection> BodyLengths => this.bodyLengths; public IReadOnlyCollection> PressureSensors => this.pressureSensors; public event Action MatchesChanged; public string RegionValue(string region) { var x = this.regions.FirstOrDefault(x => x.Key == region); return x?.Value ?? region; } public string MeterSizeValue(string meterSize) { var x = this.meterSizes.FirstOrDefault(x => x.Key == meterSize); return x?.Value ?? meterSize; } public string BodyLengthValue(string bodyLength) { var x = this.bodyLengths.FirstOrDefault(x => x.Key == bodyLength); return x?.Value.ToString() ?? bodyLength; } public string PressureSensorValue(string presureSensor) { var x = this.pressureSensors.FirstOrDefault(x => x.Key == presureSensor); return x?.Value.ToString() ?? presureSensor; } public void LoadVariants(IEnumerable variants) { var regions = variants .Select(x => new ReciepMatchItemModel(x.RegionCode, x.Region)) .OrderBy(x => x.Key) .ToHashSet(); this.UnbindSelectionChanged(this.regions); this.regions.Clear(); this.regions.AddRange(regions); var meterSizes = variants .Select(x => new ReciepMatchItemModel(x.MeterSizeCode, x.MeterSize)) .OrderBy(x => x.Key[1]) .ThenBy(x => x.Key[0]) .ToHashSet(); this.UnbindSelectionChanged(this.meterSizes); this.meterSizes.Clear(); this.meterSizes.AddRange(meterSizes); var bodyLengths = variants .Select(x => new ReciepMatchItemModel(x.BodyLengthCode, x.BodyLength)) .OrderBy(x => x.Key) .ToHashSet(); this.UnbindSelectionChanged(this.bodyLengths); this.bodyLengths.Clear(); this.bodyLengths.AddRange(bodyLengths); var pressureSensors = variants .Select(x => new ReciepMatchItemModel(x.PressureSensorCode, x.HasPressureSensor)) .OrderBy(x => x.Key) .ToHashSet(); this.UnbindSelectionChanged(this.pressureSensors); this.pressureSensors.Clear(); this.pressureSensors.AddRange(pressureSensors); } public void BindSelectionChanged() { this.BindSelectionChanged(this.regions); this.BindSelectionChanged(this.meterSizes); this.BindSelectionChanged(this.bodyLengths); this.BindSelectionChanged(this.pressureSensors); } private void BindSelectionChanged(IEnumerable items) { foreach (var item in items) { item.SelectionChanged += this.MatchSelectionChanged; } } private void UnbindSelectionChanged(IEnumerable items) { foreach (var item in items) { item.SelectionChanged -= this.MatchSelectionChanged; } } public void MatchSelectionChanged() => this.MatchesChanged?.Invoke(); public void UpdateRegionsSelection(List> regions) { foreach (var region in this.regions) { foreach (var match in regions) { if (region.Key == match.Key) { region.Selected = match.Selected; } } } } public void UpdateMeterSizesSelection(List> meterSizes) { foreach (var meterSize in this.meterSizes) { foreach (var match in meterSizes) { if (meterSize.Key == match.Key) { meterSize.Selected = match.Selected; } } } } public void UpdateBodyLengthsSelection(List> bodyLengths) { foreach (var bodyLength in this.bodyLengths) { foreach (var match in bodyLengths) { if (bodyLength.Key == match.Key) { bodyLength.Selected = match.Selected; } } } } public void UpdatePressureSensorsSelection(List> pressureSensors) { foreach (var pressureSensor in this.pressureSensors) { foreach (var match in pressureSensors) { if (pressureSensor.Key == match.Key) { pressureSensor.Selected = match.Selected; } } } } internal void BindMatchChanged(Action onMatchesChanged) { this.MatchesChanged -= onMatchesChanged; this.MatchesChanged += onMatchesChanged; } } }