GOPATH:=$(shell go env GOPATH)
VERSION=$(shell git describe --tags --always)
GITHASH=$(shell git rev-parse HEAD 2>/dev/null)
BUILDAT=$(shell date +%FT%T%z)
API_PROTO_FILES=$(shell find api/* -name *.proto)
LDFLAGS="-s -w -X moredoc/cmd.GitHash=${GITHASH} -X moredoc/cmd.BuildAt=${BUILDAT} -X moredoc/cmd.Version=${VERSION}"

.PHONY: init
# init env
init:
	go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
	go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
	go install github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc@latest
	go install github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway@latest
	go install github.com/gogo/protobuf/protoc-gen-gogofaster@latest
	go install github.com/google/gnostic/cmd/protoc-gen-openapi@latest


.PHONY: api
# generate api proto
api:
	protoc --proto_path=. \
		--proto_path=./third_party \
		--proto_path=./api \
		--gogofaster_out="plugins=grpc,paths=source_relative:." \
		--grpc-gateway_out="paths=source_relative:." \
		$(API_PROTO_FILES)

doc:
	for file in $(API_PROTO_FILES); do \
		protoc --proto_path=. \
		--proto_path=./third_party \
		--proto_path=./api \
		--doc_out=docs/api \
		--doc_opt=markdown,`basename $$file .proto`.md \
		--openapi_out==paths=source_relative:docs \
		$$file; \
	done
	# 整合到单文件
	protoc --proto_path=. \
		--proto_path=./third_party \
		--proto_path=./api \
		--doc_out=docs/api \
		--doc_opt=markdown,apis.md \
		--openapi_out==paths=source_relative:docs \
		$(API_PROTO_FILES)

.PHONY: clean-api-go
# clean api go file
clean-api-go:
	rm -rf api/*/*.go

builddarwin:
	rm -rf release/${VERSION}/darwin
	GOOS=darwin GOARCH=amd64 go build -v -o release/${VERSION}/darwin/moredoc -ldflags ${LDFLAGS}
	cp -r dist release/${VERSION}/darwin
	cp -r dictionary release/${VERSION}/darwin
	cp -r app.example.toml release/${VERSION}/darwin
	rm -rf release/${VERSION}/darwin/dist/_nuxt/icons
	rm -rf release/${VERSION}/darwin/dist/_nuxt/manifest*
	cd release/${VERSION}/darwin/ && tar -zcvf ../moredoc_ce_${VERSION}_darwin_amd64.tar.gz ./* && cd ../../

buildlinux:
	rm -rf release/${VERSION}/linux
	GOOS=linux GOARCH=amd64 go build -v -o release/${VERSION}/linux/moredoc -ldflags ${LDFLAGS}
	cp -r dist release/${VERSION}/linux
	cp -r dictionary release/${VERSION}/linux
	cp -r app.example.toml release/${VERSION}/linux
	rm -rf release/${VERSION}/linux/dist/_nuxt/icons
	rm -rf release/${VERSION}/linux/dist/_nuxt/manifest*
	cd release/${VERSION}/linux/ && tar -zcvf ../moredoc_ce_${VERSION}_linux_amd64.tar.gz ./* && cd ../../

buildwin:
	rm -rf release/${VERSION}/windows
	GOOS=windows GOARCH=amd64 go build -v -o release/${VERSION}/windows/moredoc.exe -ldflags ${LDFLAGS}
	cp -r dist release/${VERSION}/windows
	cp -r dictionary release/${VERSION}/windows
	cp -r app.example.toml release/${VERSION}/windows
	rm -rf release/${VERSION}/windows/dist/_nuxt/icons
	rm -rf release/${VERSION}/windows/dist/_nuxt/manifest*
	cd release/${VERSION}/windows/ && tar -zcvf ../moredoc_ce_${VERSION}_windows_amd64.tar.gz ./* && cd ../../

buildlinuxarm:
	rm -rf release/${VERSION}/linux-arm
	GOOS=linux GOARCH=arm64 go build -v -o release/${VERSION}/linux-arm/moredoc -ldflags ${LDFLAGS}
	cp -r dist release/${VERSION}/linux-arm
	cp -r dictionary release/${VERSION}/linux-arm
	cp -r app.example.toml release/${VERSION}/linux-arm
	rm -rf release/${VERSION}/linux-arm/dist/_nuxt/icons
	rm -rf release/${VERSION}/linux-arm/dist/_nuxt/manifest*
	cd release/${VERSION}/linux-arm/ && tar -zcvf ../moredoc_ce_${VERSION}_linux_arm64.tar.gz ./* && cd ../../

buildwinarm:
	rm -rf release/${VERSION}/windows-arm
	GOOS=windows GOARCH=arm64 go build -v -o release/${VERSION}/windows-arm/moredoc.exe -ldflags ${LDFLAGS}
	cp -r dist release/${VERSION}/windows-arm
	cp -r dictionary release/${VERSION}/windows-arm
	cp -r app.example.toml release/${VERSION}/windows-arm
	rm -rf release/${VERSION}/windows-arm/dist/_nuxt/icons
	rm -rf release/${VERSION}/windows-arm/dist/_nuxt/manifest*
	cd release/${VERSION}/windows-arm/ && tar -zcvf ../moredoc_ce_${VERSION}_windows_arm64.tar.gz ./* && cd ../../

# 一键编译所有平台
buildall: builddarwin buildlinux buildwin buildlinuxarm buildwinarm

# show help
help:
	@echo ''
	@echo 'Usage:'
	@echo ' make [target]'
	@echo ''
	@echo 'Targets:'
	@awk '/^[a-zA-Z\-\_0-9]+:/ { \
	helpMessage = match(lastLine, /^# (.*)/); \
		if (helpMessage) { \
			helpCommand = substr($$1, 0, index($$1, ":")-1); \
			helpMessage = substr(lastLine, RSTART + 2, RLENGTH); \
			printf "\033[36m%-22s\033[0m %s\n", helpCommand,helpMessage; \
		} \
	} \
	{ lastLine = $$0 }' $(MAKEFILE_LIST)

.DEFAULT_GOAL := help
