ANDROID_SDK_ROOT ?= /opt/android-sdk
ANDROID_NDK_ROOT ?= /opt/android-ndk
JAVA_HOME ?= /usr/lib/jvm/java-25-openjdk
PATH := $(JAVA_HOME)/bin:$(ANDROID_SDK_ROOT)/cmdline-tools/latest/bin:$(ANDROID_SDK_ROOT)/platform-tools:$(PATH)
APK_BUILD_IMAGE ?= keepassgo/android-apk-build:java25
APP_ID ?= org.julianfamily.keepassgo
APK_OUT ?= build/keepassgo.apk
APK_VERSION ?= 0.8.2.298
APP_VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev)
GO_LDFLAGS ?= -X git.julianfamily.org/keepassgo/internal/appui.appVersion=$(APP_VERSION)
APK_ARCH ?= arm64,amd64
ANDROID_MIN_SDK ?= 28
ANDROID_TARGET_SDK ?= 35
SIGNKEY ?=
SIGNPASS ?=
SIGNPASS_FILE ?=
RELEASE_SIGNKEY ?= $(HOME)/.config/keepassgo/android-release.keystore
RELEASE_SIGNPASS_FILE ?= $(HOME)/.config/keepassgo/android-release.pass
ARCH_PKG_DIR ?= packaging/archlinux/keepassgo-git
ARCH_PKG_TMPL ?= $(ARCH_PKG_DIR)/PKGBUILD.tmpl
ARCH_PKGBUILD ?= $(ARCH_PKG_DIR)/PKGBUILD
ARCH_PKGVER ?= $(shell printf 'r%s.%s' "$$(git rev-list --count HEAD 2>/dev/null || echo 0)" "$$(git rev-parse --short HEAD 2>/dev/null || echo dev)")
ARCH_REPO_DIR ?= $(CURDIR)
WEB_EXT ?= web-ext
FIREFOX_EXTENSION_DIR ?= build/firefox-extension
FIREFOX_EXTENSION_ARTIFACT_DIR ?= build/browser-extension

GOGIO_SIGN_FLAGS :=
ifneq ($(strip $(SIGNKEY)),)
GOGIO_SIGN_FLAGS += -signkey $(SIGNKEY)
endif
ifneq ($(strip $(SIGNPASS)),)
GOGIO_SIGN_FLAGS += -signpass $(SIGNPASS)
endif

CONTAINER_SIGNKEY_MOUNT :=
CONTAINER_SIGNPASSFILE_MOUNT :=
CONTAINER_SIGN_ARGS :=
ifneq ($(strip $(SIGNKEY)),)
CONTAINER_SIGNKEY_MOUNT += -v "$(dir $(abspath $(SIGNKEY))):$(dir $(abspath $(SIGNKEY))):ro"
CONTAINER_SIGN_ARGS += SIGNKEY="$(abspath $(SIGNKEY))"
endif
ifneq ($(strip $(SIGNPASS)),)
CONTAINER_SIGN_ARGS += SIGNPASS="$(SIGNPASS)"
endif
ifneq ($(strip $(SIGNPASS_FILE)),)
CONTAINER_SIGNPASSFILE_MOUNT += -v "$(dir $(abspath $(SIGNPASS_FILE))):$(dir $(abspath $(SIGNPASS_FILE))):ro"
CONTAINER_SIGN_ARGS += SIGNPASS_FILE="$(abspath $(SIGNPASS_FILE))"
endif

.PHONY: apk apk-local apk-release apk-container apk-container-image archlinux-pkgbuild browser-bridge mcp-server browser-extension-validate browser-extension-firefox-dir browser-extension-firefox-lint browser-extension-firefox-build browser-extension-firefox-run browser-extension-firefox-sign
apk:
	@if [ -x "$(JAVA_HOME)/bin/java" ] && "$(JAVA_HOME)/bin/java" -version 2>&1 | grep -q 'version "25'; then \
		$(MAKE) apk-local JAVA_HOME="$(JAVA_HOME)"; \
	else \
		echo "Using Dockerized Java 25 Android build because JAVA_HOME is not a working Java 25 install."; \
		$(MAKE) apk-container; \
	fi

