# JClaw Monitor · Windows 防退出 / 自启动
# baicy day-2: "员工不能 kill JClaw Monitor"
#
# 思路：用 Windows Task Scheduler 注册一个登录时自启 + 失败重试的任务。
# 比起 NSSM/winsw 装真 Service 更轻量，普通员工权限就能跑（不需要 admin）。
#
# 用法（PowerShell 管理员）：
#   .\install-windows-task.ps1
#
# 卸载（必须提供匹配 admin token 才放过）：
#   $env:JCLAW_DESKTOP_ADMIN_TOKEN = "<admin 那边公布的 token>"
#   .\install-windows-task.ps1 -Uninstall    # 会弹 prompt 安全输入 token

[CmdletBinding()]
param(
    [switch]$Uninstall
)

$ErrorActionPreference = "Stop"
$TaskName = "JClaw Monitor Auto-Restart"
$ExePath = "$env:LOCALAPPDATA\Programs\JClaw Monitor\JClaw Monitor.exe"

if ($Uninstall) {
    # Codex/CodeRabbit #443 三/四轮 P1：卸载必须 admin token 校验。
    #
    # 已知限制（baicy/iHouse 威胁模型内可接受）：
    #   - 读 process-level $env:JCLAW_DESKTOP_ADMIN_TOKEN，拿到本机 admin 权限的
    #     攻击者可自设此 env 绕过。此 gating 防"普通员工 -Uninstall"，不是
    #     防真正本机 Administrator。真机器级锁需要 DPAPI / TPM。
    #   - token 用 Read-Host -AsSecureString 提示输入，不进 argv / PSReadLine history
    $expected = $env:JCLAW_DESKTOP_ADMIN_TOKEN
    if ([string]::IsNullOrWhiteSpace($expected)) {
        Write-Host "Cannot uninstall: env JCLAW_DESKTOP_ADMIN_TOKEN not set." -ForegroundColor Red
        Write-Host "ask the admin (baicy) for the token, then:" -ForegroundColor Yellow
        Write-Host '  $env:JCLAW_DESKTOP_ADMIN_TOKEN = "<token>"'
        Write-Host '  .\install-windows-task.ps1 -Uninstall'
        exit 2
    }
    $secure = Read-Host -Prompt "Enter admin token" -AsSecureString
    $given = [System.Net.NetworkCredential]::new("", $secure).Password
    if ([string]::IsNullOrEmpty($given) -or $given -cne $expected) {
        Write-Host "Cannot uninstall: token does not match." -ForegroundColor Red
        exit 2
    }
    Write-Host "Removing scheduled task '$TaskName'..." -ForegroundColor Yellow
    schtasks /Delete /TN "$TaskName" /F
    if ($LASTEXITCODE -eq 0) {
        Write-Host "OK 任务已删除。员工现在可以正常关闭 JClaw Monitor。" -ForegroundColor Green
        exit 0
    }
    elseif ($LASTEXITCODE -eq 1) {
        # 任务本就不存在；语义上等同 success（idempotent）
        Write-Host "任务不存在或已被删除（idempotent，视为成功）" -ForegroundColor Yellow
        exit 0
    }
    else {
        Write-Host "ERROR schtasks /Delete failed (exit=$LASTEXITCODE)" -ForegroundColor Red
        exit $LASTEXITCODE
    }
}

# 校验 exe 存在
if (-not (Test-Path $ExePath)) {
    Write-Host "ERROR JClaw Monitor.exe not found at: $ExePath" -ForegroundColor Red
    Write-Host "先装 JClaw Monitor，再跑这个脚本"
    exit 1
}

# 删旧任务（如果存在）
schtasks /Delete /TN "$TaskName" /F 2>$null

# 创建任务：
#   - 触发：用户登录时
#   - 触发：被 kill / 退出后 1 分钟内重新跑
#   - 隐藏窗口，后台跑
#   - 不需要 admin 权限（高权限会破坏 tray icon 显示）

$action = New-ScheduledTaskAction -Execute $ExePath

$loginTrigger = New-ScheduledTaskTrigger -AtLogOn

$settings = New-ScheduledTaskSettingsSet `
    -AllowStartIfOnBatteries `
    -DontStopIfGoingOnBatteries `
    -RestartCount 9999 `
    -RestartInterval (New-TimeSpan -Minutes 1) `
    -StartWhenAvailable `
    -ExecutionTimeLimit (New-TimeSpan -Hours 0)

$principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive

Register-ScheduledTask -TaskName $TaskName `
    -Action $action `
    -Trigger $loginTrigger `
    -Settings $settings `
    -Principal $principal `
    -Description "JClaw Monitor 自动重启：被 kill 后 1 分钟内回来。卸载用 .\install-windows-task.ps1 -Uninstall（会弹安全 prompt 输 admin token）"

Write-Host ""
Write-Host "========================================" -ForegroundColor Green
Write-Host "OK Windows 防退出任务已注册" -ForegroundColor Green
Write-Host "" -ForegroundColor Green
Write-Host "员工现在：" -ForegroundColor Green
Write-Host "  - 任务管理器结束 JClaw Monitor → 1 分钟内自动回来" -ForegroundColor Green
Write-Host "  - 关电脑下次开机自动启动" -ForegroundColor Green
Write-Host "" -ForegroundColor Green
Write-Host "卸载（必须提供 admin token）：" -ForegroundColor Yellow
Write-Host '  $env:JCLAW_DESKTOP_ADMIN_TOKEN = "<token>"; .\install-windows-task.ps1 -Uninstall   # 弹 prompt 输 token' -ForegroundColor Yellow
Write-Host "========================================" -ForegroundColor Green

# 立刻 trigger 一次（让员工现在装完就能看到 tray icon）
schtasks /Run /TN "$TaskName"
