using OTSSignsOrchestrator.Server.Data.Entities;

namespace OTSSignsOrchestrator.Server.Health;

/// <summary>
/// Result of a single health check execution.
/// </summary>
public record HealthCheckResult(HealthStatus Status, string Message, string? Detail = null);

/// <summary>
/// Contract for an individual health check that runs against a specific <see cref="Instance"/>.
/// </summary>
public interface IHealthCheck
{
    /// <summary>Human-readable name written to <see cref="HealthEvent.CheckName"/>.</summary>
    string CheckName { get; }

    /// <summary>
    /// When true the engine will automatically call <see cref="RemediateAsync"/>
    /// if the check returns <see cref="HealthStatus.Critical"/>.
    /// </summary>
    bool AutoRemediate { get; }

    /// <summary>Execute the check for <paramref name="instance"/>.</summary>
    Task<HealthCheckResult> RunAsync(Instance instance, CancellationToken ct);

    /// <summary>
    /// Attempt automatic remediation. Return true if the issue was fixed.
    /// The default implementation does nothing and returns false.
    /// </summary>
    Task<bool> RemediateAsync(Instance instance, CancellationToken ct) => Task.FromResult(false);
}
