Functions/ConfigGettersAndSetters.ps1

. "$PSScriptRoot\Get-InstalledPythonVersions.ps1"
. "$PSScriptRoot\Uninstall-Python.ps1"

$script:defaultConfigPath = "$PSScriptRoot\..\Config\config.json"
$script:registryConfigPath = "HKLM:\SOFTWARE\PythonPowershellUtilities"

function Get-PythonUtilitiesConfigValue([string]$Key){
    # Add registry keys if they haven't been added already, otherwise just return them
    if (!(Test-Path $script:registryConfigPath)){
        New-Item -Path $script:registryConfigPath
        Set-PythonUtilitiesConfigValue -Key "PythonInstallRoot" -Value "C:\PythonInstallations"
        Set-PythonUtilitiesConfigValue -Key "VirtualEnvironmentRoot" -Value "C:\PythonVirtualEnvironments"
    }
    $entry = Get-ItemProperty $script:registryConfigPath -Name $Key
    return $entry.$Key
}

function Set-PythonUtilitiesConfigValue([string]$Key, [string]$Value){
    Set-ItemProperty -Path $script:registryConfigPath -Name $Key -Value $Value
}

function Get-PythonInstallerCache(){
    $installRoot = Get-PythonInstallRoot
    $installerCache = "$installRoot\Installers"
    if (!(Test-Path $installerCache)){
        New-Item -ItemType Directory -Path $installerCache -Force | Out-Null
    }
    return $installerCache
}

function Get-PythonInstallRoot(){
    return Get-PythonUtilitiesConfigValue -Key "PythonInstallRoot"
}

function Set-PythonInstallRoot([string]$Path, [switch]$Force=$false){
    $installRoot = Get-PythonInstallRoot
    $installerCache = Get-PythonInstallerCache
    if (Test-Path -Path $installerCache){
        $cacheInfo = Get-ChildItem "$installerCache\python*" | Measure-Object
        if ($cacheInfo.Count -gt 0){
            if (!$Force){
                $response = Read-Host "WARNING: One or more versions of python have already been installed into the current PythonInstallRoot, located at $installRoot. Changing the root will uninstalll those versions and orphan any virtual environments created from those versions. To continue and uninstall the current python versions enter 'yes'. To cancel, enter 'no' or press enter/return"
                if (!($response -eq "yes")){
                    return
                }
            }
            
            foreach ($version in $(Get-InstalledPythonVersions)){
                Uninstall-Python -Version $version
            }

            # Delete the installer cached and the installation directory if it's empty
            Remove-Item -Recurse $installerCache
            $installerDirInfo = Get-ChildItem $installRoot | Measure-Object
            if ($installerDirInfo.Count -eq 0){
                Remove-Item -Recurse $installRoot
            }
        }
    }
    New-Item -ItemType directory -Path "$Path\Installers" -Force | Out-Null
    Set-PythonUtilitiesConfigValue -Key "PythonInstallRoot" -Value $Path
}

function Get-VirtualEnvironmentRoot(){
    return Get-PythonUtilitiesConfigValue -Key "VirtualEnvironmentRoot"
}

function Set-VirtualEnvironmentRoot([string]$Path, [switch]$Force){
    if (!$Force){
        $venvRootPath = Get-VirtualEnvironmentRoot
        if (Test-Path $venvRootPath) {
            $venvRootInfo = Get-ChildItem $venvRootPath | Measure-Object
            if ($venvRootInfo.Count -gt 0){
                $response = Read-Host "WARNING: One or more virtual environments have already been created in the current VirtualEnvironmentRoot, located at $venvRootPath. Changing the root will leave the environments in place, but they will not be accessible through calls to `Enter-PythonVirtualEnvironment`. To continue enter 'yes'. To cancel, enter 'no' or press enter/return"
                if (!($response -eq "yes")){
                    return
                }
            }
        }
    }
    Set-PythonUtilitiesConfigValue -Key "VirtualEnvironmentRoot" -Value $Path
}