apk-local: android/keepassgo-android.jar
	@test -x "$(JAVA_HOME)/bin/java" || { echo "JAVA_HOME must point to a working JDK install"; exit 1; }
	@test -d "$(ANDROID_SDK_ROOT)" || { echo "ANDROID_SDK_ROOT must point to an Android SDK install"; exit 1; }
	@test -d "$(ANDROID_NDK_ROOT)" || { echo "ANDROID_NDK_ROOT must point to an Android NDK install"; exit 1; }
	@test -x "$(ANDROID_SDK_ROOT)/cmdline-tools/latest/bin/sdkmanager" || { echo "Android SDK cmdline-tools are missing"; exit 1; }
	@test -d "$(ANDROID_SDK_ROOT)/platforms/android-$(ANDROID_TARGET_SDK)" || { echo "Android platform android-$(ANDROID_TARGET_SDK) is missing"; exit 1; }
	@test -d "$(ANDROID_SDK_ROOT)/build-tools" || { echo "Android build-tools are missing"; exit 1; }
	@mkdir -p "$(dir $(APK_OUT))"
	@set -eu; \
	if [ -n "$(SIGNPASS_FILE)" ]; then \
		test -f "$(SIGNPASS_FILE)" || { echo "SIGNPASS_FILE does not exist: $(SIGNPASS_FILE)"; exit 1; }; \
		export GOGIO_SIGNPASS="$$(tr -d '\r\n' < "$(SIGNPASS_FILE)")"; \
		test -n "$$GOGIO_SIGNPASS" || { echo "SIGNPASS_FILE is empty: $(SIGNPASS_FILE)"; exit 1; }; \
	fi; \
	ANDROID_HOME="$(ANDROID_SDK_ROOT)" \
	ANDROID_SDK_ROOT="$(ANDROID_SDK_ROOT)" \
	ANDROID_NDK_ROOT="$(ANDROID_NDK_ROOT)" \
	JAVA_HOME="$(JAVA_HOME)" \
	go tool gogio -target android \
		-arch $(APK_ARCH) \
		-buildmode exe \
		-appid $(APP_ID) \
		-ldflags "$(GO_LDFLAGS)" \
		$(GOGIO_SIGN_FLAGS) \
		-o $(APK_OUT) \
		-version $(APK_VERSION) \
		-minsdk $(ANDROID_MIN_SDK) \
		-targetsdk $(ANDROID_TARGET_SDK) \
		-icon internal/assets/keepassgo-icon.png \
		./cmd/keepassgo

apk-release:
	@test -f "$(RELEASE_SIGNKEY)" || { echo "Release signing key not found at $(RELEASE_SIGNKEY)"; exit 1; }
	@test -f "$(RELEASE_SIGNPASS_FILE)" || { echo "Release signing password file not found at $(RELEASE_SIGNPASS_FILE)"; exit 1; }
	@$(MAKE) apk SIGNKEY="$(abspath $(RELEASE_SIGNKEY))" SIGNPASS_FILE="$(abspath $(RELEASE_SIGNPASS_FILE))" JAVA_HOME="$(JAVA_HOME)"

apk-container: apk-container-image
	@command -v docker >/dev/null 2>&1 || { echo "docker is required for apk-container"; exit 1; }
	@test -d "$(ANDROID_SDK_ROOT)" || { echo "ANDROID_SDK_ROOT must point to an Android SDK install"; exit 1; }
	@test -d "$(ANDROID_NDK_ROOT)" || { echo "ANDROID_NDK_ROOT must point to an Android NDK install"; exit 1; }
	docker run --rm \
		-u "$$(id -u):$$(id -g)" \
		-v "$(CURDIR):$(CURDIR)" \
		-w "$(CURDIR)" \
		-v "$(ANDROID_SDK_ROOT):$(ANDROID_SDK_ROOT)" \
		-v "$(ANDROID_NDK_ROOT):$(ANDROID_NDK_ROOT)" \
		$(CONTAINER_SIGNKEY_MOUNT) \
		$(CONTAINER_SIGNPASSFILE_MOUNT) \
		-e ANDROID_SDK_ROOT="$(ANDROID_SDK_ROOT)" \
		-e ANDROID_NDK_ROOT="$(ANDROID_NDK_ROOT)" \
		-e JAVA_HOME=/opt/java/openjdk \
		$(APK_BUILD_IMAGE) \
		make apk-local JAVA_HOME=/opt/java/openjdk $(CONTAINER_SIGN_ARGS)

