# GitData 本地开发入口（Windows / macOS / Linux）。
#
# Windows：直接在 Windows 上跑 Rust/前端，依赖服务（PostgreSQL / Redis / RustFS）
#          由 WSL(Ubuntu) 的 systemd 托管（just infra）。
# macOS/Linux：原生跑 Rust/前端，依赖服务由 docker compose 托管（just infra）。
#
# 配置沿用 config/local/（gitignore）。首次使用：
#   just check -> just infra -> just build -> just up
# 常用：just up / just down / just status / just tail apihost
#
# 二进制目录跟随 cargo 的 CARGO_TARGET_DIR（just build 与 just up 一致读同一个变量）：
#   CARGO_TARGET_DIR=/tmp/app just up
# 日志 / pid / 本地 git 仓库仍固定在 target/dev，不随 CARGO_TARGET_DIR 搬家。
#
# 依赖工具：cargo、ssh-keygen；Windows 额外需要 WSL 的 Ubuntu 发行版，
# macOS/Linux 额外需要 docker + docker compose。
# 需要 just >= 1.21。

set shell := ["bash", "-cu"]
set windows-shell := ["powershell.exe", "-NoLogo", "-NoProfile", "-Command"]

root := justfile_directory()
dev := if os() == "windows" {
    root + "\\scripts\\dev.ps1"
} else {
    root + "/scripts/dev.sh"
}
# PowerShell 调用脚本需要 & 前缀；POSIX shell 直接执行
invoke := if os() == "windows" { "& " } else { "" }

# 查看服务状态（默认）
status:
    @{{ invoke }}"{{ dev }}" status

# 自检：工具链 / 依赖服务 / 后端二进制
check:
    @{{ invoke }}"{{ dev }}" check

# 启动依赖服务：PostgreSQL / Redis / RustFS(S3)
infra:
    @{{ invoke }}"{{ dev }}" infra

# 停止依赖服务
infra-down:
    @{{ invoke }}"{{ dev }}" infra-down

# 同步数据库 schema
migrate:
    @{{ invoke }}"{{ dev }}" migrate

# 事件系统（socket.io 通道 + RocketMQ 消费 + 内部 RPC）
# 需要 Redis；single/consumer 模式还依赖 RocketMQ，RPC 依赖 apihost 已启动。
event mode="single":
    @cargo run -p app -- event --mode {{mode}}

# 只跑 socket 节点（不消费 MQ）
event-actor:
    @cargo run -p app -- event --mode actor

# 只跑 RocketMQ 消费节点
event-consumer:
    @cargo run -p app -- event --mode consumer

# 构建全部后端二进制
# 遵循 CARGO_TARGET_DIR；just up 从同一目录取二进制。
build:
    @cargo build --bins

# 构建全部后端 release 二进制
build-release:
    @cargo build --release --bins

# 启动全部服务（后端）
# 二进制目录 = $CARGO_TARGET_DIR/debug（未设置则 target/debug）。
up *svc='':
    @{{ invoke }}"{{ dev }}" up {{ svc }}

# 仅启动后端服务（apihost）
up-backend:
    @{{ invoke }}"{{ dev }}" up backends

# 停止全部服务，或指定：just down apihost
down *svc='':
    @{{ invoke }}"{{ dev }}" down {{ svc }}

# 重启全部服务，或指定：just restart apihost
restart *svc='':
    @{{ invoke }}"{{ dev }}" restart {{ svc }}

# 最近日志：just logs / just logs apihost
logs *svc="apihost":
    @{{ invoke }}"{{ dev }}" logs {{ svc }}

# 跟踪日志：just tail / just tail apihost
tail svc="apihost":
    @{{ invoke }}"{{ dev }}" logs {{ svc }} -f

# 进入 PostgreSQL 交互终端
psql:
    @{{ invoke }}"{{ dev }}" psql

# 进入 redis-cli 交互终端
redis:
    @{{ invoke }}"{{ dev }}" redis

# URL 速查
urls:
    @echo "  app        http://127.0.0.1:7051    (Swagger: /api/docs)"
    @echo "  event      ws://127.0.0.1:7031/socket.io   rpc: 127.0.0.1:7032"
    @echo "  apihost-rpc 127.0.0.1:7052 (internal.v1)"

# 重新生成 openapi.json 与 packages/apiclient 客户端
openapi:
    @cargo run -p app -- openapi && pnpm exec orval

# 校验 openapi 与 packages/apiclient 是否都与源码一致
openapi-check:
    @bash scripts/contract-check.sh

# cargo fmt --all
fmt:
    @cargo fmt --all

# cargo clippy 全 workspace
clippy:
    @cargo clippy --workspace --all-targets --all-features

# 清理构建产物
clean:
    @cargo clean
# 登录前端随 app 发布。
identity-web-build:
    pnpm install --frozen-lockfile && pnpm build

identity-web-dev:
    pnpm dev
