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 Apple Silicon .app（darwin/arm64；不支持 Intel）。
# 每次清理 build/bin：带空格的 macOS .app 若残留在 Go 模块内，会被后续跨平台
# 绑定生成误判为包路径；同一输出槽也只保留本次平台的一份客户端。
#
# ⚠️ 先手动构建前端再 `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 -clean -s -platform darwin/arm64

# 正式 macOS 分发：复用钥匙串中的 Developer ID Application 证书，对 ARM64 Wails app
# 启用 hardened runtime + 时间戳签名，先公证并装订 app，再生成、签名、公证和装订 DMG。
# 公证使用与 iOS provisioning 共用的 ASC API Key；所有身份和密钥路径从 .env 读取。
desktop-dist-mac: desktop-build-mac
    [ -n "$CDROP_DEVID_IDENTITY" ] && [ -n "$CDROP_ASC_KEY_PATH" ] && [ -n "$CDROP_ASC_KEY_ID" ] && [ -n "$CDROP_ASC_ISSUER_ID" ] || { echo "缺 .env（CDROP_DEVID_IDENTITY / CDROP_ASC_KEY_PATH / CDROP_ASC_KEY_ID / CDROP_ASC_ISSUER_ID）"; exit 1; }
    [ -f "$CDROP_ASC_KEY_PATH" ]
    security find-identity -v -p codesigning | rg -F "$CDROP_DEVID_IDENTITY"
    codesign --force --deep --options runtime --timestamp --sign "$CDROP_DEVID_IDENTITY" 'desktop/build/bin/Commilitia Drop.app'
    codesign --verify --deep --strict --verbose=2 'desktop/build/bin/Commilitia Drop.app'
    rm -f 'desktop/build/bin/Commilitia Drop.app.zip' 'desktop/build/bin/Commilitia Drop.dmg'
    ditto -c -k --keepParent 'desktop/build/bin/Commilitia Drop.app' 'desktop/build/bin/Commilitia Drop.app.zip'
    xcrun notarytool submit 'desktop/build/bin/Commilitia Drop.app.zip' --key "$CDROP_ASC_KEY_PATH" --key-id "$CDROP_ASC_KEY_ID" --issuer "$CDROP_ASC_ISSUER_ID" --wait
    xcrun stapler staple 'desktop/build/bin/Commilitia Drop.app'
    xcrun stapler validate 'desktop/build/bin/Commilitia Drop.app'
    bash desktop/scripts/make-dmg.sh 'desktop/build/bin/Commilitia Drop.app' 'desktop/build/bin/Commilitia Drop.dmg'
    codesign --force --timestamp --sign "$CDROP_DEVID_IDENTITY" 'desktop/build/bin/Commilitia Drop.dmg'
    xcrun notarytool submit 'desktop/build/bin/Commilitia Drop.dmg' --key "$CDROP_ASC_KEY_PATH" --key-id "$CDROP_ASC_KEY_ID" --issuer "$CDROP_ASC_ISSUER_ID" --wait
    xcrun stapler staple 'desktop/build/bin/Commilitia Drop.dmg'
    xcrun stapler validate 'desktop/build/bin/Commilitia Drop.dmg'
    spctl --assess --type execute --verbose=2 'desktop/build/bin/Commilitia Drop.app'
    spctl --assess --type open --context context:primary-signature --verbose=2 'desktop/build/bin/Commilitia Drop.dmg'
    rm -f 'desktop/build/bin/Commilitia Drop.app.zip'

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

# 拉取品牌字标字体 Fredoka（logo / Wordmark 用，不入库——虽为开源 OFL 仍统一从 Google Fonts 拉，
# 保持仓库精简）。幂等：已存在则跳过。ios-sim-build / ios-device 构建前已 chain 本步。前置：curl；造
# Fredoka 静态实例需 python3 + fonttools（python3 -m pip install --user fonttools）。UI 界面字体已改用
# 系统原生字体（不再拉 Orbit Gothic / Maple Mono）；见 ios/CDrop/Shared/Fonts/README.md。
ios-fonts:
    mkdir -p ios/CDrop/Shared/Fonts
    [ -f ios/CDrop/Shared/Fonts/Fredoka-SemiBold.ttf ] || just ios-fonts-fredoka

# Fredoka 字标：从 Google Fonts 变量字体实例化出静态 SemiBold（wght=600, wdth=100）。
ios-fonts-fredoka:
    curl -fsSL "https://raw.githubusercontent.com/google/fonts/main/ofl/fredoka/Fredoka%5Bwdth%2Cwght%5D.ttf" -o /tmp/Fredoka-VF.ttf
    python3 -m fontTools.varLib.instancer /tmp/Fredoka-VF.ttf wght=600 wdth=100 -o ios/CDrop/Shared/Fonts/Fredoka-SemiBold.ttf --update-name-table
    rm -f /tmp/Fredoka-VF.ttf

