all: setup lint test build

.PHONY: mocks

ENVIRONMENT ?= testing

setup:
	go get -u \
		golang.org/x/tools/go/loader \
		github.com/kisielk/errcheck \
		github.com/alecthomas/gometalinter \
		github.com/tsenart/deadcode \
		github.com/jgautheron/goconst/cmd/goconst \
		golang.org/x/tools/cmd/goimports \
		honnef.co/go/tools/cmd/staticcheck \
		github.com/securego/gosec/cmd/gosec \
		github.com/Masterminds/glide \
		github.com/golang/dep \
		github.com/golang/protobuf/protoc-gen-go \
		github.com/golang/protobuf/proto \
		github.com/twitchtv/twirp/protoc-gen-twirp

lint:
	gometalinter --config='.gometalinter.json' ./...

test:
	ENVIRONMENT=testing go test -race ./...

test_with_coverage:
	ENVIRONMENT=testing go test -race ./... -coverprofile=coverage.txt

integration_test:
	env ENVIRONMENT=$(ENVIRONMENT) go test -race -tags=integration -run=. -v ./...

build: setup lint test
	go build -o following-service ./main.go
	mkdir -p build/output
	cp following-service build/output
	cp -R ./config build/output
	cp -R ./schema build/output

upgrade:
	dep ensure

dev:
	AWS_PROFILE=twitch-feed-dev ENVIRONMENT=development go run main.go

gen:
	# you will need to install protoc.
	# brew install protobuf or https://github.com/google/protobuf/releases
	go generate $$(glide novendor)

mocks:
	rm ./mocks/*.gen.go
	mockery --name=Backender                    --dir=backend                                           && mv mocks/Backender.go    mocks/Backender.gen.go
	mockery --name=PubSubClient                 --dir=clients                                           && mv mocks/PubSubClient.go mocks/PubSubClient.gen.go
	mockery --name=SNSClient                    --dir=clients                                           && mv mocks/SNSClient.go    mocks/SNSClient.gen.go
	mockery --name=SpadeClient                  --dir=clients                                           && mv mocks/SpadeClient.go  mocks/SpadeClient.gen.go
	mockery --name=EventBusClient               --dir=clients                                           && mv mocks/EventBusClient.go mocks/EventBusClient.gen.go
	mockery --name=GraphDB                      --dir=vendor/code.justin.tv/feeds/graphdb/proto/graphdb && mv mocks/GraphDB.go mocks/GraphDB.gen.go
	mockery --name=TwitchVXGraphDBECS           --dir=clients											&& mv mocks/GraphDBFulton.go mocks/GraphDBFulton.gen.go
	mockery --name=Experiments                  --dir=vendor/code.justin.tv/discovery/experiments       && mv mocks/Experiments.go mocks/Experiments.gen.go
	mockery --name=DartClient                   --dir=clients                                           && mv mocks/DartClient.go mocks/DartClient.gen.go
	mockery --name=FollowBotDetectionClient     --dir=clients                                           && mv mocks/FollowBotDetectionClient.go mocks/FollowBotDetectionClient.gen.go

	# Autogen client mocks too
	mockery --name=EventBusPublisher            --dir=clients                                           && mv mocks/EventBusPublisher.go clients/mocks/EventBusPublisher.gen.go
