SHELL = /bin/bash -o pipefail
export PATH := $(shell go env GOPATH)/bin:$(PATH)

ROOT_DIR=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
BUILD_DIR=$(ROOT_DIR)/build
BIN=$(BUILD_DIR)/sshpoke
GO_VERSION=$(shell go version | sed -e 's/go version //')
VERSION=$(shell git describe --tags 2>/dev/null || git log --format="v0.0.0-%h" -n 1 || echo "v0.0.0-unknown")
LDFLAGS="-X 'github.com/Neur0toxine/sshpoke/cmd.Version=${VERSION}'"

.PHONY: run clean_backend clone_sshlib

build: deps fmt
	@echo " ►  Building with ${GO_VERSION}"
	@CGO_ENABLED=0 go build -tags=release -ldflags ${LDFLAGS} -o $(BIN) .
	@echo $(BIN)

test: deps fmt
	@echo " ►  Running tests"
	@go test -timeout 1m ./... -v -cpu 4

fmt:
	@echo " ►  Running gofmt"
	@gofmt -l -s -w `go list -f '{{.Dir}}' ${ROOT_DIR}/... | grep -v /vendor/`

deps:
	@echo " ►  Installing dependencies"
	@go mod tidy
	@go mod vendor

run:
	@$(BIN)

clean:
	@rm -rf $(BUILD_DIR)

generate: install_swag install_protobuf
	@echo " ►  Performing code generation"
	@cd $(ROOT_DIR) && go generate `go list -f '{{.Dir}}' ${ROOT_DIR}/... | grep -v /vendor/`

install_protobuf:
ifeq (, $(shell command -v protoc-gen-go 2> /dev/null))
	@echo " ►  Installing protoc-gen-go"
	@go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
endif
ifeq (, $(shell command -v protoc-gen-go-grpc 2> /dev/null))
	@echo " ►  Installing protoc-gen-go-grpc"
	@go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
endif

install_swag:
ifeq (, $(shell command -v swag 2> /dev/null))
	@echo " ►  Installing swag tool"
	@go install github.com/swaggo/swag/cmd/swag@latest
endif

clone_cryptolib:
	@rm -rf cryptolib && \
		git clone https://go.googlesource.com/crypto cryptolib && \
		mv cryptolib/internal/poly1305 cryptolib/ssh/internal/ && \
		find cryptolib/ssh -type f -name '*.go' -exec sed -i 's?golang.org/x/crypto/ssh?github.com/Neur0toxine/sshpoke/pkg/proto/ssh?g' {} \; && \
		find cryptolib/ssh -type f -name '*.go' -exec sed -i 's?golang.org/x/crypto/internal/poly1305?github.com/Neur0toxine/sshpoke/pkg/proto/ssh/internal/poly1305?g' {} \; && \
		find cryptolib/ssh -type f -name '*_test.go' -delete && \
		rm -rf cryptolib/ssh/test && \
		rm -rf cryptolib/ssh/testdata

update_sshlib_patch:
	@diff -Naru cryptolib/ssh pkg/proto/ssh > patch/ssh_proto_patches.patch

update_sshlib: clone_cryptolib
	@mv pkg/proto/ssh pkg/proto/ssh.bak && \
		mv cryptolib/ssh pkg/proto/ && \
		patch -p0 < patch/ssh_proto_patches.patch && \
		rm -rf pkg/proto/ssh.bak && \
		rm -rf cryptolib