# This test installs emsdk and activates the latest toolchain using `--system` or `--permanent` flags,
# and checks if parts of PATH are lost or overwritten. Set $env:SYSTEM_FLAG and $env:PERMANENT_FLAG to test each.
# If no flag is provided the process/shell values are tested. See the CI file for an example.

refreshenv

$repo_root = [System.IO.Path]::GetDirectoryName((resolve-path "$PSScriptRoot"))

$PATH_USER_BEFORE = [System.Environment]::GetEnvironmentVariable("PATH", "User")
$PATH_MACHINE_BEFORE = [System.Environment]::GetEnvironmentVariable("PATH", "Machine")
$PATH_Process_BEFORE = [System.Environment]::GetEnvironmentVariable("PATH", "Process")

try {


    & "$repo_root/emsdk.ps1" install latest

    $esc = '--%'
    & "$repo_root/emsdk.ps1" activate latest $esc $env:PERMANENT_FLAG $env:SYSTEM_FLAG

    $PATH_USER = [System.Environment]::GetEnvironmentVariable("PATH", "User")
    $PATH_MACHINE = [System.Environment]::GetEnvironmentVariable("PATH", "Machine")
    $PATH_Process = [System.Environment]::GetEnvironmentVariable("PATH", "Process")

    if ($env:SYSTEM_FLAG) {
        echo "--system test............................."
        $path_before_arr = $PATH_MACHINE_BEFORE.Split(';')
        $path_arr = $PATH_MACHINE.Split(';')
    }
    elseif ($env:PERMANENT_FLAG) {
        echo "--permanent test.........................."
        $path_before_arr = $PATH_USER_BEFORE.Split(';')
        $path_arr = $PATH_USER.Split(';')
    } else {
        echo "no flag test (shell/process).............."
        $path_before_arr = $PATH_Process_BEFORE.Split(';')
        $path_arr = $PATH_Process.Split(';')
    }


    $EMSDK_Path = $path_arr | Where-Object { $_ -like "$repo_root*" }
    $EMSDK_NODE_Path = $path_arr | Where-Object { $_ -like "$repo_root\node*" }
    $EMSDK_PYTHON_Path = $path_arr | Where-Object { $_ -like "$repo_root\python*" }
    $EMSDK_JAVA_Path = $path_arr | Where-Object { $_ -like "$repo_root\java*" }
    $EMSDK_UPSTREAM_Path = $path_arr | Where-Object { $_ -like "$repo_root\upstream\emscripten*" }

    $number_of_items = $path_arr.count
    [System.Collections.ArrayList]$rest_of_path = @()
    Foreach ($item in $path_arr) {
        if (
            ($item -like "$repo_root*") -or
            ($item -like "$repo_root\node*") -or
            ($item -like "$repo_root\python*") -or
            ($item -like "$repo_root\java*") -or
            ($item -like "$repo_root\upstream\emscripten*")
        ) {
            echo "$item is on the PATH"
        }
        else {
            $rest_of_path.add($item) | Out-Null
        }
    }

    # compare the PATHs before activation and after activation
    if (Compare-Object -ReferenceObject $path_before_arr -DifferenceObject $rest_of_path ) {
        echo "Old path is ............................."
        echo $path_before_arr
        echo "Current rest of path is ................."
        echo $rest_of_path
        throw "some parts of PATH are removed"
    }

    # Compare the other untouched PATH
    if ($env:SYSTEM_FLAG) {
        if (Compare-Object -ReferenceObject $PATH_USER_BEFORE.Split(';') -DifferenceObject $PATH_USER.Split(';') ) {
            echo "Old user path is ...................."
            echo $PATH_USER_BEFORE
            echo "Current user path is ................"
            echo $PATH_USER
            throw "User PATH are changed while --system had been provided"
        }
    }
    elseif ($env:PERMANENT_FLAG) {
        if (Compare-Object -ReferenceObject $PATH_MACHINE_BEFORE.Split(';') -DifferenceObject $PATH_MACHINE.Split(';') ) {
            echo "Old machine path is.................."
            echo $PATH_MACHINE_BEFORE
            echo "Current machine path is.............."
            echo $PATH_MACHINE
            throw "MACHINE PATH are changed while --system was not provided"
        }
    } else {
        if (
            (Compare-Object -ReferenceObject $PATH_MACHINE_BEFORE.Split(';') -DifferenceObject $PATH_MACHINE.Split(';')) -or
            (Compare-Object -ReferenceObject $PATH_MACHINE_BEFORE.Split(';') -DifferenceObject $PATH_MACHINE.Split(';'))
        ) {
            echo "Old machine path is.................."
            echo $PATH_MACHINE_BEFORE
            echo "Current machine path is.............."
            echo $PATH_MACHINE
            echo "Old user path is ...................."
            echo $PATH_USER_BEFORE
            echo "Current user path is ................"
            echo $PATH_USER
            throw "MACHINE/USER PATH are changed while no flag was provided"
        }
    }




}
finally {
    # Recover pre-split PATH
    refreshenv

    [Environment]::SetEnvironmentVariable("Path", $PATH_USER_BEFORE, "User")
    try {
        [Environment]::SetEnvironmentVariable("Path", $PATH_MACHINE_BEFORE, "Machine")
    }
    catch {}

    [Environment]::SetEnvironmentVariable("Path", $PATH_Process_BEFORE, "Process")

    # Recover pre activation env variables
    [Environment]::SetEnvironmentVariable("EMSDK", $null, "User")
    [Environment]::SetEnvironmentVariable("EM_CONFIG", $null, "User")
    [Environment]::SetEnvironmentVariable("EMSDK_NODE", $null, "User")
    [Environment]::SetEnvironmentVariable("EMSDK_PYTHON", $null, "User")
    [Environment]::SetEnvironmentVariable("JAVA_HOME", $null, "User")

    try {
        [Environment]::SetEnvironmentVariable("EMSDK", $null, "Machine")
        [Environment]::SetEnvironmentVariable("EM_CONFIG", $null, "Machine")
        [Environment]::SetEnvironmentVariable("EMSDK_NODE", $null, "Machine")
        [Environment]::SetEnvironmentVariable("EMSDK_PYTHON", $null, "Machine")
        [Environment]::SetEnvironmentVariable("JAVA_HOME", $null, "Machine")
    } catch {}


    [Environment]::SetEnvironmentVariable("EMSDK", $null, "Process")
    [Environment]::SetEnvironmentVariable("EM_CONFIG", $null, "Process")
    [Environment]::SetEnvironmentVariable("EMSDK_NODE", $null, "Process")
    [Environment]::SetEnvironmentVariable("EMSDK_PYTHON", $null, "Process")
    [Environment]::SetEnvironmentVariable("JAVA_HOME", $null, "Process")

    refreshenv

}
