# Generate gogo, gRPC-Gateway, swagger, go-validators output.
#
# -I declares import folders, in order of importance
# This is how proto resolves the protofile imports.
# It will check for the protofile relative to each of these
# folders and use the first one it finds.
#
# --gogo_out generates GoGo Protobuf output with gRPC plugin enabled.
# --grpc-gateway_out generates gRPC-Gateway output.
# --swagger_out generates an OpenAPI 2.0 specification for our gRPC-Gateway endpoints.
# --govalidators_out generates Go validation files for our messages types, if specified.
#
# The lines starting with Mgoogle/... are proto import replacements,
# which cause the generated file to import the specified packages
# instead of the go_package's declared by the imported protof files.
#
# $$GOPATH/src is the output directory. It is relative to the GOPATH/src directory
# since we've specified a go_package option relative to that directory.
#
# proto/*.proto is the location of the protofile we use.
#
export GO111MODULE := on

pb_files = output/service.pb.go output/service.pb.gw.go output/service.validator.pb.go

.PHONY: generate
generate: output/OpenAPI/swagger.json output/statik/statik.go $(pb_files)

output/OpenAPI/swagger.json: output/service.swagger.json
	@cp swagger-ui/* output/OpenAPI/
	@cp output/service.swagger.json output/OpenAPI/swagger.json
	@sed -i.bak "s/https/http/g" output/OpenAPI/swagger.json && rm output/OpenAPI/swagger.json.bak

../../tools/bin/statik: ../../tools/Makefile
	cd ../../tools && make bin/statik

../../tools/bin/swagger: ../../tools/Makefile
	cd ../../tools && make bin/swagger

../../tools/bin/protoc-gen-gogo: ../../tools/Makefile
	cd ../../tools && make bin/protoc-gen-gogo

../../tools/bin/protoc-gen-grpc-gateway: ../../tools/Makefile
	cd ../../tools && make bin/protoc-gen-grpc-gateway

../../tools/bin/protoc-gen-swagger: ../../tools/Makefile
	cd ../../tools && make bin/protoc-gen-swagger

../../tools/bin/protoc-gen-govalidators: ../../tools/Makefile
	cd ../../tools && make bin/protoc-gen-govalidators

proto_gen_tools = ../../tools/bin/protoc-gen-gogo ../../tools/bin/protoc-gen-grpc-gateway ../../tools/bin/protoc-gen-swagger ../../tools/bin/protoc-gen-govalidators

output/statik/statik.go: output/OpenAPI/swagger.json ../../tools/bin/statik
	@../../tools/bin/statik -m -f -src output/OpenAPI/
	@cp output/statik/bootstrap.go statik
	@rm -rf output/statik
	@mv statik output

output/client: output/OpenAPI/swagger.json ../../tools/bin/swagger
	@echo "generating client"
	@../../tools/bin/swagger generate client -t output -f output/OpenAPI/swagger.json -A operation_service -P models.Principal

$(pb_files) output/service.swagger.json: service.proto Makefile $(proto_gen_tools)
	@echo "generating protocol buffers"
	@mkdir -p output/OpenAPI
	go mod vendor

	PATH="../../tools/bin:$(PATH)" ../scripts/protoc \
		-I . \
		-I ../../vendor/github.com/grpc-ecosystem/grpc-gateway/ \
		-I ../../vendor/github.com/gogo/googleapis/ \
		-I ../../vendor/ \
		--gogo_out=plugins=grpc,\
Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/duration.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/empty.proto=github.com/gogo/protobuf/types,\
Mgoogle/api/annotations.proto=github.com/gogo/googleapis/google/api,\
Mgoogle/protobuf/field_mask.proto=github.com/gogo/protobuf/types:.\
		--grpc-gateway_out=\
Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/duration.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/empty.proto=github.com/gogo/protobuf/types,\
Mgoogle/api/annotations.proto=github.com/gogo/googleapis/google/api,\
Mgoogle/protobuf/field_mask.proto=github.com/gogo/protobuf/types:.\
		--swagger_out=output/ \
		--govalidators_out=gogoimport=true,\
Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/duration.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/empty.proto=github.com/gogo/protobuf/types,\
Mgoogle/api/annotations.proto=github.com/gogo/googleapis/google/api,\
Mgoogle/protobuf/field_mask.proto=github.com/gogo/protobuf/types:.\
		service.proto

	@ # Workaround for https://github.com/grpc-ecosystem/grpc-gateway/issues/229.
	@sed -i.bak "s/empty.Empty/types.Empty/g" output/service.pb.gw.go && rm -f output/service.pb.gw.go.bak
	@sed -i.bak "s/any.Any/types.Any/g" output/service.pb.gw.go && rm -f output/service.pb.gw.go.bak
