##################################################
# 	REQUIRES:                                    #
# 	- `uv` TODO: remove this dependency          #
# 	- LLVM (Windows cross-comp only)             #
# 	- intended to be run on a Linux machine      #
#                                                #
# 	Builds the release wheels for all platforms  #
# 	using `maturin` and `zig` (`uv`              #
# 	automatically pulls in these dependencies    #
# 	through pyproject.toml dependency groups).   #
# 	LLVM needs to be installed for Windows       #
# 	cross-compilation. You can build native      #
# 	distributions with `uv build`.               #
##################################################

# TODO update version from Cargo.toml automatically
NAME := tictoc
VERSION := 0.2.1
WHEEL_DIR := target/wheels
SOURCE_FILES := src/lib.rs tictoc/__init__.py pyproject.toml Cargo.toml Cargo.lock uv.lock

.PHONY: build build-release sdist linux macos windows clean test

build:
	@uv run --dev maturin develop

build-release: test sdist linux macos windows

########## Source distribution ##########
SDIST := $(WHEEL_DIR)/$(NAME)-$(VERSION).tar.gz
sdist: $(SDIST)
$(SDIST): $(SOURCE_FILES)
	@echo "\033[1mBuilding source distribution...\033[22m"
	@uv run --dev maturin sdist

################# Linux #################
# - aarch64-unknown-linux-gnu
# - i686-unknown-linux-gnu
# - x86_64-unknown-linux-gnu
# - aarch64-unknown-linux-musl
# - i686-unknown-linux-musl
# - x86_64-unknown-linux-musl
MANYLINUX_VER_AND_ARCHS := 2_28_aarch64 2_34_i686 2_28_x86_64
MANYLINUX_WHEELS := $(foreach ARCH,$(MANYLINUX_VER_AND_ARCHS),$(WHEEL_DIR)/$(NAME)-$(VERSION)-cp38-abi3-manylinux_$(ARCH).whl)
MUSLLINUX_ARCHS := aarch64 i686 x86_64
MUSLLINUX_WHEELS := $(foreach ARCH,$(MUSLLINUX_ARCHS),$(WHEEL_DIR)/$(NAME)-$(VERSION)-cp38-abi3-musllinux_1_2_$(ARCH).whl)
MANYLINUX_ARCH_SUFFIX := -unknown-linux-gnu
MUSLLINUX_ARCH_SUFFIX := -unknown-linux-musl

linux: $(MANYLINUX_WHEELS) $(MUSLLINUX_WHEELS)

$(WHEEL_DIR)/$(NAME)-$(VERSION)-cp38-abi3-manylinux_%.whl: $(SOURCE_FILES)
	$(eval LINUX_TARGET := $(addsuffix $(MANYLINUX_ARCH_SUFFIX),$(subst 2_34_,,$(subst 2_28_,,$*))))
	@echo "\033[1mBuilding for Linux ($(LINUX_TARGET))...\033[22m"
	@rustup target add $(LINUX_TARGET)
	@uv run --dev --group cross-platform-build\
		maturin build\
		--release\
		--target $(LINUX_TARGET)\
		--compatibility pypi\
		--auditwheel repair\
		--find-interpreter\
		--zig\
		--quiet

$(WHEEL_DIR)/$(NAME)-$(VERSION)-cp38-abi3-musllinux_%.whl: $(SOURCE_FILES)
	$(eval LINUX_TARGET := $(addsuffix $(MUSLLINUX_ARCH_SUFFIX),$(subst 1_2_,,$*)))
	@echo "\033[1mBuilding for Linux ($(LINUX_TARGET))...\033[22m"
	@rustup target add $(LINUX_TARGET)
	@uv run --dev --group cross-platform-build\
		maturin build\
		--release\
		--target $(LINUX_TARGET)\
		--compatibility musllinux_1_2\
		--auditwheel repair\
		--find-interpreter\
		--zig\
		--quiet

################# macOS #################
# - aarch64-apple-darwin
# - x86_64-apple-darwin
MACOS_WHEELS := $(WHEEL_DIR)/$(NAME)-$(VERSION)-cp38-abi3-macosx_11_0_arm64.whl
MACOS_WHEELS += $(WHEEL_DIR)/$(NAME)-$(VERSION)-cp38-abi3-macosx_10_12_x86_64.whl
MACOS_ARCH_SUFFIX := -apple-darwin

macos: $(MACOS_WHEELS)

$(WHEEL_DIR)/$(NAME)-$(VERSION)-cp38-abi3-macosx_%.whl: $(SOURCE_FILES)
	$(eval MACOS_VER_AND_TARGET := $(subst 10_12_,10.12 ,$(subst 11_0_,11.0 ,$(subst arm64,aarch64,$(addsuffix $(MACOS_ARCH_SUFFIX),$*)))))
	$(eval MACOS_VER = $(word 1,$(MACOS_VER_AND_TARGET)))
	$(eval MACOS_TARGET = $(word 2,$(MACOS_VER_AND_TARGET)))
	@echo "\033[1mBuilding for MacOS (>=$(MACOS_VER), $(MACOS_TARGET))...\033[22m"
	@rustup target add $(MACOS_TARGET)
	@MACOSX_DEPLOYMENT_TARGET=$(MACOS_VER)\
		uv run --dev --group cross-platform-build\
			maturin build\
			--release\
			--target $(MACOS_TARGET)\
			--auditwheel repair\
			--find-interpreter\
			--zig\
			--quiet

################ Windows ################
# - x86_64-pc-windows-msvc
# - aarch64-pc-windows-msvc
WINDOWS_ARCHS := amd64 arm64
WINDOWS_WHEELS := $(foreach ARCH,$(WINDOWS_ARCHS),$(WHEEL_DIR)/$(NAME)-$(VERSION)-cp38-abi3-win_$(ARCH).whl)
WINDOWS_ARCH_SUFFIX := -pc-windows-msvc

windows: check-llvm $(WINDOWS_WHEELS)

LLVM_VERSION := $(shell llvm-config --version 2>/dev/null)

check-llvm:
ifdef LLVM_VERSION
	@echo "Found LLVM version $(LLVM_VERSION)"
else
	$(error Windows cross-compilation requires LLVM. Consider running `apt install llvm`)
endif

$(WHEEL_DIR)/$(NAME)-$(VERSION)-cp38-abi3-win_%.whl: $(SOURCE_FILES)
	$(eval WINDOWS_TARGET := $(addsuffix $(WINDOWS_ARCH_SUFFIX),$(subst arm64,aarch64,$(subst amd64,x86_64,$*))))
	@echo "\033[1mBuilding for Windows ($(WINDOWS_TARGET))...\033[22m"
	@rustup target add $(WINDOWS_TARGET)
	@MATURIN_USE_XWIN=1\
		uv run --dev\
			maturin build\
			--release\
			--target $(WINDOWS_TARGET)\
			--auditwheel repair\
			--quiet

clean:
	@rm -rf dist/
	@rm -rf target/

# TODO generate the lib path automatically
test:
	@uv run --group test pytest tests/
	@LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:/home/andrew/.local/share/uv/python/cpython-3.14.0rc2-linux-x86_64-gnu/lib\
		cargo test --no-default-features

