zig := env_var_or_default('ZIG', 'zig')
scale := env_var_or_default('ZDS_BENCH_SCALE', '1000')

# run all local store benchmarks
all:
    {{zig}} build bench -Doptimize=ReleaseFast -- --records {{scale}} --blobs 128

# run local HTTP route benchmarks against the release server
http:
    ../tools/http_bench.sh

# pass arbitrary zds-bench args through
run *ARGS:
    {{zig}} build bench -Doptimize=ReleaseFast -- {{ARGS}}

# benchmark repo write path
write:
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario write --records {{scale}}

# benchmark indexed read paths
read:
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario read --records {{scale}}

# benchmark blob disk IO and metadata paths
blob:
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario blob --blobs 512 --blob-size 65536

# benchmark full repo CAR materialization
repo:
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario repo --records {{scale}}

# benchmark Tranquil metastore-shaped store operations
metastore callers="1" ops_per_caller="100":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario metastore --callers {{callers}} --ops-per-caller {{ops_per_caller}}

# benchmark CID-only record lookup, matching Tranquil's get_record_cid bench
get-cid callers="10" ops_per_caller="1000":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario get-cid --callers {{callers}} --ops-per-caller {{ops_per_caller}}

# benchmark record index lookup plus repo_blocks byte fetch
get-block callers="10" ops_per_caller="1000":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario get-block --callers {{callers}} --ops-per-caller {{ops_per_caller}}

# benchmark DAG-CBOR decode of a seeded record block without SQLite
decode-record callers="10" ops_per_caller="1000":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario decode-record --callers {{callers}} --ops-per-caller {{ops_per_caller}}

# benchmark DAG-CBOR decode plus JSON response rendering without SQLite
render-record callers="10" ops_per_caller="1000":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario render-record --callers {{callers}} --ops-per-caller {{ops_per_caller}}

# benchmark full com.atproto.repo.getRecord storage materialization
get-record callers="10" ops_per_caller="1000":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario get-record --callers {{callers}} --ops-per-caller {{ops_per_caller}}

# benchmark full listRecords storage materialization
list-records callers="10" ops_per_caller="1000":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario list-records --callers {{callers}} --ops-per-caller {{ops_per_caller}}

# benchmark listRecords and repo CAR materialization across synthetic repo sizes
repo-size max_records="5000":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario repo-size --records {{max_records}}

# deliberately slow large-repo lane for Paul/Jerry-shaped synthetic repositories
repo-large records="100000":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario repo-size --records {{records}}

# benchmark experimental permissioned-space storage paths
space records="1000":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario space --records {{records}}

# run the official Bluesky PDS read probe from a local atproto checkout
official-pds:
    ./run-official-pds.sh

# profile applyWrites stage timing under write concurrency
write-profile callers="10" ops_per_caller="500":
    {{zig}} build bench -Doptimize=ReleaseFast -- --scenario write-profile --callers {{callers}} --ops-per-caller {{ops_per_caller}}
