using System.ComponentModel;
using ClawdDotNet.Core.Config;

namespace ClawdDotNet.Models;

/// <summary>
/// PropertyGrid-freundlicher Wrapper um InstanceConfig.
/// Änderungen werden direkt im zugrunde liegenden InstanceConfig-Objekt gespeichert.
/// </summary>
[TypeConverter(typeof(ExpandableObjectConverter))]
public sealed class InstanceSettingsViewModel
{
    private readonly InstanceConfig _config;

    public InstanceSettingsViewModel(InstanceConfig config)
    {
        _config = config;
    }

    [Category("Instanz")]
    [DisplayName("Instanz-ID")]
    [Description("Eindeutige ID dieser laufenden Instanz.")]
    public string InstanceId
    {
        get => _config.InstanceId;
        set => _config.InstanceId = value;
    }

    [Category("Instanz")]
    [DisplayName("Instanzname")]
    [Description("Anzeigename dieser Instanz (z.B. 'Aktien-Team').")]
    public string InstanceName
    {
        get => _config.InstanceName;
        set => _config.InstanceName = value;
    }

    [Category("API")]
    [DisplayName("OpenRouter API-Key")]
    [Description("API-Schlüssel für OpenRouter. Wird für alle Agenten dieser Instanz verwendet.")]
    [PasswordPropertyText(true)]
    public string OpenRouterApiKey
    {
        get => _config.OpenRouterApiKey;
        set => _config.OpenRouterApiKey = value;
    }

    [Category("Verzeichnisse")]
    [DisplayName("Arbeitsverzeichnis")]
    [Description("Basis-Arbeitsverzeichnis für diese Instanz.")]
    public string WorkingDirectory
    {
        get => _config.WorkingDirectory;
        set => _config.WorkingDirectory = value;
    }

    [Category("Verzeichnisse")]
    [DisplayName("Log-Verzeichnis")]
    [Description("Verzeichnis für Log-Dateien dieser Instanz.")]
    public string LogDirectory
    {
        get => _config.LogDirectory;
        set => _config.LogDirectory = value;
    }

    [Category("Netzwerk")]
    [DisplayName("Webserver-Port")]
    [Description("Port für den integrierten Webserver (0 = deaktiviert).")]
    public int WebServerPort
    {
        get => _config.WebServerPort;
        set => _config.WebServerPort = value;
    }

    [Category("Agenten")]
    [DisplayName("Anzahl Agenten")]
    [Description("Anzahl der konfigurierten Agenten in dieser Instanz.")]
    [ReadOnly(true)]
    public int AgentCount => _config.Agents.Count;

    // ─── WatchDog (Instanz-Heartbeat) ───
    // Server-URL und Master-Token stehen app-weit in den Anwendungseinstellungen. Die
    // Instanz registriert sich damit selbst; hier stehen nur Source/Gruppe/Intervall.
    // Ein/Aus läuft über den Service „Instanz-Watchdog" im Worker-Tab. Änderungen greifen
    // beim nächsten Start der Instanz.

    [Category("WatchDog")]
    [DisplayName("Source")]
    [Description("Dienst-Kennung im WatchDog. Alle Instanzen teilen sich dieselbe Source.")]
    public string WatchdogSource
    {
        get => _config.Watchdog.Source;
        set => _config.Watchdog.Source = value;
    }

    [Category("WatchDog")]
    [DisplayName("Gruppe")]
    [Description("Gruppierung im WatchDog-Dashboard.")]
    public string WatchdogGroup
    {
        get => _config.Watchdog.Group;
        set => _config.Watchdog.Group = value;
    }

    [Category("WatchDog")]
    [DisplayName("Intervall (Sek)")]
    [Description("Sende-Takt der Heartbeats in Sekunden (mindestens 5).")]
    public int WatchdogIntervalSeconds
    {
        get => _config.Watchdog.IntervalSeconds;
        set => _config.Watchdog.IntervalSeconds = value;
    }

    [Category("WatchDog")]
    [DisplayName("Token registriert")]
    [Description("Ob diese Instanz bereits einen eigenen Agent-Token vom WatchDog erhalten hat.")]
    [ReadOnly(true)]
    public bool WatchdogTokenRegistered => _config.Watchdog.HasToken;

    [Browsable(false)]
    public InstanceConfig UnderlyingConfig => _config;

    public override string ToString() => _config.InstanceName;
}
