#!/bin/sh -e
# Copyright 2025 sysmocom - s.f.m.c. GmbH
# SPDX-License-Identifier: GPL-3.0-or-later
# This script downloads all dependencies of PyHSS from the python package
# index, either as binary package for all python versions and CPU architectures
# we care about, or as source package depending on what is available.

check_cwd() {
	if ! [ -e services/hssService.py ]; then
		echo "ERROR: run this script from the PyHSS directory"
		exit 1
	fi
	if [ -d debian/deps ]; then
		echo "ERROR: debian/deps exists already!"
		exit 1
	fi
}

download_deps() {
	local srcpkgs=_temp/requirements-source.txt
	local binpkgs=_temp/requirements-binary.txt
	local py_ver
	local python_versions="
		3.11
		3.12
		3.13
		3.14
	"
	# See e.g. https://pypi.org/project/SQLAlchemy/#files
	local platform
	local platforms="
		manylinux_2_17_aarch64
		manylinux_2_17_x86_64
	"

	rm -rf _temp
	mkdir _temp

	while IFS= read -r line; do
	        case "$line" in
			# These packages are only available as sources
	                mongo*|pymongo*|mysqlclient*|pysctp*|pycryptodome=*)
				echo "$line" >>"$srcpkgs"
				;;
			# The rest is available as binary packages. This is
			# preferred as dependencies for building some of these
			# are not always available in the target distributions
			# (e.g. pydantic-core is written in rust and tooling
			# for building python + rust is not in debian 12).
			*)
				echo "$line" >>"$binpkgs"
				;;
		esac
	done < "requirements.txt"

	# Build system dependencies must also be installed as we will build
	# offline with --no-index and pip won't use system libraries:
	# https://github.com/pypa/pip/issues/5696
	echo "setuptools" >>"$binpkgs"
	echo "wheel" >>"$binpkgs"
	echo "hatchling" >>"$binpkgs"

	echo ":: Downloading source packages"
	pip download \
		--dest debian/deps \
		--no-binary=:all: \
		-r "$srcpkgs"

	for py_ver in $python_versions; do
		for platform in $platforms; do
			echo ":: Downloading binary packages (python $py_ver, platform $platform)"
			local binpkgs_extra=""

			# Redis depends on async-timeout, which has been upstreamed
			# into Python 3.11+. This means "pip download" may not download
			# it if it runs with a more recent python version, but older
			# distros (debian 12) will need it.
			if [ "$py_ver" = "3.11" ]; then
				binpkgs_extra="async-timeout"
			fi

			pip download \
				--dest debian/deps \
				--python-version "$py_ver" \
				--platform "$platform" \
				--only-binary=:all: \
				-r "$binpkgs" \
				$binpkgs_extra
		done
	done

	rm -r _temp
}

check_cwd
download_deps

echo ":: Success"
