<#
Deploy embycovers to an Asustor NAS over SSH/SCP from Windows PowerShell.

Syncs project files to the NAS, then runs `docker compose build` and
`docker compose up -d` on the remote. All runtime configuration (Emby URL,
API key, ports, volumes) comes from docker-compose.yml — edit it there.

Prerequisites on your Windows machine:
- OpenSSH Client installed. Test with: ssh -V
- SSH enabled on the Asustor NAS.
- Docker / Docker Compose available on the Asustor NAS.

Example:
.\deploy.ps1 -NasHost MATT-NAS -NasUser ssh
#>

param(
    [Parameter(Mandatory = $true)]
    [string]$NasHost,

    [Parameter(Mandatory = $true)]
    [string]$NasUser,

    [string]$RemoteAppDir = "/share/Docker/homelabtoolkit"
)

$ErrorActionPreference = "Stop"

function Require-Command($Name) {
    if (-not (Get-Command $Name -ErrorAction SilentlyContinue)) {
        throw "$Name was not found. Install or enable it first."
    }
}

Require-Command ssh
Require-Command scp

$LocalDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$Remote = "$NasUser@$NasHost"

Write-Host "Deploying HomelabToolkit to ${Remote}:$RemoteAppDir"

ssh $Remote @"
set -e
mkdir -p '$RemoteAppDir' '$RemoteAppDir/output' '$RemoteAppDir/cache' '$RemoteAppDir/static/studios' '$RemoteAppDir/services' '$RemoteAppDir/frontend'
"@

# Copy top-level project files.
scp `
    "$LocalDir/app.py" `
    "$LocalDir/Dockerfile" `
    "$LocalDir/docker-compose.yml" `
    "$LocalDir/requirements.txt" `
    "${Remote}:$RemoteAppDir/"

# Copy static assets (studio logos, served at /static).
scp -r "$LocalDir/static/." "${Remote}:$RemoteAppDir/static/"

# Copy the service layer (Emby, Navidrome, music-covers). Exclude local __pycache__.
scp -r "$LocalDir/services/." "${Remote}:$RemoteAppDir/services/"

# Copy the React frontend SOURCE (built inside the Docker frontend stage).
# node_modules / dist are excluded — the image rebuilds them.
ssh $Remote "rm -rf '$RemoteAppDir/frontend/node_modules' '$RemoteAppDir/frontend/dist'"
scp "$LocalDir/frontend/package.json" "${Remote}:$RemoteAppDir/frontend/"
if (Test-Path "$LocalDir/frontend/package-lock.json") {
    scp "$LocalDir/frontend/package-lock.json" "${Remote}:$RemoteAppDir/frontend/"
}
scp `
    "$LocalDir/frontend/vite.config.ts" `
    "$LocalDir/frontend/tsconfig.json" `
    "$LocalDir/frontend/index.html" `
    "${Remote}:$RemoteAppDir/frontend/"
scp -r "$LocalDir/frontend/src" "${Remote}:$RemoteAppDir/frontend/"

# Copy any loose logo images that live at the repo root.
$LogoFiles = Get-ChildItem -Path $LocalDir -File |
    Where-Object { $_.Extension -in @('.png','.jpg','.jpeg') }
if ($LogoFiles) {
    $LogoArgs = $LogoFiles | ForEach-Object { "`"$($_.FullName)`"" }
    $ScpCmd = "scp $($LogoArgs -join ' ') `"${Remote}:$RemoteAppDir/`""
    Invoke-Expression $ScpCmd
}

# Build and run on the NAS using values from docker-compose.yml.
$RemoteCommands = @"
set -e
cd '$RemoteAppDir'

if command -v docker-compose >/dev/null 2>&1; then
  docker-compose build
  docker-compose up -d
else
  docker compose build
  docker compose up -d
fi
"@

ssh $Remote $RemoteCommands

Write-Host "Deployment complete."
Write-Host "To view logs:"
Write-Host "  ssh $Remote 'cd $RemoteAppDir && docker compose logs -f'"