# 模拟器编译验证（无需签名 / Apple 账号）：拉字体 + xcodegen + xcodebuild iphonesimulator。原生数据面
# 引擎走 SPM 的 libwebrtc（首次构建自动拉取 WebRTC.xcframework），无需预构建步骤。用于改动自检。
ios-sim-build:
    just ios-fonts
    cd ios/CDrop && xcodegen generate
    cd ios/CDrop && xcodebuild -project CommilitiaDrop.xcodeproj -scheme CommilitiaDrop -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' -derivedDataPath build/DD build

# 内部：生成工程 + 解析 SPM 依赖 + 补齐 macOS WebRTC 头。stasel/WebRTC 149 的原生 macOS 切片随包
# 只带 umbrella、缺全部子头（`import WebRTC` 编不过；二进制有效），须从 ios 切片补齐，见
# scripts/patch-macos-webrtc-headers.sh。mac-build / mac-test 共用；须 resolve 之后 build 之前跑。
mac-prep:
    cd ios/CDrop && xcodegen generate
    cd ios/CDrop && xcodebuild -project CommilitiaDrop.xcodeproj -scheme CommilitiaDropMac -sdk macosx -derivedDataPath build/DD-mac -resolvePackageDependencies
    bash ios/CDrop/scripts/patch-macos-webrtc-headers.sh ios/CDrop/build/DD-mac

# macOS 原生迁移候选的本地编译（ad-hoc 签名，无需 Apple 账号），仅供开发验证，不是正式
# 客户端或分发入口。正式 macOS 客户端仍由 desktop-build-mac 构建；只有完成功能对等、三语、
# 签名扩展与真机验收后才允许切换。候选产物位于 build/DD-mac/Build/Products/Debug/
# CommilitiaDropMac.app。
mac-build: mac-prep
    cd ios/CDrop && xcodebuild -project CommilitiaDrop.xcodeproj -scheme CommilitiaDropMac -sdk macosx -destination 'platform=macOS' -derivedDataPath build/DD-mac -disableAutomaticPackageResolution build

# 原生数据面 macOS 冒烟（P0 闸）：跑 CommilitiaDropMacTests 环回端到端测试——两个 LibWebRtcEngine
# 同进程交叉连，20MB 逐字节验证 libwebrtc macOS 切片上线协议闭环。证实原生数据面在 Mac 可用。
mac-test: mac-prep
    cd ios/CDrop && xcodebuild test -project CommilitiaDrop.xcodeproj -scheme CommilitiaDropMac -sdk macosx -destination 'platform=macOS' -derivedDataPath build/DD-mac -disableAutomaticPackageResolution

# 真机构建 + 装机（自动 provisioning，经 ASC API Key）。必须把
# CDROP_APPLE_DEVELOPMENT_IDENTITY 设为钥匙串内既有 Apple Development 证书的 SHA-1；构建前
# 先验证该身份存在，再将其固定传给 xcodebuild，不允许以“自动签名”为由切换或新建证书。
# -allowProvisioningUpdates 只用于登记设备、更新能力与 profile。模拟器构建不需这些。
# 用法：just ios-device <设备UDID>（UDID 见 just ios-devices）。全程不使用 Xcode GUI。
ios-device udid:
    [ -n "$CDROP_TEAM_ID" ] && [ -n "$CDROP_ASC_KEY_PATH" ] && [ -n "$CDROP_ASC_KEY_ID" ] && [ -n "$CDROP_ASC_ISSUER_ID" ] && [ -n "$CDROP_APPLE_DEVELOPMENT_IDENTITY" ] || { echo "缺 .env（CDROP_TEAM_ID / CDROP_ASC_KEY_PATH / CDROP_ASC_KEY_ID / CDROP_ASC_ISSUER_ID / CDROP_APPLE_DEVELOPMENT_IDENTITY）——见 ios/CDrop/REALDEVICE.md"; exit 1; }
    security find-identity -v -p codesigning | rg -F "$CDROP_APPLE_DEVELOPMENT_IDENTITY"
    just ios-fonts
    cd ios/CDrop && xcodegen generate
    cd ios/CDrop && xcodebuild -project CommilitiaDrop.xcodeproj -scheme CommilitiaDrop -configuration Debug -destination "platform=iOS,id={{udid}}" -derivedDataPath build/DD-device -allowProvisioningUpdates -authenticationKeyPath "$CDROP_ASC_KEY_PATH" -authenticationKeyID "$CDROP_ASC_KEY_ID" -authenticationKeyIssuerID "$CDROP_ASC_ISSUER_ID" DEVELOPMENT_TEAM="$CDROP_TEAM_ID" CODE_SIGN_STYLE=Automatic CODE_SIGN_IDENTITY="$CDROP_APPLE_DEVELOPMENT_IDENTITY" build
    xcrun devicectl device install app --device {{udid}} ios/CDrop/build/DD-device/Build/Products/Debug-iphoneos/CommilitiaDrop.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 .
