namespace LanMountainDesktop.Shared.Contracts.Update;

public static class UpdatePaths
{
    private const string LauncherDirectoryName = ".Launcher";
    private const string UpdateDirectoryName = "update";
    private const string IncomingDirectoryName = "incoming";
    private const string ObjectsDirectoryName = "objects";
    private const string SnapshotsDirectoryName = "snapshots";

    public static string ResolveLauncherRoot(string appBaseDirectory)
    {
        var trimmed = appBaseDirectory.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
        var parent = Path.GetDirectoryName(trimmed);
        return string.IsNullOrWhiteSpace(parent) ? appBaseDirectory : parent;
    }

    public static string GetLauncherDataRoot(string launcherRoot)
    {
        return Path.Combine(launcherRoot, LauncherDirectoryName);
    }

    public static string GetIncomingDirectory(string launcherRoot)
    {
        return Path.Combine(launcherRoot, LauncherDirectoryName, UpdateDirectoryName, IncomingDirectoryName);
    }

    public static string GetObjectsDirectory(string launcherRoot)
    {
        return Path.Combine(GetIncomingDirectory(launcherRoot), ObjectsDirectoryName);
    }

    public static string GetSnapshotsDirectory(string launcherRoot)
    {
        return Path.Combine(launcherRoot, LauncherDirectoryName, SnapshotsDirectoryName);
    }

    public static string GetDownloadMarkerPath(string launcherRoot)
    {
        return Path.Combine(GetIncomingDirectory(launcherRoot), ".download-complete");
    }

    public static string GetPlondsFileMapName() => "plonds-filemap.json";
    public static string GetPlondsSignatureName() => "plonds-filemap.sig";
    public static string GetPlondsUpdateMetadataName() => "plonds-update.json";
    public static string GetLegacyFileMapName() => "files.json";
    public static string GetLegacySignatureName() => "files.json.sig";
    public static string GetLegacyArchiveName() => "update.zip";
    public static string GetPublicKeyFileName() => "public-key.pem";

    public static string GetPlondsFileMapPath(string launcherRoot)
        => Path.Combine(GetIncomingDirectory(launcherRoot), GetPlondsFileMapName());

    public static string GetPlondsSignaturePath(string launcherRoot)
        => Path.Combine(GetIncomingDirectory(launcherRoot), GetPlondsSignatureName());

    public static string GetDeploymentLockName() => "deployment.lock";

    public static string GetDeploymentLockPath(string launcherRoot)
        => Path.Combine(GetIncomingDirectory(launcherRoot), GetDeploymentLockName());

    public static string GetApplyInProgressLockName() => "apply-in-progress.lock";

    public static string GetApplyInProgressLockPath(string launcherRoot)
        => Path.Combine(GetIncomingDirectory(launcherRoot), GetApplyInProgressLockName());

    public static string GetInstallCheckpointName() => "install-checkpoint.json";

    public static string GetInstallCheckpointPath(string launcherRoot)
        => Path.Combine(GetIncomingDirectory(launcherRoot), GetInstallCheckpointName());

    public static string GetDownloadMarkerContent(string manifestSha256, string targetVersion, int objectCount)
    {
        return $$"""
                 {
                   "manifestSha256": "{{manifestSha256}}",
                   "targetVersion": "{{targetVersion}}",
                   "objectCount": {{objectCount}},
                   "completedAt": "{{DateTimeOffset.UtcNow:O}}"
                 }
                 """;
    }
}
