ifeq ($(shell uname -s),Darwin)

IS_MAC = 1

ifneq ($(VERBOSE),1)
ifeq ($(shell type -p xcbeautify &>/dev/null && echo 1),1)
XC_FORMAT = | xcbeautify
endif
endif

endif

ifeq ($(RELEASE),1)
INTERNAL_SWIFTFLAGS = -c release
INTERNAL_XCFLAGS = -configuration Release
else
INTERNAL_SWIFTFLAGS = -c debug
INTERNAL_XCFLAGS = -configuration Debug
endif

ALL_SWIFTFLAGS = $(INTERNAL_SWIFTFLAGS) $(SWIFTFLAGS)
ALL_XCFLAGS = $(INTERNAL_XCFLAGS) $(XCFLAGS)

TEAM_CONFIG = macOS/Support/Private-Team.xcconfig

.PHONY: all
# dev build for the current platform
all:
ifeq ($(IS_MAC),1)
	@+$(MAKE) mac
else
	@+$(MAKE) linux
endif

.PHONY: clean
# clean build artifacts
clean:
ifeq ($(IS_MAC),1)
	@+$(MAKE) mac-clean
else
	@+$(MAKE) linux-clean
endif

.PHONY: linux
# dev build for Linux
linux:
	swift build --product xtool $(ALL_SWIFTFLAGS)

.PHONY: linux-clean
# clean build artifacts for Linux
linux-clean:
	rm -rf .build

.PHONY: linux-dist
# dist build for Linux
linux-dist:
	docker compose run --build --rm xtool Linux/build.sh

.PHONY: mac
# dev build for macOS
mac: project
	@rm -rf macOS/Build/XcodeInstall
	@set -o pipefail && cd macOS && \
	  xcodebuild install \
	  -skipMacroValidation -skipPackagePluginValidation \
	  -scheme XToolMac -destination generic/platform=macOS \
	  -derivedDataPath Build/DerivedData \
	  DSTROOT="$$PWD"/Build/XcodeInstall INSTALL_PATH=/ \
	  $(ALL_XCFLAGS) $(XC_FORMAT)
	@ln -fs XcodeInstall/xtool.app/Contents/Resources/bin/xtool macOS/Build/xtool
	@echo "Output: ./macOS/Build/xtool"

.PHONY: mac-clean
# clean build artifacts for macOS
mac-clean:
	rm -rf macOS/Build

.PHONY: mac-dist
# dist build for macOS
# requires a few secrets in the env (see .github/workflows/release.yml)
mac-dist:
	@echo "bundle exec fastlane package"
	@cd macOS && bundle exec fastlane package

.PHONY: reload
# update Xcode project and restart Xcode
reload:
	killall Xcode || :
	@+$(MAKE) project
	xed macOS/XToolMac.xcodeproj

.PHONY: project
# update Xcode project
project: $(TEAM_CONFIG)
	@echo "xcodegen"
	@cd macOS && xcodegen

.PHONY: team
# update development team
team:
	@+$(MAKE) -B $(TEAM_CONFIG)

# update development team if needed.
#
# will prompt interactively if there are multiple valid options.
# set DEVELOPMENT_TEAM=... to force a specific value.
$(TEAM_CONFIG):
ifeq ($(DEVELOPMENT_TEAM),)
	@mkdir -p macOS/Support
	@team=$$(./scripts/select-identity.sh); \
	  echo "echo \"DEVELOPMENT_TEAM = $$team\" > $@"; \
	  echo "DEVELOPMENT_TEAM = $$team" > $@
else
	@mkdir -p macOS/Support
	echo "DEVELOPMENT_TEAM = $(DEVELOPMENT_TEAM)" > $@
.PHONY: $(TEAM_CONFIG)
endif

.PHONY: docs
# build documentation
docs:
	./Documentation/build.sh

.PHONY: docs-preview
# preview documentation
docs-preview:
	./Documentation/build.sh preview

SPEC_URL = https://developer.apple.com/sample-code/app-store-connect/app-store-connect-openapi-specification.zip

.PHONY: api
# Regenerate the OpenAPI client code
api: openapi/openapi.json
	swift run swift-openapi-generator generate \
		openapi/openapi.json \
		--config Sources/DeveloperAPI/openapi-generator-config.yaml \
		--output-directory Sources/DeveloperAPI/Generated
	for file in Sources/DeveloperAPI/Generated/*.swift; do \
		sed -i '' -e 's/[[:<:]]Client[[:>:]]/DeveloperAPIClient/g' $$file; \
	done

.PHONY: update-api
# Update OpenAPI spec and regenerate the client code
update-api:
	@+$(MAKE) -B api

openapi/openapi.json: openapi/base.json Sources/DeveloperAPI/openapi-overlay.yaml
	npx --yes bump-cli overlay openapi/base.json Sources/DeveloperAPI/openapi-overlay.yaml > openapi/openapi.json

openapi/base.json:
	@mkdir -p openapi
	curl -fsSL "$(SPEC_URL)" | bsdtar -xOf- > openapi/base.json
