using System.Text.Json.Serialization;

namespace ClawdDotNet.Core.Config;

/// <summary>
/// Pro-Instanz-Teil der Watchdog-Anbindung ans Deploymentcenter.
///
/// <para><b>Ein Monitor je Instanz.</b> Der Monitor wird serverseitig über das Paar
/// <c>source</c> + <c>instance</c> geführt. Alle Instanzen melden unter derselben
/// <see cref="Source"/> und tragen ihre eigene <see cref="Instance"/> — damit hat jede
/// laufende Instanz einen eigenen Zustand, ein eigenes Intervall und einen eigenen
/// Metrik-Verlauf. Fällt eine von dreien aus, fällt genau deren Monitor.</para>
///
/// <para>Server-URL und das anwendungsweite Token liegen in den Anwendungseinstellungen.
/// Beim ersten Start tauscht die Instanz das Token gegen ein eigenes, eingeschränktes
/// Sub-Token (<c>/api/tokens/v1/provision</c>) und legt es hier verschlüsselt ab —
/// danach liegt auf der Instanz nicht mehr das Master-Token.</para>
///
/// <para>Ein/Aus läuft über den eingebauten Dienst <c>InstanceWatchdog</c>.</para>
/// </summary>
public sealed class WatchdogConfig
{
    /// <summary>Dienst-Kennung im Deploymentcenter. Alle Instanzen teilen sich dieselbe Source.</summary>
    [JsonPropertyName("source")]
    public string Source { get; set; } = "clawddotnet";

    /// <summary>
    /// Name dieser Instanz im Monitor. Leer bedeutet: die <c>InstanceId</c> wird
    /// verwendet — stabil, aber im Dashboard nichtssagend. Wer lesbare Namen möchte,
    /// trägt hier einen ein; ein späterer Wechsel legt allerdings einen neuen Monitor an.
    /// </summary>
    [JsonPropertyName("instance")]
    public string Instance { get; set; } = "";

    /// <summary>Gruppierung im Dashboard (reine Anzeige, keine Hierarchie).</summary>
    [JsonPropertyName("group")]
    public string Group { get; set; } = "ClawdDotNet";

    /// <summary>
    /// Sende-Takt in Sekunden. Daraus leitet der Evaluator die Schwellen ab:
    /// nach dem Doppelten <c>warning</c>, nach dem Vierfachen <c>down</c>.
    /// </summary>
    [JsonPropertyName("intervalSeconds")]
    public int IntervalSeconds { get; set; } = 60;

    /// <summary>
    /// Das für diese Instanz ausgestellte Sub-Token. Wird automatisch gesetzt und
    /// verschlüsselt gespeichert.
    /// </summary>
    [JsonPropertyName("agentToken")]
    public string AgentToken { get; set; } = "";

    /// <summary>True, sobald ein eigenes Token vorliegt.</summary>
    [JsonIgnore]
    public bool HasToken => !string.IsNullOrWhiteSpace(AgentToken);

    /// <summary>Der Wert, der als <c>instance</c> gemeldet wird.</summary>
    public string ResolveInstance(string instanceId) =>
        string.IsNullOrWhiteSpace(Instance) ? instanceId : Instance.Trim();
}
