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