. "$PSScriptRoot/../Scripts/Context.ps1";
. "$PSScriptRoot/../Scripts/PersonalFiles.ps1";
. "$PSScriptRoot/../Software/git/Manage.ps1";
. "$PSScriptRoot/../Software/LGHub/Manage.ps1";
. "$PSScriptRoot/../Software/ManiaPlanet/Manage.ps1";
. "$PSScriptRoot/../Software/osu!/Manage.ps1";
. "$PSScriptRoot/../Software/osu!lazer/Manage.ps1";
. "$PSScriptRoot/../Software/PuTTY/Manage.ps1";
. "$PSScriptRoot/../Software/RetroArch/Manage.ps1";
. "$PSScriptRoot/../Software/reWASD/Manage.ps1";
. "$PSScriptRoot/../Software/TrackMania Nations Forever/Manage.ps1";
. "$PSScriptRoot/../Software/TrackMania United Forever/Manage.ps1";
. "$PSScriptRoot/../Software/VisualStudio/Manage.ps1";

function Invoke-WindowsBackup([Context] $context) {
    Write-Information "Backing up Windows";
    $backupRoot = $context.BackupRoot();
    Invoke-FileBackup $context;
    Invoke-BackupGit $context;
    Invoke-BackupLGHub $context;
    Invoke-BackupManiaPlanet $context;
    Invoke-BackupOsu $context;
    Invoke-BackupOsuLazer $context;
    Invoke-BackupPuTTY $context;
    Invoke-BackupRetroArch $context;
    Invoke-BackupReWASD $context;
    Invoke-BackupTmNations $context;
    Invoke-BackupTmUnited $context;
    Invoke-BackupVisualStudio $context;
    $context.Backup($backupRoot, "$backupRoot.7z", @("-sdel"));
}

function Invoke-WindowsRestore([Context] $context) {
    Write-Host "Restoring Windows";

    function Read-Path()
    {
        $backupPath = Read-Host -Prompt "Please enter the path to the archive load the backup from.";

        if ($backupPath -and (-not (Test-Path -PathType Leaf $backupPath)))
        {
            Write-Host "No file could be found at the specified path.";
            return Read-Path;
        }
        else
        {
            return $backupPath;
        }
    }

    Write-Information "Determining Backup Archive Path";
    $backupPath = Read-Path;
    $context = [Context]::new();
    $context.BackupName ??= "PortValhalla";
    $context.RootDir = $context.GetTempDirectory();

    if ($backupPath)
    {
        $context.Restore($backupPath, $context.BackupRoot());
    }

    Invoke-FileRestore $context;
    Invoke-RestoreGit $context;

    Remove-Item -Recurse $context.RootDir;
}