# Dev entry points. `just` with no args lists them.

# The local development database. Committed offline query data (.sqlx) means
# neither CI nor a plain `cargo build` needs this to exist.
database_url := env_var_or_default("DATABASE_URL", "sqlite://dev.db")

# The full per-push gate, same as CI. Run this before pushing.
ci: fmt-check lint deps test web-check

# Formatting, checked not applied.
fmt-check:
    cargo fmt --all -- --check

# Format every Rust source.
fmt:
    cargo fmt --all

# Clippy, warnings denied.
lint:
    cargo clippy --all-targets -- -D warnings

# Unused workspace dependencies. Stable toolchain, unlike cargo-udeps.
deps:
    cargo machete

# Unit and integration tests, excluding the e2e crate.
test:
    cargo nextest run --workspace --exclude arr-e2e

# End-to-end tests. Needs a Transmission container; not part of the push gate.
e2e:
    cargo nextest run -p arr-e2e

# Frontend lint and typecheck. No-op until web/ exists (issue #6).
web-check:
    #!/usr/bin/env bash
    set -euo pipefail
    if [ ! -d web ]; then echo "web/ not present yet, skipping"; exit 0; fi
    biome ci web/
    pnpm -C web install --frozen-lockfile
    pnpm -C web exec tsc -b --noEmit

# Build the SPA and the binary that embeds it.
build:
    #!/usr/bin/env bash
    set -euo pipefail
    if [ -d web ]; then
        pnpm -C web install --frozen-lockfile
        pnpm -C web build
    fi
    cargo build --release

# Recreate the development database from an empty file.
db-reset:
    #!/usr/bin/env bash
    set -euo pipefail
    export DATABASE_URL="{{database_url}}"
    sqlx database drop -y
    sqlx database create
    sqlx migrate run --source crates/arr-db/migrations

# Refresh the committed offline query data. Run after changing any query.
db-prepare: db-reset
    #!/usr/bin/env bash
    set -euo pipefail
    export DATABASE_URL="{{database_url}}"
    cargo sqlx prepare --workspace -- --all-targets

# Advisory and licence scan. Scheduled, not part of the push gate.
audit:
    cargo deny check

# Install the tools the gate needs.
setup:
    cargo install cargo-nextest cargo-machete --locked
    cargo install sqlx-cli --no-default-features --features sqlite,rustls --locked
