GOCMD=go
GOBUILD=$(GOCMD) build -trimpath -ldflags="-s -w"
GOTEST=$(GOCMD) test

BASE_BINARY_NAME=datarush
GW_BINARY_NAME=$(BASE_BINARY_NAME)-gw
MIGRATE_BINARY_NAME=$(BASE_BINARY_NAME)-migrate
AUTH_BINARY_NAME=$(BASE_BINARY_NAME)-auth
COMPETITION_BINARY_NAME=$(BASE_BINARY_NAME)-competition
TASK_BINARY_NAME=$(BASE_BINARY_NAME)-task

BINARY_DIR=bin

PROTOC=protoc
PROTO_DIR=api/proto
PROTO_FILE=${PROTO_DIR}/achievements.proto $(PROTO_DIR)/auth.proto $(PROTO_DIR)/competition.proto $(PROTO_DIR)/results.proto $(PROTO_DIR)/review.proto $(PROTO_DIR)/submission.proto $(PROTO_DIR)/task.proto $(PROTO_DIR)/user.proto
PROTO_OUT=.

.PHONY: install i generate gen generate-gw test build run migrate lint fmt format clean help codegen examples

install:
	$(GOCMD) mod download
	$(GOCMD) mod tidy

i: install

generate:
	$(PROTOC) --version || (echo "protoc not found, install protoc"; exit 1)
	$(PROTOC) --go_out=$(PROTO_OUT) --go-grpc_out=$(PROTO_OUT) \
		$(PROTO_FILE)

gen: generate

generate-gw:
	$(PROTOC) --version || (echo "protoc not found, install protoc"; exit 1)
	$(PROTOC) --grpc-gateway_out=$(PROTO_OUT) --grpc-gateway_opt generate_unbound_methods=true \
		$(PROTO_FILE)

test:
	$(GOTEST) ./...

build-gw:
	$(GOBUILD) -o ./$(BINARY_DIR)/$(GW_BINARY_NAME) ./cmd/gw
	chmod +x ./$(BINARY_DIR)/$(GW_BINARY_NAME)

build-migrate:
	$(GOBUILD) -o ./$(BINARY_DIR)/$(MIGRATE_BINARY_NAME) ./cmd/migrate
	chmod +x ./$(BINARY_DIR)/$(MIGRATE_BINARY_NAME)

build-auth:
	$(GOBUILD) -o ./$(BINARY_DIR)/$(AUTH_BINARY_NAME) ./cmd/auth
	chmod +x ./$(BINARY_DIR)/$(AUTH_BINARY_NAME)

build-competition:
	$(GOBUILD) -o ./$(BINARY_DIR)/$(COMPETITION_BINARY_NAME) ./cmd/competition
	chmod +x ./$(BINARY_DIR)/$(COMPETITION_BINARY_NAME)

build-task:
	$(GOBUILD) -o ./$(BINARY_DIR)/$(TASK_BINARY_NAME) ./cmd/task
	chmod +x ./$(BINARY_DIR)/$(TASK_BINARY_NAME)

build: build-gw build-migrate build-auth build-competition build-task

run:
	./$(BINARY_DIR)/$(AUTH_BINARY_NAME) &
	./$(BINARY_DIR)/$(COMPETITION_BINARY_NAME) &
	./$(BINARY_DIR)/$(TASK_BINARY_NAME) &
	./$(BINARY_DIR)/$(GW_BINARY_NAME)

migrate: build-migrate
	@cmd=$(word 2,$(MAKECMDGOALS)); \
	if [ -z "$$cmd" ]; then \
		echo "Usage: make migrate <command>"; \
		exit 1; \
	fi; \
	./$(BINARY_DIR)/$(MIGRATE_BINARY_NAME) -cmd $$cmd

lint:
	golangci-lint run -c .golangci.yaml ./...

fmt:
	golangci-lint fmt -c .golangci.yaml ./...

format: fmt

clean:
	rm -rf bin/*

help:
	@echo "Help:"
	@echo "  install   - Install all deps using go mod download"
	@echo "        i"
	@echo "  generate  - Generate gRPC code"
	@echo "       gen"
	@echo "    protoc"
	@echo "  test      - Run tests"
	@echo "  build     - Build all binaries"
	@echo "  run       - Run the application"
	@echo "  lint      - Run golangci-lint linter"
	@echo "  format    - Run golangci-lint formatter"
	@echo "     fmt"
	@echo "  clean     - Clean build artifacts"


.DEFAULT_GOAL := help

%:
	@:
