POSTGRES_URL := "postgresql://tachi:tachi@tachi-postgres"
DEFAULT_DB := "tachi_dev"

# Open a psql shell against the local dev Postgres instance.
db POSTGRES_DB=DEFAULT_DB:
	psql "{{POSTGRES_URL}}/{{POSTGRES_DB}}"

db-cheap-reset POSTGRES_DB=DEFAULT_DB:
	#!/bin/bash
	set -euo pipefail
	# Disconnect all sessions using this DB so DROP DATABASE can succeed.
	psql "{{POSTGRES_URL}}/postgres" -v ON_ERROR_STOP=1 -c \
		"SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '{{POSTGRES_DB}}'"
	export POSTGRES_URL="{{POSTGRES_URL}}/{{POSTGRES_DB}}"
	tachidb database drop
	tachidb database create
	tachidb migrate run

# Drop and recreate the database so migrations can be re-applied from scratch.
db-reset POSTGRES_DB=DEFAULT_DB:
	#!/bin/bash
	set -euo pipefail

	just db-cheap-reset "{{POSTGRES_DB}}"
	just db-load-seeds "{{POSTGRES_DB}}"

# Show the status of all applied (and failed) migrations.
db-migrate-status POSTGRES_DB=DEFAULT_DB:
	psql "{{POSTGRES_URL}}/{{POSTGRES_DB}}" -c \
		"SELECT version, description, success, installed_on, execution_time || 'µs' AS execution_time \
		 FROM \"_migration\" \
		 ORDER BY version"

# Load the seeds into the database.
db-load-seeds POSTGRES_DB=DEFAULT_DB:
	#!/bin/bash
	set -euo pipefail
	cd typescript/server
	export POSTGRES_URL="{{POSTGRES_URL}}/{{POSTGRES_DB}}"
	export SEEDS_DIR="../../db/seeds"
	if [[ -z "${SEEDS_COMMIT_HASH:-}" ]]; then
		SEEDS_COMMIT_HASH="$(git rev-parse HEAD 2>/dev/null || echo local)"
	fi
	export SEEDS_COMMIT_HASH
	bun run src/scripts/load-seeds-pg.ts

# Reset templatedb from migrations, then dump schema and indexes for local debugging.
db-schema: (db-cheap-reset "templatedb")
	pg_dump "{{POSTGRES_URL}}/templatedb" --schema-only --no-owner --no-acl -f db/schema.sql