sharee.bike-App/TINKLib/ViewModel/Settings/ServicesViewModel.cs
2022-10-17 18:45:38 +02:00

81 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using Serilog;
namespace TINK.ViewModel.Settings
{
/// <summary> ViewModel for an active service plus a list of services which are not active.</summary>
/// <remarks>
/// Example for services are lock services, geolocation services, ...,
/// </remarks>
public class ServicesViewModel : INotifyPropertyChanged
{
/// <summary> Active service. </summary>
private string active;
/// <summary> Holds the dictionary which maps services to service display texts.</summary>
private IDictionary<string, string> ServiceToText { get; }
/// <summary> Holds the dictionary which maps service display texts to services.</summary>
private IDictionary<string, string> TextToService { get; }
/// <summary>Constructs view model ensuring consistency. </summary>
/// <param name="services">List of available services.</param>
/// <param name="serviceToText"> Dictionary holding display text for services as values.</param>
/// <param name="active">Active service.</param>
public ServicesViewModel(
IEnumerable<string> services,
IDictionary<string, string> serviceToText,
string active)
{
if (!services.Contains(active))
throw new ArgumentException($"Can not instantiate {typeof(ServicesViewModel).Name}- object. Active lock service {active} must be contained in [{String.Join(",", services)}].");
ServiceToText = services.Distinct().ToDictionary(
x => x,
x => serviceToText.ContainsKey(x) ? serviceToText[x] : x);
TextToService = ServiceToText.ToDictionary(x => x.Value, x => x.Key);
Active = active;
}
/// <summary> Fired whenever active service changes.</summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary> Holds active service.</summary>
public string Active
{
get => active;
set
{
if (active == value)
return;
active = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Active)));
}
}
/// <summary> List of display texts of services.</summary>
public IList<string> ServicesTextList => ServiceToText.Select(x => x.Value).OrderBy(x => x).ToList();
/// <summary> Active locks service.</summary>
public string ActiveText
{
get => ServiceToText[Active];
set
{
if (!TextToService.ContainsKey(value))
{
Log.ForContext<ServicesViewModel>().Error($"Can not set service {value} to services view model. List of services {{{string.Join(";", TextToService)}}} does not hold machting element.");
throw new ArgumentException($"Can not set service {value} to services view model. List of services {{{string.Join(";", TextToService)}}} does not hold machting element.");
}
Active = TextToService[value];
}
}
}
}