siggy 1.2.0

Terminal-based Signal messenger client with vim keybindings
$ErrorActionPreference = "Stop"

$Repo = "johnsideserf/siggy"
$SignalCliRepo = "AsamK/signal-cli"
$Target = "x86_64-pc-windows-msvc"
$InstallDir = "$env:LOCALAPPDATA\siggy"

function Info($msg) { Write-Host ":: $msg" -ForegroundColor Blue }
function Err($msg) { Write-Host "error: $msg" -ForegroundColor Red; exit 1 }

# --- Get latest release ---
Info "Fetching latest release..."
try {
    $Release = Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/latest"
} catch {
    Err "Failed to fetch release info. Check your internet connection."
}

$Tag = $Release.tag_name
if (-not $Tag) { Err "Could not determine latest release tag" }
Info "Latest release: $Tag"

# --- Download and install siggy ---
$Archive = "siggy-$Tag-$Target.zip"
$DownloadUrl = "https://github.com/$Repo/releases/download/$Tag/$Archive"
$TmpDir = Join-Path $env:TEMP "siggy-install"

if (Test-Path $TmpDir) { Remove-Item -Recurse -Force $TmpDir }
New-Item -ItemType Directory -Path $TmpDir | Out-Null

Info "Downloading $Archive..."
try {
    Invoke-WebRequest -Uri $DownloadUrl -OutFile "$TmpDir\$Archive" -UseBasicParsing
} catch {
    Err "Download failed: $DownloadUrl"
}

if (-not (Test-Path $InstallDir)) {
    New-Item -ItemType Directory -Path $InstallDir | Out-Null
}

Info "Extracting..."
Expand-Archive -Path "$TmpDir\$Archive" -DestinationPath $TmpDir -Force
Copy-Item "$TmpDir\siggy.exe" "$InstallDir\siggy.exe" -Force

Info "Installed siggy to $InstallDir\siggy.exe"

# --- Add to PATH ---
$UserPath = [Environment]::GetEnvironmentVariable("Path", "User")
if ($UserPath -notlike "*$InstallDir*") {
    [Environment]::SetEnvironmentVariable("Path", "$InstallDir;$UserPath", "User")
    Info "Added $InstallDir to user PATH"
} else {
    Info "$InstallDir already in PATH"
}

# --- Check for signal-cli ---
$SignalCli = Get-Command signal-cli -ErrorAction SilentlyContinue
if ($SignalCli) {
    Info "signal-cli found: $($SignalCli.Source)"
} else {
    Info "signal-cli not found"

    # Check for Java 25+ (signal-cli 0.14+ requires class file version 69)
    $Java = Get-Command java -ErrorAction SilentlyContinue
    $JavaOk = $false
    if ($Java) {
        $JavaVer = & java -version 2>&1 | Select-Object -First 1
        if ($JavaVer -match '"(\d+)') {
            $JavaMajor = [int]$Matches[1]
            if ($JavaMajor -ge 25) {
                $JavaOk = $true
            } else {
                Info "Java $JavaMajor found, but signal-cli requires Java 25+"
            }
        }
    }
    if ($JavaOk) {
        Info "Java 25+ found, installing signal-cli..."

        try {
            $ScliRelease = Invoke-RestMethod -Uri "https://api.github.com/repos/$SignalCliRepo/releases/latest"
        } catch {
            Err "Failed to fetch signal-cli release info"
        }

        $ScliTag = $ScliRelease.tag_name
        $ScliVersion = $ScliTag.TrimStart("v")
        $ScliArchive = "signal-cli-$ScliVersion.tar.gz"
        $ScliUrl = "https://github.com/$SignalCliRepo/releases/download/$ScliTag/$ScliArchive"

        Info "Downloading signal-cli $ScliTag..."
        try {
            Invoke-WebRequest -Uri $ScliUrl -OutFile "$TmpDir\$ScliArchive" -UseBasicParsing
        } catch {
            Err "signal-cli download failed: $ScliUrl"
        }

        Info "Extracting signal-cli..."
        tar xzf "$TmpDir\$ScliArchive" -C $TmpDir

        $ScliDir = "$InstallDir\signal-cli"
        if (Test-Path $ScliDir) { Remove-Item -Recurse -Force $ScliDir }
        Copy-Item "$TmpDir\signal-cli-$ScliVersion" $ScliDir -Recurse

        # Create a wrapper batch file
        $WrapperContent = "@echo off`r`njava -jar `"%~dp0signal-cli\lib\signal-cli.jar`" %*"
        Set-Content -Path "$InstallDir\signal-cli.bat" -Value $WrapperContent

        Info "Installed signal-cli to $ScliDir"
    } else {
        Write-Host ""
        Info "signal-cli requires Java 25+. Install Java from:"
        Write-Host ""
        Write-Host "  winget install EclipseAdoptium.Temurin.25.JDK"
        Write-Host ""
        Write-Host "  Or download from: https://adoptium.net/"
        Write-Host ""
        Info "Then re-run this script to install signal-cli."
        Write-Host ""
    }
}

# --- Cleanup ---
Remove-Item -Recurse -Force $TmpDir -ErrorAction SilentlyContinue

# --- Done ---
Write-Host ""
Info "Done! Restart your terminal, then run 'siggy' to get started."