PYTHON=$(shell which python3)
PIP=$(shell which pip3)
PROTOC_PATH=$(shell which protoc)
PROTOC_INCLUDE_PATH=$(shell dirname $(shell dirname "$(PROTOC_PATH)"))

compile: compile-go compile-py compile-ts compile-dart

compile-go:
	@rm -rf go && mkdir -p go
	@$(PROTOC_PATH) \
	--go_out=go \
	--go-grpc_out=go \
	--proto_path=protos/v3 \
	./protos/v3/*/*.proto
	@. ./scripts/gomod_update.sh

compile-dart:
	@rm -rf lib && mkdir -p lib
	@dart pub global activate --overwrite protoc_plugin
	@$(PROTOC_PATH) \
	--dart_out=lib \
	--proto_path=protos/v3 \
	./protos/v3/*/*.proto \
	$(PROTOC_INCLUDE_PATH)/include/google/protobuf/empty.proto

compile-py: check
	@rm -rf py/toc_trade_pb && mkdir -p py/toc_trade_pb
	@$(PYTHON) -m grpc_tools.protoc \
	--grpc_python_out=py/toc_trade_pb \
	--python_out=pyi_out:py/toc_trade_pb \
	--proto_path=protos/v3 \
	./protos/v3/*/*.proto

	@./scripts/modify_py_import.sh
	@touch py/toc_trade_pb/__init__.py
	@touch py/toc_trade_pb/app/__init__.py
	@touch py/toc_trade_pb/forwarder/__init__.py

compile-ts:
	@rm -rf ts && mkdir -p ts
	@$(PROTOC_PATH) \
	--proto_path=protos/v3 \
    --ts_opt=no_grpc \
    --ts_opt=no_namespace \
    --ts_out=ts \
	./protos/v3/*/*.proto

build-py: check
	@rm -rf dist
	@$(PYTHON) -m build

upload-py: check build-py
ifeq ($(PYPI_TOKEN),)
	$(error "PYPI_TOKEN first")
endif
	@$(PYTHON) -m twine upload --repository pypi -p $(PYPI_TOKEN) dist/*

clean: ## clear virtual environment
	@rm -rf venv

venv: clean ## create virtual environment
	@$(PYTHON) -m venv venv

check: ## check environment
ifneq ($(PYTHON),$(PWD)/venv/bin/python3)
	$(error "Please run 'make venv' first")
endif
	@echo "Venv python version: $(shell $(PYTHON) --version | awk '{print $$2}')"
	@echo "Python path: $(PYTHON)"
	@$(PIP) install -U --no-warn-script-location --no-cache-dir grpcio-tools protobuf build twine

help: ## display this help screen
	@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n  make \033[36m<target>\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf "  \033[36m%-30s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
