#requires -version 5
<#
.SYNOPSIS
  warpbox: command line uploader for Warpbox
.DESCRIPTION
  Set the server once, then upload anything:
    setx WARPBOX_HOST "https://your.warpbox.host"
    warpbox .\report.pdf

  Install (PowerShell):
    iwr "$env:WARPBOX_HOST/static/api/warpbox.ps1" -OutFile $HOME\warpbox.ps1
    # add a function to your $PROFILE:  function warpbox { & "$HOME\warpbox.ps1" @args }

  Auth: set the token once so it never lands in your command history.
    setx WARPBOX_TOKEN "wbx_your_token"
  Create a token under Account, Access tokens.

.EXAMPLE
  .\warpbox.ps1 .\report.pdf
.EXAMPLE
  .\warpbox.ps1 -Password 123 -Expiry 2d .\photo.png .\clip.mp4
#>
[CmdletBinding()]
param(
  [Alias('p')][string]$Password,
  [Alias('e')][string]$Expiry,
  [Alias('n')][int]$MaxDownloads,
  [Alias('o')][switch]$Obfuscate,
  [string]$Server = $env:WARPBOX_HOST,
  [string]$Auth = $env:WARPBOX_TOKEN,
  [string]$AuthFile,
  [switch]$Json,
  [switch]$Help,
  [Parameter(ValueFromRemainingArguments = $true)][string[]]$Files
)

if ($Help -or -not $Files) {
  Write-Host 'warpbox: upload files to Warpbox'
  Write-Host 'USAGE:  warpbox.ps1 [-Password pw] [-Expiry 2d] [-MaxDownloads n] [-Obfuscate] [-Json] <file> [file ...]'
  Write-Host 'SERVER: set WARPBOX_HOST in your environment (setx WARPBOX_HOST "https://your.host")'
  Write-Host 'AUTH:   set WARPBOX_TOKEN in your environment (setx WARPBOX_TOKEN "wbx_...")'
  if (-not $Files -and -not $Help) { exit 2 } else { exit 0 }
}

if (-not $Server) {
  Write-Error 'warpbox: no server set. Use -Server <url> or set WARPBOX_HOST'
  exit 2
}
if ($AuthFile) { $Auth = (Get-Content -Raw $AuthFile).Trim() }

function ConvertTo-Minutes($v) {
  if ($v -match '^(\d+)([mhdw]?)$') {
    $n = [int]$Matches[1]
    switch ($Matches[2]) {
      'h' { return $n * 60 }
      'd' { return $n * 1440 }
      'w' { return $n * 10080 }
      default { return $n }
    }
  }
  return $v
}

# Expand wildcards (PowerShell does not expand them in arguments).
$expanded = @()
foreach ($f in $Files) {
  $hits = Get-ChildItem -Path $f -File -ErrorAction SilentlyContinue
  if ($hits) { $expanded += $hits.FullName } else { $expanded += $f }
}

$curlArgs = @('-fS')
foreach ($f in $expanded) { $curlArgs += @('-F', "file=@$f") }
if ($Password) { $curlArgs += @('-F', "password=$Password") }
if ($Expiry) { $curlArgs += @('-F', "expires_minutes=$(ConvertTo-Minutes $Expiry)") }
if ($MaxDownloads) { $curlArgs += @('-F', "max_downloads=$MaxDownloads") }
if ($Obfuscate) { $curlArgs += @('-F', 'obfuscate_metadata=on') }
if ($Auth) { $curlArgs += @('-H', "Authorization: Bearer $Auth") }
if ($Json) { $curlArgs += @('-H', 'Accept: application/json') }
$curlArgs += "$($Server.TrimEnd('/'))/api/v1/upload"

& curl.exe @curlArgs
