_default:
    just -l

set shell := ["bash", "-cu"]

repo_dir := justfile_directory()

# ── Build ───────────────────────────────────────────────────────────────────

# Build artifacts (depends on ENV_MODE)
build:
    #!/usr/bin/env bash
    set -euo pipefail
    set -a; source "{{ repo_dir }}/env/.env"; set +a
    echo "=== Build (ENV_MODE=${ENV_MODE:-dev}) ==="
    if [ "${ENV_MODE:-dev}" = "prod" ]; then
        exec "{{ repo_dir }}/scripts/build-prod.sh"
    else
        exec "{{ repo_dir }}/scripts/build-dev.sh"
    fi

# Run database migrations
migrate:
    #!/usr/bin/env bash
    set -euo pipefail
    set -a; source "{{ repo_dir }}/env/.env"; set +a
    cd "{{ repo_dir }}/packages/server"
    bunx drizzle-kit migrate

# ── Run ─────────────────────────────────────────────────────────────────────

# Stop the application and clean up dev processes
stop:
    #!/usr/bin/env bash
    set -euo pipefail
    set -a; source "{{ repo_dir }}/env/.env"; set +a
    echo "=== Stop (ENV_MODE=${ENV_MODE:-dev}) ==="
    if [ "${ENV_MODE:-dev}" = "prod" ]; then
        podman compose -f "{{ repo_dir }}/compose/compose.prod.yml" down
    else
        echo "Stopping dev processes..."
        # Kill anything listening on the server and Vite ports
        fuser -k 3000/tcp 2>/dev/null || true
        for port in $(seq 5173 5180); do
            fuser -k ${port}/tcp 2>/dev/null || true
        done
        # Fallback: kill any remaining bun/node processes from this project
        pkill -f "bun run --watch src/index.ts" 2>/dev/null || true
        pkill -f "node.*vite" 2>/dev/null || true
        echo "Stopping Postgres..."
        podman compose -f "{{ repo_dir }}/compose/compose.dev.yml" down
        echo "All stopped."
    fi

# Start the application (depends on ENV_MODE)
run:
    #!/usr/bin/env bash
    set -euo pipefail
    set -a; source "{{ repo_dir }}/env/.env"; set +a
    echo "=== Run (ENV_MODE=${ENV_MODE:-dev}) ==="
    if [ "${ENV_MODE:-dev}" = "prod" ]; then
        podman compose -f "{{ repo_dir }}/compose/compose.prod.yml" up -d
    else
        # Kill any leftover dev processes on target ports
        fuser -k 3000/tcp 2>/dev/null || true
        for port in $(seq 5173 5180); do
            fuser -k ${port}/tcp 2>/dev/null || true
        done
        podman compose -f "{{ repo_dir }}/compose/compose.dev.yml" up -d

        # Wait for Postgres to accept connections
        for i in $(seq 1 30); do
            if podman exec splint-postgres pg_isready -U splint -d splint_dev >/dev/null 2>&1; then
                echo "Postgres is ready."
                break
            fi
            echo "  waiting for Postgres... ($i/30)"
            sleep 1
        done

        # Run migrations
        cd "{{ repo_dir }}/packages/server"
        bunx drizzle-kit migrate
        cd "{{ repo_dir }}"

        echo "Postgres running on localhost:5432"
        exec bun --filter '*' dev
    fi

# ── Test ────────────────────────────────────────────────────────────────────

# Run unit tests
test:
    bun --filter '*' test

# ── Typecheck ───────────────────────────────────────────────────────────────

# Typecheck all TypeScript packages
typecheck:
    bun --filter '*' tsc --noEmit

# ── Lint ────────────────────────────────────────────────────────────────────

# Run linter and formatter (Biome)
lint:
    biome check .
    biome format --write .

# ── Backup ──────────────────────────────────────────────────────────────────

# Dump database backup (plain SQL, gzipped)
# Default output: backups/postgres-YYYY-MM-DD.sql.gz
backup filepath="":
    #!/usr/bin/env bash
    set -euo pipefail
    set -a; source "{{ repo_dir }}/env/.env"; set +a
    out="${1:-{{ repo_dir }}/backups/postgres-$(date +%Y-%m-%d).sql.gz}"
    mkdir -p "$(dirname "$out")"
    db_name="${DATABASE_URL##*/}"
    db_user="${DATABASE_URL#*://}"; db_user="${db_user%%:*}"
    db_pass="${DATABASE_URL#*://}"; db_pass="${db_pass#*:}"; db_pass="${db_pass%%@*}"
    echo "Backing up ${db_name} to ${out}..."
    podman exec -e PGPASSWORD="${db_pass}" splint-postgres \
        pg_dump -U "${db_user}" -d "${db_name}" --no-owner --no-acl \
        | gzip > "${out}"
    echo "Backup: ${out} ($(wc -c < "${out}") bytes)"

# ── Restore ─────────────────────────────────────────────────────────────────

# Restore a database backup (plain SQL, gzipped)
# Usage: just restore backups/postgres-YYYY-MM-DD.sql.gz
restore file:
    #!/usr/bin/env bash
    set -euo pipefail
    set -a; source "{{ repo_dir }}/env/.env"; set +a
    if [ ! -f "{{ file }}" ]; then
        echo "File not found: {{ file }}"
        exit 1
    fi
    db_name="${DATABASE_URL##*/}"
    db_user="${DATABASE_URL#*://}"; db_user="${db_user%%:*}"
    db_pass="${DATABASE_URL#*://}"; db_pass="${db_pass#*:}"; db_pass="${db_pass%%@*}"
    echo "Restoring ${db_name} from {{ file }}..."
    gunzip -c "{{ file }}" | podman exec -i -e PGPASSWORD="${db_pass}" splint-postgres \
        psql -U "${db_user}" -d "${db_name}"
    echo "Restore complete."
