using System;
using System.Collections.Generic;
using System.Linq;
namespace PolyTrader.Core.Modularity
{
///
/// Alle Module, die diese Installation kennt – geladen oder nicht (#560).
///
/// Die Liste stand bis dahin viermal im Code: beim Start (Program), im Modul-Tab des Desktops
/// (CoreViews), bei den nicht verfügbaren Ansichten (ModuleViews) und hartkodiert im WebUI. Ein neues
/// Modul musste an allen vier Stellen nachgetragen werden. Fehlte es an einer, ließ es sich dort weder
/// sehen noch wieder aktivieren. Der Start registriert jetzt diese eine Liste; wer sie braucht, fragt
/// sie ab.
///
public sealed class KnownModules
{
public KnownModules(IEnumerable modules)
{
All = (modules ?? throw new ArgumentNullException(nameof(modules))).ToList();
}
public IReadOnlyList All { get; }
public IPolyTraderModule? Find(string name) =>
All.FirstOrDefault(m => string.Equals(m.Name, name, StringComparison.OrdinalIgnoreCase));
}
///
/// Was ein Modul-Schalter zeigt und darf. Die Regeln stammen aus dem Modul-Tab des Desktops und liegen
/// jetzt hier, damit Desktop und WebUI dasselbe anzeigen (#560).
///
public sealed record ModuleActivationView(
string Name,
bool IsRunning,
bool DesiredEnabled,
string? Blocker,
string Status,
string Hint,
string Action,
bool CanToggle)
{
public const string RestartHint = "Änderung greift nach Neustart";
public static ModuleActivationView Describe(ModuleActivationInfo info, bool desiredEnabled)
{
if (!string.IsNullOrEmpty(info.Blocker))
return new(info.Name, info.IsRunning, desiredEnabled, info.Blocker,
"⚠ Nicht aktivierbar", info.Blocker!, "—", false);
if (info.IsRunning && desiredEnabled)
return new(info.Name, true, true, null, "Aktiv", "", "Deaktivieren", true);
if (info.IsRunning)
return new(info.Name, true, false, null, "Aktiv – stoppt nach Neustart", RestartHint, "Aktivieren", true);
if (desiredEnabled)
return new(info.Name, false, true, null, "Startet nach Neustart", RestartHint, "Deaktivieren", true);
return new(info.Name, false, false, null, "Deaktiviert", "", "Aktivieren", true);
}
}
}