.PHONY: xdr-generate xdr-clean-generated xdr-clean-all xdr-update \
        xdr-generator-test xdr-generator-update-snapshots \
        xdr-generator-validate xdr-generate-tests help

.DEFAULT_GOAL := help

XDRS = xdr/Stellar-SCP.x xdr/Stellar-ledger-entries.x xdr/Stellar-ledger.x \
       xdr/Stellar-overlay.x xdr/Stellar-transaction.x xdr/Stellar-types.x \
       xdr/Stellar-contract-env-meta.x xdr/Stellar-contract-meta.x \
       xdr/Stellar-contract-spec.x xdr/Stellar-contract.x \
       xdr/Stellar-internal.x xdr/Stellar-contract-config-setting.x \
       xdr/Stellar-exporter.x

XDR_COMMIT = 61657d9fa39755d8a30f3ba8e9b9117e7f92df9d
RUBY_IMAGE = ruby:3.4

# Use CURDIR (always set by GNU Make) instead of PWD for portability
xdr/%.x: | xdr/
	curl -Lsf -o $@.tmp https://raw.githubusercontent.com/stellar/stellar-xdr/$(XDR_COMMIT)/$(@F) && mv $@.tmp $@

xdr/:
	mkdir -p xdr

xdr-generate: $(XDRS) ## Download .x files and generate Dart XDR classes
	docker run --rm -v $(CURDIR):/wd -w /wd $(RUBY_IMAGE) /bin/bash -c '\
		cd tools/xdr-generator && \
		bundle config set --local path vendor/bundle && \
		bundle install --quiet && \
		bundle exec ruby generate.rb'
	@command -v dart >/dev/null 2>&1 && dart format lib/src/xdr/ || \
		echo "Note: dart not found, skipping format. Run 'dart format lib/src/xdr/' manually."

xdr-clean-generated: ## Remove only generated Dart files (preserves hand-maintained wrappers)
	@if grep -rl 'automatically generated by xdrgen' lib/src/xdr/ >/dev/null 2>&1; then \
		grep -rl 'automatically generated by xdrgen' lib/src/xdr/ | xargs rm -f; \
	else \
		echo "WARNING: No files with generated marker found."; \
		echo "If this is the first run, use 'make xdr-generate' directly."; \
	fi

xdr-clean-all: xdr-clean-generated ## Remove generated files AND downloaded .x definitions
	rm -f xdr/*.x

xdr-update: xdr-clean-all xdr-generate ## Re-download .x files and regenerate Dart XDR classes

xdr-generator-test: ## Run snapshot tests via Docker
	docker run --rm -v $(CURDIR):/wd -w /wd $(RUBY_IMAGE) /bin/bash -c '\
		cd tools/xdr-generator && \
		bundle config set --local path vendor/bundle && \
		bundle install --quiet && \
		bundle exec ruby test/generator_snapshot_test.rb'

xdr-generator-update-snapshots: ## Regenerate golden snapshot files
	docker run --rm -v $(CURDIR):/wd -w /wd $(RUBY_IMAGE) /bin/bash -c '\
		cd tools/xdr-generator && \
		bundle config set --local path vendor/bundle && \
		bundle install --quiet && \
		bundle exec ruby test/update_snapshots.rb'

xdr-generator-validate: ## Validate generated types against XDR definitions
	docker run --rm -v $(CURDIR):/wd -w /wd $(RUBY_IMAGE) /bin/bash -c '\
		cd tools/xdr-generator && \
		bundle config set --local path vendor/bundle && \
		bundle install --quiet && \
		bundle exec ruby test/validate_generated_types.rb'

xdr-generate-tests: ## Regenerate XDR unit tests
	docker run --rm -v $(CURDIR):/wd -w /wd $(RUBY_IMAGE) /bin/bash -c '\
		cd tools/xdr-generator && \
		bundle config set --local path vendor/bundle && \
		bundle install --quiet && \
		bundle exec ruby test/generate_tests.rb'

help: ## Show available targets
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \
		awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-35s\033[0m %s\n", $$1, $$2}'
