#!/bin/pwsh
Import-Module "KnownFolders";
. "$PSScriptRoot/../../Scripts/Context.ps1";

$null = New-Module {
    $programs32Path = $(Get-KnownFolder "ProgramFilesX86").Path;
    $vsInstaller = "$programs32Path/Microsoft Visual Studio/Installer/vs_installer.exe";

    [System.Tuple[string, string, string][]]$versions = @(
        [System.Tuple]::Create("visualstudio2019enterprise", "VisualStudio.16.Release", "Microsoft.VisualStudio.Product.Enterprise"));

    function Get-ConfigPath([Context] $context, [string] $packageName) {
        return Join-Path $($context.BackupRoot()) $packageName ".vsconfig";
    }

    function Backup-VisualStudio([Context] $context) {
        Write-Host "Backing up Visual Studio";

        foreach ($version in $versions) {
            Write-Information "Backing up $($version[1]): $($version[2])";

            $configPath = Get-ConfigPath $context $version[0];
            $null = New-Item -Force -ItemType Directory "$(Split-Path -Parent $configPath)";

            Start-Process -FilePath "$vsInstaller" `
                -Wait `
                -ArgumentList @(
                    "export",
                    "--channelId", "$($version[1])",
                    "--productId", "$($version[2])",
                    "--config", "$configPath",
                    "--quiet");
        }
    }

    function Restore-VisualStudio([Context] $context) {
        Write-Host "Restoring Visual Studio";

        foreach ($version in $versions) {
            Write-Information "Restoring $($version[1]): $($version[2])";
            $configFileName = Get-ConfigPath $context $version[0];
            $arguments = "";

            if (Test-Path $configFileName) {
                $arguments = "--config `"$configFileName`"";
            }

            choco install -y $version[0] --params "$arguments";
        }
    }
}