foxygit / digitalskrivare_merge Log in
commits tags

/src/Remiss.Core/AppConfig.cs · 2.87 KB

raw
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Remiss.Core;

/// <summary>
/// Läses från <c>appsettings.json</c> bredvid exe:n. Relativa sökvägar tolkas
/// mot exe-mappen; tomma logg-/temp-sökvägar defaultas under LOCALAPPDATA\Remiss.
/// </summary>
public sealed class AppConfig
{
    /// <summary>Namngiven målskrivare. Tom = Windows standardskrivare (utan dialoger).</summary>
    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; }

    /// <summary>
    /// 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.
    /// </summary>
    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<AppConfig>(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));
}