using System.Text.Json.Serialization;
namespace ClawdDotNet.Core.Config;
///
/// Pro-Instanz-Teil der Watchdog-Anbindung ans Deploymentcenter.
///
/// Ein Monitor je Instanz. Der Monitor wird serverseitig über das Paar
/// source + instance geführt. Alle Instanzen melden unter derselben
/// und tragen ihre eigene — 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.
///
/// 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 (/api/tokens/v1/provision) und legt es hier verschlüsselt ab —
/// danach liegt auf der Instanz nicht mehr das Master-Token.
///
/// Ein/Aus läuft über den eingebauten Dienst InstanceWatchdog.
///
public sealed class WatchdogConfig
{
/// Dienst-Kennung im Deploymentcenter. Alle Instanzen teilen sich dieselbe Source.
[JsonPropertyName("source")]
public string Source { get; set; } = "clawddotnet";
///
/// Name dieser Instanz im Monitor. Leer bedeutet: die InstanceId 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.
///
[JsonPropertyName("instance")]
public string Instance { get; set; } = "";
/// Gruppierung im Dashboard (reine Anzeige, keine Hierarchie).
[JsonPropertyName("group")]
public string Group { get; set; } = "ClawdDotNet";
///
/// Sende-Takt in Sekunden. Daraus leitet der Evaluator die Schwellen ab:
/// nach dem Doppelten warning, nach dem Vierfachen down.
///
[JsonPropertyName("intervalSeconds")]
public int IntervalSeconds { get; set; } = 60;
///
/// Das für diese Instanz ausgestellte Sub-Token. Wird automatisch gesetzt und
/// verschlüsselt gespeichert.
///
[JsonPropertyName("agentToken")]
public string AgentToken { get; set; } = "";
/// True, sobald ein eigenes Token vorliegt.
[JsonIgnore]
public bool HasToken => !string.IsNullOrWhiteSpace(AgentToken);
/// Der Wert, der als instance gemeldet wird.
public string ResolveInstance(string instanceId) =>
string.IsNullOrWhiteSpace(Instance) ? instanceId : Instance.Trim();
}