using System.Collections.ObjectModel;
using System.ServiceProcess;
using System.Windows.Input;
using SpdUp.Core;
using SpdUp.Models;
using SpdUp.Services;
namespace SpdUp.ViewModels;
///
/// Service Manager ViewModel.
///
public sealed class ServiceManagerViewModel : ObservableObject
{
private readonly AppSettings _settings;
public ObservableCollection Services { get; } = new();
private ServiceEntry? _selectedService;
public ServiceEntry? SelectedService
{
get => _selectedService;
set => SetProperty(ref _selectedService, value);
}
public ICommand RefreshCommand { get; }
public ICommand StopServiceCommand { get; }
public ICommand StartServiceCommand { get; }
public ServiceManagerViewModel(AppSettings settings)
{
_settings = settings;
RefreshCommand = new RelayCommand(Refresh);
StopServiceCommand = new RelayCommand(StopSelected, () => SelectedService is not null);
StartServiceCommand = new RelayCommand(StartSelected, () => SelectedService is not null);
Refresh();
}
private void Refresh()
{
Services.Clear();
// Show the configured services plus all known non-critical ones
var names = new HashSet(_settings.ServicesToStop, StringComparer.OrdinalIgnoreCase);
foreach (var k in ServiceManagementService.KnownNonCriticalServices.Keys)
names.Add(k);
foreach (var entry in ServiceManagementService.GetServiceList(names))
Services.Add(entry);
}
private void StopSelected()
{
if (SelectedService is null) return;
ServiceManagementService.StopService(SelectedService.ServiceName);
Refresh();
}
private void StartSelected()
{
if (SelectedService is null) return;
ServiceManagementService.StartService(SelectedService.ServiceName);
Refresh();
}
}