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"; }