PACK            := dokploy
ORG             := maxvojtkov
PROJECT         := github.com/$(ORG)/pulumi-$(PACK)
PROVIDER_PATH   := provider
VERSION_PATH    := $(PROVIDER_PATH)/pkg/version.Version

TFGEN           := pulumi-tfgen-$(PACK)
PROVIDER        := pulumi-resource-$(PACK)

WORKING_DIR     := $(shell pwd)
SCHEMA_DIR      := $(WORKING_DIR)/provider/cmd/$(PROVIDER)

# Override on the command line for a release build, e.g. `make build VERSION=0.2.0`.
VERSION         ?= 0.1.0
LDFLAGS         := -X $(PROJECT)/$(VERSION_PATH)=$(VERSION)

JAVASCRIPT_PKG  := @$(ORG)/pulumi-$(PACK)
PYTHON_PKG      := pulumi_$(PACK)

.PHONY: default
default: provider build_sdks ## Build the provider plugin and all SDKs

# ---------------------------------------------------------------- code gen ---

.PHONY: tfgen
tfgen: ## Regenerate schema.json and bridge-metadata.json
	(cd provider && go build -o $(WORKING_DIR)/bin/$(TFGEN) -ldflags "$(LDFLAGS)" $(PROJECT)/$(PROVIDER_PATH)/cmd/$(TFGEN))
	$(WORKING_DIR)/bin/$(TFGEN) schema --out $(SCHEMA_DIR)

.PHONY: provider
provider: tfgen ## Build the provider plugin binary into bin/
	(cd provider && go build -o $(WORKING_DIR)/bin/$(PROVIDER) -ldflags "$(LDFLAGS)" $(PROJECT)/$(PROVIDER_PATH)/cmd/$(PROVIDER))

.PHONY: build_sdks
build_sdks: build_nodejs build_python build_go build_dotnet ## Generate every language SDK

# sdk/nodejs/bin is what gets published to npm, so package.json and the docs
# have to be copied in next to the compiled JavaScript.
.PHONY: build_nodejs
build_nodejs: tfgen
	rm -rf sdk/nodejs
	$(WORKING_DIR)/bin/$(TFGEN) nodejs --out sdk/nodejs/
	cd sdk/nodejs && npm install && npm run build
	cp README.md LICENSE sdk/nodejs/package.json sdk/nodejs/bin/

.PHONY: build_python
build_python: tfgen
	rm -rf sdk/python
	$(WORKING_DIR)/bin/$(TFGEN) python --out sdk/python/
	cp README.md LICENSE sdk/python/

.PHONY: build_go
build_go: tfgen
	rm -rf sdk/go
	$(WORKING_DIR)/bin/$(TFGEN) go --out sdk/go/

.PHONY: build_dotnet
build_dotnet: tfgen
	rm -rf sdk/dotnet
	$(WORKING_DIR)/bin/$(TFGEN) dotnet --out sdk/dotnet/
	cp README.md LICENSE sdk/dotnet/
	printf "$(VERSION)" > sdk/dotnet/version.txt

# ------------------------------------------------------------------ local ----

.PHONY: install
install: provider install_nodejs_sdk ## Install the plugin locally so `pulumi up` can find it
	pulumi plugin install resource $(PACK) $(VERSION) --file $(WORKING_DIR)/bin/$(PROVIDER) --reinstall

.PHONY: install_nodejs_sdk
install_nodejs_sdk:
	@if [ -d sdk/nodejs/bin ]; then yarn link --cwd sdk/nodejs/bin; fi

.PHONY: lint
lint: ## Vet and format-check the provider sources
	cd provider && go vet ./... && test -z "$$(gofmt -l .)"

.PHONY: test
test: ## Run provider unit tests
	cd provider && go test ./... -count=1

.PHONY: clean
clean: ## Remove build artifacts and generated SDKs
	rm -rf bin sdk/nodejs sdk/python sdk/go sdk/dotnet

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