set shell := ["/usr/bin/env", "bash", "-euo", "pipefail", "-c"]

[private]
default:
	@just --choose

# Run controller
[group('controller')]
run-controller $RUST_LOG="debug,h2=info,hyper_util=info,tower=info":
  cargo run --package patagia-controller -- --log-stderr

# Run controller local development
[group('controller')]
dev-controller: dev-controller-db-migrate
  watchexec --clear --restart --stop-signal INT --debounce 300ms -- just run-controller

# Run agent
run-agent $RUST_LOG="debug,h2=info,hyper_util=info,tower=info":
  cargo run --package patagia-agent

# Run agent local development
dev-agent:
  watchexec --clear --restart --stop-signal INT --debounce 300ms -- just run-agent

# Lint all source code
lint:
 cargo clippy

# Format all source code
fmt:
 nix fmt

# Update all dependencies
update: update-nix update-rust-deps

# Update rust dependencies
update-rust-deps:
  cargo upgrade --recursive
  cargo update --recursive

# Update nix flake packages
update-nix:
  nix flake update

# Find unused dependencies with cargo machete
machete:
  cargo machete

# Generate OpenAPI spec
open-api:
  cargo xtask open-api

# Update OpenAPI spec
gen-open-api:
  cargo xtask open-api > api.json

# Run all tests
check: check-nix

# check-nix
check-nix:
  nix flake check

# Run PostgreSQL for development and testing
[group('controller')]
dev-postgres:
  #!/usr/bin/env sh
  if podman ps --filter "name=patagia-postgres" --filter "status=running" -q | grep -q .; then
    exit 0
  fi
  mkdir -p "${XDG_RUNTIME_DIR}/patagia-postgres"
  podman volume exists patagia-postgres || podman volume create patagia-postgres
  podman run \
  --detach \
  --replace \
  --name patagia-postgres \
  --env POSTGRES_DB=patagia \
  --env POSTGRES_USER=patagia \
  --env POSTGRES_PASSWORD=swordfish \
  --volume patagia-postgres:/var/lib/postgresql/data \
  --volume "${XDG_RUNTIME_DIR}/patagia-postgres:/var/run/postgresql" \
  docker.io/postgres:17
  sleep 0.3

# Clean up PostgreSQL data
[group('controller')]
dev-postgres-clean:
  podman rm -f patagia-postgres || true
  podman volume rm patagia-postgres || true

# Connect to PostgreSQL with psql
[group('controller')]
dev-postgres-psql:
  podman exec -it patagia-postgres psql -U patagia

[group('controller')]
[working-directory: 'controller']
dev-controller-db-migrate: dev-postgres
  cargo sqlx migrate run

[group('controller')]
[working-directory: 'controller']
dev-controller-db-reset:
  cargo sqlx db reset -y

[group('controller')]
[working-directory: 'controller']
gen-controller-sqlx-prepare:
  cargo sqlx prepare

gen: gen-open-api gen-controller-sqlx-prepare fmt