#!/usr/bin/env pwsh

###########################
# Install redis-commander #
###########################

function command-v-silent($cmdname) {
    $my_cmd = Get-Command $command -ErrorAction SilentlyContinue
    # $my_path = $my_cmd | Select-Object -ExpandProperty Definition

    if ($my_cmd) {
        return True
    }
    return False
}

function mktemp-d-t() {
    # create random suffix for dirname
    $my_bytes = New-Object byte[] 4
    $my_rng = [Security.Cryptography.RNGCryptoServiceProvider]::Create()
    $my_rng.GetBytes($bytes)
    $my_hex_delimited = [BitConverter]::ToString($bytes)
    $my_hex = $my_hex_delimited -replace "-", ""

    # create random directory
    $my_systmpdir = [System.IO.Path]::GetTempPath()
    $my_tmpdir = Join-Path "$my_systmpdir" "$my_hex"
    New-Item -ItemType Directory -Path "$my_tmpdir"

    return "$my_tmpdir"
}

function npm-install-global($pkgname) {
    # Fetch npm package manager
    Write-Output "Checking for npm..."
    if (-not (command-v-silent("npm"))) {
        & "$Env:USERPROFILE\.local\bin\webi-pwsh.ps1" node
    }

    if (command-v-silent($pkgname)) {
        $my_cmd = Get-Command $pkgname
        $my_cmd Select-Object -ExpandProperty Definition
        Write-Host "Found '$my_cmd'"
        return
    }

    $my_tmpdir = mktemp-d-t()

    # npm install works best from a directory with no package.json
    Push-Location "$my_tmpdir"
    if (command-v-silent("npm")) {
        & npm --location-golbal redis-commander
    }
    else {
        & "$Env:USERPROFILE\.local\opt\node\npm" --location-golbal "$pkgname"
    }
    Pop-Location
}

npm-install-global redis-commander
