#!/usr/bin/make -f
export DH_VERBOSE = 1
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/buildflags.mk

export VERBOSE = yes

# Bypass ccache
export CCACHE_DISABLE = 1
export CCACHE_TEMPDIR = ${CURDIR}/debian/ccachetmp

# Set locale for reproducible builds
export LC_ALL = C

# Ensure packages build with no Internet access
export http_proxy=127.0.0.1:9
export https_proxy=127.0.0.1:9

# BAZEL_CXXOPTS and BAZEL_LINKOPTS take a list of flags seperated by colon
export space = $() $()
export BAZEL_CXXOPTS = $(subst $(space),:,-std=c++0x ${CPPFLAGS} ${CXXFLAGS})
export BAZEL_LINKOPTS = $(subst $(space),:,-lstdc++ -lm ${LDFLAGS})

%:
	dh $@

override_dh_auto_build:
	# Copy bazel source tree to a writable location
	mkdir -p build-tree
	cp -r /usr/src/bazel-bootstrap/* build-tree/

	# Copy mock generator and templates from our debian/ to build-tree/debian/
	mkdir -p build-tree/debian
	cp debian/generate_mock_repos.py build-tree/debian/
	cp -r debian/mock_repos build-tree/debian/

	# Delete lockfile to avoid GSON crash
	rm -f build-tree/MODULE.bazel.lock

	# Apply patches to build-tree
	patch -p1 -d build-tree < debian/patches-bazel/remove_graalvm.patch
	patch -p1 -d build-tree < debian/patches-bazel/jacoco_0.8.14_compat.patch
	patch -p1 -d build-tree < debian/patches-bazel/disable_errorprone.patch
	patch -p1 -d build-tree < debian/patches-bazel/jacoco_agent_rt.patch

	# Overwrite jarjar BUILD to use system jarjar
	cp debian/bootstrap-resources/BUILD.jarjar build-tree/third_party/jarjar/BUILD

	# Symlink system jarjar
	ln -s /usr/share/java/jarjar.jar build-tree/third_party/jarjar/jarjar.jar

	# Run mock generator to create the directory structure and other mocks
	cd build-tree && python3 debian/generate_mock_repos.py

	# Compile bootstrap tools from source
	./debian/compile_ijar.sh build-tree build-tree/mock_repos/remote_java_tools_linux/ijar_bin
	./debian/compile_singlejar.sh build-tree build-tree/mock_repos/remote_java_tools_linux/singlejar_bin
	./debian/compile_javabuilder.sh build-tree build-tree/mock_repos/remote_java_tools/JavaBuilder_deploy.jar

	# Copy/symlink compiled tools to other mock locations
	cp build-tree/mock_repos/remote_java_tools_linux/ijar_bin build-tree/mock_repos/remote_java_tools/ijar_bin
	cp build-tree/mock_repos/remote_java_tools_linux/singlejar_bin build-tree/mock_repos/remote_java_tools/singlejar_bin
	cp build-tree/mock_repos/remote_java_tools/JavaBuilder_deploy.jar build-tree/mock_repos/remote_java_tools_linux/JavaBuilder_deploy.jar

	# Use JavaBuilder as VanillaJavaBuilder for bootstrap
	cp build-tree/mock_repos/remote_java_tools/JavaBuilder_deploy.jar build-tree/mock_repos/remote_java_tools/VanillaJavaBuilder_deploy.jar
	cp build-tree/mock_repos/remote_java_tools/JavaBuilder_deploy.jar build-tree/mock_repos/remote_java_tools_linux/VanillaJavaBuilder_deploy.jar
	# Use system turbine for bootstrap
	ln -sf /usr/share/java/turbine.jar build-tree/mock_repos/remote_java_tools/TurbineDirect_deploy.jar
	ln -sf /usr/share/java/turbine.jar build-tree/mock_repos/remote_java_tools_linux/TurbineDirect_deploy.jar

	# Dummy files for targets that are not used but must exist
	cp build-tree/mock_repos/remote_java_tools_linux/ijar_bin build-tree/mock_repos/remote_java_tools/turbine_direct_graal_bin
	cp build-tree/mock_repos/remote_java_tools_linux/ijar_bin build-tree/mock_repos/remote_java_tools_linux/turbine_direct_graal_bin
	cp build-tree/mock_repos/remote_java_tools_linux/ijar_bin build-tree/mock_repos/remote_java_tools/one_version_tool_bin
	cp build-tree/mock_repos/remote_java_tools_linux/ijar_bin build-tree/mock_repos/remote_java_tools_linux/one_version_tool_bin

	# Dummy jars for other targets
	touch build-tree/mock_repos/remote_java_tools/jacoco_coverage_runner_deploy.jar
	touch build-tree/mock_repos/remote_java_tools_linux/jacoco_coverage_runner_deploy.jar
	touch build-tree/mock_repos/remote_java_tools/Runner_deploy.jar
	touch build-tree/mock_repos/remote_java_tools_linux/Runner_deploy.jar
	touch build-tree/mock_repos/remote_java_tools/GenClass_deploy.jar
	touch build-tree/mock_repos/remote_java_tools_linux/GenClass_deploy.jar
	touch build-tree/mock_repos/remote_java_tools/xmldoclet_deploy.jar
	touch build-tree/mock_repos/remote_java_tools_linux/xmldoclet_deploy.jar
	touch build-tree/mock_repos/remote_java_tools/javac-9+181-rxtx.jar
	touch build-tree/mock_repos/remote_java_tools_linux/javac-9+181-rxtx.jar

	# Dynamically add overrides to .bazelrc
	for mod in $$(ls build-tree/mock_repos); do \
		if [ -f build-tree/mock_repos/$${mod}/MODULE.bazel ]; then \
			echo "build --override_module=$${mod}=%workspace%/mock_repos/$${mod}" >> build-tree/.bazelrc; \
		fi; \
	done
	echo "build --override_repository=rules_java~~toolchains~remote_java_tools=%workspace%/mock_repos/remote_java_tools" >> build-tree/.bazelrc
	echo "build --override_repository=rules_java~~toolchains~remote_java_tools_linux=%workspace%/mock_repos/remote_java_tools_linux" >> build-tree/.bazelrc
	echo "build --override_repository=rules_java~~toolchains~remotejdk11_linux=%workspace%/mock_repos/remotejdk11_linux" >> build-tree/.bazelrc
	echo "build --override_repository=rules_java~~toolchains~remotejdk17_linux=%workspace%/mock_repos/remotejdk17_linux" >> build-tree/.bazelrc
	echo "build --override_repository=rules_java~~toolchains~remotejdk21_linux=%workspace%/mock_repos/remotejdk21_linux" >> build-tree/.bazelrc

	# Setup symlinks for missing third-party jars
	mkdir -p build-tree/third_party/asm
	ln -s /usr/share/java/asm.jar build-tree/third_party/asm/asm-9.6.jar
	ln -s /usr/share/java/asm-tree.jar build-tree/third_party/asm/asm-tree-9.6.jar
	ln -s /usr/share/java/asm-commons.jar build-tree/third_party/asm/asm-commons-9.6.jar

	# Setup symlinks and dummy files for Jacoco
	mkdir -p build-tree/third_party/java/jacoco
	ln -s /usr/share/java/org.jacoco.agent.jar build-tree/third_party/java/jacoco/jacocoagent-0.8.11.jar
	ln -s /usr/share/java/org.jacoco.core.jar build-tree/third_party/java/jacoco/org.jacoco.core-0.8.11.jar
	ln -s /usr/share/java/org.jacoco.report.jar build-tree/third_party/java/jacoco/org.jacoco.report-0.8.11.jar
	touch build-tree/third_party/java/jacoco/LICENSE

	# Setup symlinks and dummy files for Proguard
	mkdir -p build-tree/third_party/java/proguard/proguard6.2.2/docs
	mkdir -p build-tree/third_party/java/proguard/proguard6.2.2/lib
	ln -s /usr/share/java/proguard.jar build-tree/third_party/java/proguard/proguard6.2.2/lib/proguard.jar
	touch build-tree/third_party/java/proguard/proguard6.2.2/docs/GPL.md


	# Build the targets inside the copy
	cd build-tree && bazel \
		--output_user_root=/tmp/bazel-debian-build \
		build \
		--lockfile_mode=off \
		--spawn_strategy=local \
		--java_header_compilation=false \
		--java_runtime_version=local_jdk \
		--tool_java_runtime_version=local_jdk \
		--javabase=@bazel_tools//tools/jdk:local_jdk \
		--host_javabase=@bazel_tools//tools/jdk:local_jdk \
		--verbose_failures \
		--subcommands \
		--compilation_mode=dbg \
		--define=distribution=debian \
		//src:java_tools_zip \
		//src:java_tools_prebuilt_zip || ( \
			echo "=== BUILD FAILED, printing params files ==="; \
			find bazel-out/ -name "*JarOwner*.params" -o -name "*statistics*.params" -o -name "*JacocoCoverageLib*.params" | while read f; do \
				echo "=== $$f ==="; \
				cat "$$f"; \
			done; \
			exit 1 \
		)

	# Copy the outputs back
	cp build-tree/bazel-bin/src/java_tools.zip debian/
	cp build-tree/bazel-bin/src/java_tools_prebuilt.zip debian/

override_dh_auto_test:
	dh_auto_test
	# Test the compiled JavaBuilder
	echo "DEBUG: Running manual test of JavaBuilder..."
	echo "public class Test {}" > build-tree/Test.java
	java -jar build-tree/mock_repos/remote_java_tools/JavaBuilder_deploy.jar \
		--output build-tree/Test.jar \
		--sources build-tree/Test.java
	echo "DEBUG: Manual test of JavaBuilder successful!"

	# Debug: check if JacocoCoverageRunner.java exists
	ls -l build-tree/src/java_tools/junitrunner/java/com/google/testing/coverage/JacocoCoverageRunner.java || true
	echo "DEBUG: Listing system ASM jars:"
	ls -l /usr/share/java/asm* || true
	echo "DEBUG: Listing system Jacoco jars:"
	ls -l /usr/share/java/*jacoco* || true

	# Debug: list contents of the zip files
	echo "=== java_tools.zip ==="
	python3 -m zipfile -l debian/java_tools.zip
	echo "=== java_tools_prebuilt.zip ==="
	python3 -m zipfile -l debian/java_tools_prebuilt.zip

override_dh_auto_install:
	# Extract prebuilt tools for dh_install
	mkdir -p debian/tmp/usr/share/bazel/tools/java_tools
	mkdir -p debian/tmp_prebuilt
	unzip -q debian/java_tools_prebuilt.zip -d debian/tmp_prebuilt
	cp debian/tmp_prebuilt/java_tools/ijar/ijar debian/tmp/usr/share/bazel/tools/java_tools/
	cp debian/tmp_prebuilt/java_tools/src/tools/singlejar/singlejar_local debian/tmp/usr/share/bazel/tools/java_tools/singlejar
	chmod 755 debian/tmp/usr/share/bazel/tools/java_tools/ijar debian/tmp/usr/share/bazel/tools/java_tools/singlejar
	rm -rf debian/tmp_prebuilt

	# Extract jars for dh_install
	mkdir -p debian/tmp_jars
	unzip -q debian/java_tools.zip -d debian/tmp_jars
	cp debian/tmp_jars/java_tools/*.jar debian/tmp/usr/share/bazel/tools/java_tools/
	# Remove the packaged turbine jar and replace with symlink to system one
	rm -f debian/tmp/usr/share/bazel/tools/java_tools/turbine_direct_binary_deploy.jar
	ln -sf /usr/share/java/turbine.jar debian/tmp/usr/share/bazel/tools/java_tools/turbine_direct_binary_deploy.jar
	# Fix permissions, excluding the symlink
	find debian/tmp/usr/share/bazel/tools/java_tools/ -type f -name "*.jar" -exec chmod 644 {} +
	rm -rf debian/tmp_jars

execute_before_dh_auto_clean:
	rm -rf build-tree
	rm -f debian/java_tools.zip
	rm -f debian/java_tools_prebuilt.zip