apk-container-image:
	@command -v docker >/dev/null 2>&1 || { echo "docker is required for apk-container-image"; exit 1; }
	docker build --load -t $(APK_BUILD_IMAGE) packaging/docker/android-apk

android/keepassgo-android.jar: $(shell find androidsrc -type f | sort)
	@test -x "$(JAVA_HOME)/bin/javac" || { echo "JAVA_HOME must point to a working JDK install"; exit 1; }
	@test -f "$(ANDROID_SDK_ROOT)/platforms/android-$(ANDROID_TARGET_SDK)/android.jar" || { echo "Android platform android-$(ANDROID_TARGET_SDK) is missing"; exit 1; }
	@mkdir -p android
	@sh -ec 'tmpdir=$$(mktemp -d); \
		trap "rm -rf $$tmpdir" EXIT; \
		"$(JAVA_HOME)/bin/javac" \
			-classpath "$(ANDROID_SDK_ROOT)/platforms/android-$(ANDROID_TARGET_SDK)/android.jar" \
			-d "$$tmpdir" \
			$$(find androidsrc -name '\''*.java'\'' | sort); \
		"$(JAVA_HOME)/bin/jar" --create --file "$$(pwd)/android/keepassgo-android.jar" -C "$$tmpdir" .'

archlinux-pkgbuild: $(ARCH_PKG_TMPL) Makefile
	@mkdir -p "$(ARCH_PKG_DIR)"
	@sed \
		-e 's|@PKGVER@|$(ARCH_PKGVER)|g' \
		-e 's|@REPO_DIR@|$(ARCH_REPO_DIR)|g' \
		"$(ARCH_PKG_TMPL)" > "$(ARCH_PKGBUILD)"

browser-bridge:
	go build ./cmd/keepassgo-browser-bridge

mcp-server:
	go build ./cmd/keepassgo-mcp-server

browser-extension-firefox-dir:
	@mkdir -p "$(dir $(FIREFOX_EXTENSION_DIR))"
	@python3 scripts/prepare_firefox_extension.py "$(FIREFOX_EXTENSION_DIR)"

browser-extension-firefox-lint: browser-extension-firefox-dir
	$(WEB_EXT) lint --source-dir "$(FIREFOX_EXTENSION_DIR)"

browser-extension-firefox-build: browser-extension-firefox-dir
	@mkdir -p "$(FIREFOX_EXTENSION_ARTIFACT_DIR)"
	$(WEB_EXT) build --source-dir "$(FIREFOX_EXTENSION_DIR)" --artifacts-dir "$(FIREFOX_EXTENSION_ARTIFACT_DIR)"

browser-extension-firefox-run: browser-extension-firefox-dir
	$(WEB_EXT) run --source-dir "$(FIREFOX_EXTENSION_DIR)"

browser-extension-firefox-sign: browser-extension-firefox-dir
	$(WEB_EXT) sign --source-dir "$(FIREFOX_EXTENSION_DIR)"

browser-extension-validate:
	@command -v xvfb-run >/dev/null 2>&1 || { echo "xvfb-run is required"; exit 1; }
	@command -v firefox >/dev/null 2>&1 || { echo "firefox is required"; exit 1; }
	@command -v openssl >/dev/null 2>&1 || { echo "openssl is required"; exit 1; }
	xvfb-run -a python scripts/validate_browser_extension.py $(if $(BROWSER),--browser $(BROWSER),)
