#!/usr/bin/env bash
# Export pinned Python requirements from sdk/python/uv.lock.
#
# Usage:
#   ./scripts/deps/export-python-requirements.sh
#
# Writes:
#   sdk/python/requirements.txt      production/runtime manifest (no dev groups)
#   sdk/python/requirements-dev.txt  dev-group manifest (build, test, lint)
#
# Regenerated by scripts/publish/sync-version.sh after uv lock refresh.
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
PY_DIR="${REPO_ROOT}/sdk/python"

# shellcheck disable=SC1091
source "${SCRIPT_DIR}/../lib/shorten-paths.sh"
export SHORTEN_ROOT="${REPO_ROOT}"

write_if_changed() {
	local file="$1"
	local tmp="$2"
	if cmp -s "${tmp}" "${file}"; then
		rm -f "${tmp}"
	else
		mv "${tmp}" "${file}"
	fi
}

die() {
	printf 'error: %s\n' "$*" | shorten_paths >&2
	exit 1
}

require_cmd() {
	command -v "$1" >/dev/null 2>&1 || die "missing required command: $1"
}

require_cmd uv
[[ -f "${PY_DIR}/pyproject.toml" ]] ||
	die "missing pyproject.toml: ${PY_DIR}/pyproject.toml"
[[ -f "${PY_DIR}/uv.lock" ]] ||
	die "missing uv.lock (run: uv lock --project ${PY_DIR})"

prod_tmp="$(mktemp)"
dev_tmp="$(mktemp)"
trap 'rm -f "${prod_tmp}" "${dev_tmp}"' EXIT

(
	cd "${PY_DIR}"
	if command -v rtk >/dev/null 2>&1; then
		rtk uv export --frozen --no-dev --no-header --output-file "${prod_tmp}"
		rtk uv export --frozen --only-group dev --no-header --output-file "${dev_tmp}"
	else
		uv export --frozen --no-dev --no-header --output-file "${prod_tmp}"
		uv export --frozen --only-group dev --no-header --output-file "${dev_tmp}"
	fi
)

write_if_changed "${PY_DIR}/requirements.txt" "${prod_tmp}"
write_if_changed "${PY_DIR}/requirements-dev.txt" "${dev_tmp}"
trap - EXIT

cat <<EOF | shorten_paths
exported python requirements from ${PY_DIR}/uv.lock:
  ${PY_DIR}/requirements.txt
  ${PY_DIR}/requirements-dev.txt
EOF
