# browser-cli — task runner
# Run `just` or `just --list` to see all recipes.

# Default browser profile for `install` / quick checks
browser := "brave"

# Where `publish` builds, and where it looks up the PyPI token
dist_dir := "/tmp/dist-browser-cli"
pypi_token_entry := "api/packages/pypi"
pypi_check_url := "https://pypi.org/simple/"

# Show available recipes
default:
    @just --list

# ── Setup ──────────────────────────────────────────────────────────────

# Install Python deps + Node deps for the extension build
setup:
    uv sync
    npm ci

# Register the native messaging host for a browser (default: {{browser}})
install browser=browser:
    uv run browser-cli install {{browser}}

# ── Python ─────────────────────────────────────────────────────────────

# Run the full Python test suite
test:
    uv run pytest -q

# Run tests verbosely
testv:
    uv run pytest -v

# Run a single test file or node id, e.g. `just test-one tests/test_api.py`
test-one target:
    uv run pytest -v {{target}}

# Run tests with a coverage report
cov:
    uv run pytest --cov=browser_cli --cov-report=term-missing

# ── Extension (TypeScript / MV3) ───────────────────────────────────────

# Build the extension bundle (extension/background.js)
build:
    npm run build:extension

# Run the JS (node:test) extension tests
test-ext:
    npm run test:extension

# Full extension gate: tsc + build + node --check + JS tests
check:
    npm run check:extension

# ── Everything ─────────────────────────────────────────────────────────

# Run the complete gate: extension check + Python tests
ci: check test

# ── Release ────────────────────────────────────────────────────────────

# Show the current version
version:
    @grep -m1 '^version' pyproject.toml | cut -d'"' -f2

# Bump version in pyproject.toml AND extension/manifest.json, e.g. `just bump 0.10.5`
bump new:
    sed -i 's/^version = ".*"/version = "{{new}}"/' pyproject.toml
    sed -i 's/"version": ".*"/"version": "{{new}}"/' extension/manifest.json
    @echo "bumped to {{new}} — remember to update uv.lock (uv lock) and rebuild the extension"

# Verify both version files agree
version-check:
    @py=$(grep -m1 '^version' pyproject.toml | cut -d'"' -f2); \
     ext=$(grep -m1 '"version"' extension/manifest.json | cut -d'"' -f4); \
     if [ "$py" = "$ext" ]; then echo "ok: $py"; else echo "MISMATCH pyproject=$py manifest=$ext"; exit 1; fi

# Build and upload to PyPI. Token: UV_PUBLISH_TOKEN, else .env, else password-store.
publish: version-check
    #!/usr/bin/env bash
    set -euo pipefail
    source scripts/pypi_token.sh
    load_pypi_token "{{pypi_token_entry}}" || exit 1
    rm -rf "{{dist_dir}}"
    mkdir -p "{{dist_dir}}"
    uv build --out-dir "{{dist_dir}}"
    uv publish --check-url "{{pypi_check_url}}" "{{dist_dir}}"/*

# Same build and token path as `publish`, but uploads nothing
publish-dry: version-check
    #!/usr/bin/env bash
    set -euo pipefail
    source scripts/pypi_token.sh
    load_pypi_token "{{pypi_token_entry}}" || exit 1
    rm -rf "{{dist_dir}}"
    mkdir -p "{{dist_dir}}"
    uv build --out-dir "{{dist_dir}}"
    uv publish --dry-run --check-url "{{pypi_check_url}}" "{{dist_dir}}"/*

# ── Demos ──────────────────────────────────────────────────────────────

# Run the Python SDK demo
demo:
    uv run python examples/demo.py
