using System.Globalization;
using Microsoft.Extensions.Options;
using SQLInsight.Core.Findings;
using SQLInsight.Core.Instances;
namespace SQLInsight.Web;
///
/// Formatting for the UI: times in the configured time zone, Danish number format, severity names.
///
public sealed class Display(IOptions options)
{
private static readonly CultureInfo Danish = CultureInfo.GetCultureInfo("da-DK");
private readonly TimeZoneInfo _zone = options.Value.TimeZone is { Length: > 0 } id
? TimeZoneInfo.FindSystemTimeZoneById(id)
: TimeZoneInfo.Local;
public string Time(DateTime? utc) => utc is { } value
? TimeZoneInfo.ConvertTimeFromUtc(DateTime.SpecifyKind(value, DateTimeKind.Utc), _zone).ToString("dd-MM-yyyy HH:mm", Danish)
: "–";
public string Ago(DateTime? utc)
{
if (utc is not { } value)
{
return "aldrig";
}
var age = DateTime.UtcNow - value;
return age.TotalMinutes < 2 ? "lige nu"
: age.TotalHours < 2 ? $"{age.TotalMinutes:0} min. siden"
: age.TotalDays < 2 ? $"{age.TotalHours:0} timer siden"
: $"{age.TotalDays:0} dage siden";
}
public static string Number(double value, int decimals = 0) => value.ToString("N" + decimals, Danish);
public static string SeverityName(Severity severity) => severity switch
{
Severity.Critical => "Kritisk",
Severity.High => "Høj",
Severity.Medium => "Middel",
Severity.Low => "Lav",
_ => "Info",
};
public static string SeverityClass(Severity? severity) => severity switch
{
Severity.Critical => "sev-critical",
Severity.High => "sev-high",
Severity.Medium => "sev-medium",
Severity.Low => "sev-low",
Severity.Info => "sev-info",
_ => "sev-ok",
};
public static string Release(string? productVersion, int? engineEdition = null) =>
engineEdition == (int)EngineEdition.AzureSqlManagedInstance ? SqlServerRelease.AzureSqlManagedInstance.DisplayName()
: SqlServerVersion.TryParse(productVersion, out var version) ? version.Release.DisplayName() : "Ukendt version";
}