using System.Text.Json; using System.Text.Json.Serialization; namespace Remiss.Core; /// /// Läses från appsettings.json bredvid exe:n. Relativa sökvägar tolkas /// mot exe-mappen; tomma logg-/temp-sökvägar defaultas under LOCALAPPDATA\Remiss. /// public sealed class AppConfig { /// Namngiven målskrivare. Tom = Windows standardskrivare (utan dialoger). public string TargetPrinter { get; set; } = ""; public string SumatraPdfPath { get; set; } = "tools/SumatraPDF.exe"; public string MottagningarPath { get; set; } = "mottagningar.json"; public string SecureTempRoot { get; set; } = ""; public string AuditLogPath { get; set; } = ""; public string ErrorLogPath { get; set; } = ""; public int PrintRetries { get; set; } = 3; public int PrintRetryDelayMs { get; set; } = 2000; public bool DeleteSourceAfterPrint { get; set; } /// /// ENDAST FÖR UTVECKLING/TEST. Om satt kopieras den mergade PDF:en (försättsblad /// + remiss) hit innan utskrift och städning, så resultatet kan granskas. /// Kopian innehåller patientdata och städas inte – lämna tom i drift. /// public string DebugOutputDir { get; set; } = ""; [JsonIgnore] public string ConfigFilePath { get; private set; } = ""; private static readonly JsonSerializerOptions Options = new() { PropertyNameCaseInsensitive = true, ReadCommentHandling = JsonCommentHandling.Skip, AllowTrailingCommas = true, }; public static AppConfig Load(string baseDir) { var path = Path.Combine(baseDir, "appsettings.json"); var cfg = File.Exists(path) ? JsonSerializer.Deserialize(File.ReadAllText(path), Options) ?? new AppConfig() : new AppConfig(); cfg.ConfigFilePath = path; cfg.Resolve(baseDir); return cfg; } private void Resolve(string baseDir) { var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var appRoot = Path.Combine(localAppData, "Remiss"); SumatraPdfPath = ToAbsolute(SumatraPdfPath, baseDir); MottagningarPath = ToAbsolute(MottagningarPath, baseDir); if (string.IsNullOrWhiteSpace(SecureTempRoot)) SecureTempRoot = Path.Combine(appRoot, "temp"); if (string.IsNullOrWhiteSpace(AuditLogPath)) AuditLogPath = Path.Combine(appRoot, "audit", "audit.jsonl"); if (string.IsNullOrWhiteSpace(ErrorLogPath)) ErrorLogPath = Path.Combine(appRoot, "logs", "error.log"); if (!string.IsNullOrWhiteSpace(DebugOutputDir)) DebugOutputDir = ToAbsolute(DebugOutputDir, baseDir); } private static string ToAbsolute(string path, string baseDir) => Path.IsPathRooted(path) ? path : Path.GetFullPath(Path.Combine(baseDir, path)); }