<#
.SYNOPSIS
	Exports all scripts to Serenade for voice control
.DESCRIPTION
	This script exports all PowerShell scripts to Serenade to execute them by voice.
.PARAMETER WakeWord
	Specifies the wakeword (none by default)
.PARAMETER FilePattern
	Specifies the file pattern for the scripts ("$PSScriptRoot/*.ps1" by default)
.PARAMETER TargetFile
	Specifies the target file ("$HOME/.serenade/scripts/PowerShell.js" by default)
.EXAMPLE
	PS> ./export-to-serenade.ps1 Computer
	⏳ Exporting 264 PowerShell scripts to C:\Users\Markus/.serenade/scripts/PowerShell.js...
	✔️ exported 264 scripts with wakework "Computer" to Serenade in 22 sec
.NOTES
	Author: Markus Fleschutz · License: CC0
.LINK
	https://github.com/fleschutz/PowerShell
#>

#requires -version 2

param([string]$WakeWord = "", [string]$FilePattern = "$PSScriptRoot/*.ps1", [string]$TargetFile = "$HOME/.serenade/scripts/PowerShell.js")

try {
	$StopWatch = [system.diagnostics.stopwatch]::startNew()

	$Scripts = Get-ChildItem "$FilePattern"
	"⏳ Found $($Scripts.Count) scripts, exporting them to $TargetFile..."

	"/* NOTE: This file has been generated automatically by export-to-serenade.ps1 */" | Set-Content "$TargetFile"
	foreach ($Script in $Scripts) {
		$ScriptName = $Script.basename
		$Keyword = $ScriptName -replace "-"," "
		"serenade.global().command(`"$WakeWord $Keyword`", async (api) => { await api.focusOrLaunchApplication(`"terminal`"); await api.typeText(`"$ScriptName.ps1`"); await api.pressKey(`"return`"); });" | Add-Content "$TargetFile"
	}

	[int]$Elapsed = $StopWatch.Elapsed.TotalSeconds
	"✔️ exported $($Scripts.Count) PowerShell scripts with wakeword `"$WakeWord`" to Serenade in $Elapsed sec"
	exit 0 # success
} catch {
	write-error "⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
	exit 1
}