$script_path = split-path -parent $MyInvocation.MyCommand.Definition
$cmds = ""

function activate_buildtools() {
    $cmds += "ECHO                   Detecting and activating MS Build tools`n"
    $cmds += "ECHO                  =========================================`n"
    $cmds += "ECHO.`n"

    $cims = Get-CimInstance MSFT_VSInstance
    $chosen_cim = $null
    foreach ($cim in $cims) {
        $install_location = $cim.InstallLocation
        if (-Not(Get-ChildItem -Path $install_location -Filter CL.exe -Recurse -ErrorAction SilentlyContinue)) {
            $cmds += "ECHO No CL found in $install_location. Skipping.`n"
            continue
        }
        if ($chosen_cim -eq $null) {
            $chosen_cim = $cim
        }
        else {
            if ($cim.Version > $chosen_cim.Version) {
                $chosen_cim = $cim
            }
        }
    }
    if ($chosen_cim -eq $null) {
        $cmds += "ECHO No suitable installation found.`n"
        return
    }

    $install_location = $chosen_cim.InstallLocation

    $setup = Get-ChildItem -Path $install_location -Filter VsDevCmd.bat -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1
    if (-Not $setup) {
        $cmds += "ECHO The PowerShell setup module wasn't found.`n"
        return
    }
    $setup = $setup.FullName

    $cmds += "ECHO Found suitable installation in $install_location.`n"

    $arch = ""
    if ((Get-CimInstance win32_operatingsystem | select osarchitecture).osarchitecture -eq "64-bit") {
        $cmds += "`"$setup`" -arch=amd64`n"
    }
    else {
        $cmds += "`"$setup`"`n"
    }
    $cmds += "ECHO.`n"
    return $cmds
}

function add_to_path() {
    $cmds += "ECHO                            Adding Rakudo to PATH`n"
    $cmds += "ECHO                           =======================`n"
    $cmds += "ECHO.`n"

    $done_stuff = $null

    $rakudo_path0 = (Resolve-Path "$script_path\..\bin").Path
    $rakudo_path1 = (Resolve-Path "$script_path\..\share\perl6\site\bin").Path
    $new_path = $Env:PATH

    if ($env:PATH -NotLike "*$rakudo_path1*") {
        $new_path = "$rakudo_path1;$new_path"
        $done_stuff = $true
    }

    if ($env:PATH -NotLike "*$rakudo_path0*") {
        $new_path = "$rakudo_path0;$new_path"
        $done_stuff = $true
    }

    if ($done_stuff -ne $null) {
        $cmds += "SET `"PATH=$new_path`"`n"
        $cmds += "ECHO Paths successfully added.`n"
    }
    else {
        $cmds += "ECHO Paths already set. Nothing to do.`n"
    }
    return $cmds
}

$cmds += activate_buildtools
$cmds += add_to_path
$cmds += @'
ECHO.
ECHO ================================================================================
ECHO  =========                                                             __   __
ECHO   ||_|_||                =============================                (  \,/  )
ECHO   || # ||                 Welcome to the Raku Console                  \_ O _/
ECHO   || # ||                =============================                 (_/ \_)
ECHO.
ECHO This console has all the tools available you need to get started using Raku.
ECHO.
ECHO Rakudo provides an interactive command line interpreter (a so called Read Eval
ECHO Print Loop, REPL for short) you can use to quickly try out pieces of Raku code.
ECHO Start it by typing:
ECHO.
ECHO     raku.exe
ECHO.
ECHO If you already have a Raku program in a file, you can run it by typing:
ECHO.
ECHO     raku.exe path\to\my\program.raku
ECHO.
ECHO To install additional modules you can use the Zef module manager:
ECHO.
ECHO     zef install Some::Module
ECHO.
ECHO https://rakudo.org/           - The home of this implementation of Raku.
ECHO https://raku.land/            - Go here to browse for Raku modules.
ECHO https://docs.raku.org/        - The Raku documentation.
ECHO https://web.libera.chat/#raku - The Raku user chat. Talk to us!
ECHO.
ECHO                               Happy hacking!
ECHO.
ECHO ================================================================================
ECHO.
'@

echo $cmds