set dotenv-load := true

default:
    @just --list

dev-back:
    go run ./cmd/cdropd

dev-front:
    cd web && npm run dev

build-back:
    mkdir -p dist
    go build -o dist/cdropd ./cmd/cdropd

build-front:
    cd web && npm run build

build: build-back build-front

test:
    go test ./...

typecheck-front:
    cd web && npm run typecheck

fmt:
    gofmt -w .

vet:
    go vet ./...

# 生成一对 VAPID 密钥（Web Push 用）。输出两行 env，写进部署密钥后固定不变——
# 更换会使所有既有浏览器订阅失效。两者皆设才启用推送。
vapid-keygen:
    go run ./cmd/vapidgen

# ---- desktop client (Wails · macOS 主开发，Windows 在 Parallels 验证) ----

# wails CLI 在 go install 后落在 $(go env GOPATH)/bin/wails，
# 用绝对路径避免依赖 shell PATH 配置。
wails := `go env GOPATH` + "/bin/wails"

# 起 wails dev 热重载，前端走 Vite dev server。
desktop-dev:
    cd desktop && {{wails}} dev

# 构建 macOS universal .app（含 darwin/arm64 + darwin/amd64）。
# 不加 -clean，让 mac/win 产物在 build/bin/ 共存；清理走 desktop-clean。
#
# ⚠️ 先手动构建前端再 `wails build -s`（跳过 wails 自带前端步骤）：wails build 的
# frontend:build 在本仓库结构下不可靠（不实际重建 web/ → 嵌入旧 JS）。显式构建
# web → desktop/frontend/dist，再用 -s 让 go:embed 嵌入这份新 dist。
desktop-build-mac:
    cd web && npm run build -- --outDir ../desktop/frontend/dist --emptyOutDir
    cd desktop && {{wails}} build -s -platform darwin/universal

# 交叉编译 Windows amd64 .exe。macOS 原生即可——Windows 侧无 cgo（darwin 的
# NSStatusBar/NSPasteboard CGO 走 build tag 排除，WebView2 是纯 Go），不需 mingw。
# 与 mac 同：先手动构建前端再 -s（wails 自带 frontend:build 在本仓库不可靠）。
# 产物 build/bin/desktop.exe；真测试经 RDP 到 Windows 机器跑。
desktop-build-win:
    cd web && npm run build -- --outDir ../desktop/frontend/dist --emptyOutDir
    cd desktop && {{wails}} build -s -platform windows/amd64

# 清空 build/bin/ 产物。
desktop-clean:
    rm -rf desktop/build/bin

# 环境自检。
desktop-doctor:
    {{wails}} doctor

# ---- iOS 真机 ----

# 列出已连接的真机（手机插 USB 后取 UDID，填进门户 Devices + just ios-device）。
ios-devices:
    xcrun devicectl list devices

# 真机构建 + 装机（手动签名）。前置：付费 ADP；门户建好 App ID/App Group/Push/设备/profile；
# 按 ios/CDrop/REALDEVICE.md 建好 gitignore 的 ios/CDrop/Local.xcconfig（Team ID + 3 个 profile 名）。
# 模拟器构建不需这些（base ad-hoc）。用法：just ios-device <设备UDID>（UDID 见 just ios-devices）。
ios-device udid:
    test -f ios/CDrop/Local.xcconfig || { echo "缺 ios/CDrop/Local.xcconfig——见 ios/CDrop/REALDEVICE.md"; exit 1; }
    cd ios/CDrop && xcodegen generate
    cd ios/CDrop && xcodebuild -project CDrop.xcodeproj -scheme CDrop -configuration Debug -destination 'generic/platform=iOS' -derivedDataPath build/DD-device build
    xcrun devicectl device install app --device {{udid}} ios/CDrop/build/DD-device/Build/Products/Debug-iphoneos/CDrop.app

# ---- deploy plumbing ----

# 一次性预热：把 Go modules + node_modules 烤进 cdrop-base:latest。
# 仅 go.mod/go.sum 或 web/package*.json 改动时需要重跑。
# 用宿主原生 arch（macOS arm64 → linux/arm64），让 BUILDPLATFORM 跨编译走原生。
docker-base:
    docker buildx build -f docker/Dockerfile.base -t cdrop-base:latest --load .

# 应用镜像：从 cdrop-base 起步只编译源码，最终落 linux/amd64 distroless。
# dev mode 部署时 export VITE_CDROP_DEV_TOKEN=<同后端 token> 把它烤进前端 bundle。
docker-image:
    docker buildx build --platform linux/amd64 \
        --build-arg VITE_CDROP_DEV_TOKEN="${VITE_CDROP_DEV_TOKEN:-}" \
        --build-arg VITE_CDROP_STUN_URLS="${VITE_CDROP_STUN_URLS:-}" \
        -f docker/Dockerfile -t cdrop:latest --load .
