WORKDIR = /go/src/code.justin.tv/eventbus/controlplane
E2E_DB_DIR = /go/src/code.justin.tv/eventbus/controlplane/internal/db/postgres
TEST_PROJECT_NAME := $(shell echo $${COMPOSE_PROJECT_NAME:-localtest} )
COMPOSE = docker-compose
COMPOSE_TEST = docker-compose -p $(TEST_PROJECT_NAME) -f docker-compose.test.yml
COMPOSE_E2E = docker-compose -p e2e -f docker-compose.e2e.yml

#DB_MOCKS = EventTypesDB EventStreamsDB PublicationsDB ServicesDB AccountsDB SubscriptionTargetsDB SubscriptionsDB

default: build

build:
	$(COMPOSE) build

build-e2e:
	$(COMPOSE_E2E) build

build-test:
	$(COMPOSE_TEST) build

run: build
	$(COMPOSE) up

clean: e2e-clean test-clean
	docker-compose stop && \
	docker-compose rm --force && \
	(docker volume rm localstack_data || true)
	(docker volume rm localstack_data_test || true)
	(docker volume rm postgres_data || true)

seed:
	@./scripts/local-simple-seed.sh

test:
	$(COMPOSE_TEST) up --build --exit-code-from test

test-clean:
	$(COMPOSE_TEST) stop && \
	$(COMPOSE_TEST) rm --force

e2e: e2e-clean
	./scripts/e2e-test.sh

e2e-clean:
	$(COMPOSE_E2E) stop && \
	$(COMPOSE_E2E) rm --force --stop

e2e-purge: e2e-clean
	./scripts/e2e-purge.sh

lint:
	docker run --rm -v $(PWD):$(WORKDIR):delegated -w $(WORKDIR) golangci/golangci-lint:v1.21 golangci-lint run --timeout 5m0s

# note that you must be on Twitch VPN to run this command
twirp:
	docker build -t eventbus-tools -f docker/tools/Dockerfile . && \
	docker run --rm -v $(shell pwd):$(shell pwd) -w $(shell pwd) -u $(shell id -u):$(shell id -g) eventbus-tools /bin/bash -c "\
	protoc --proto_path=$(GOPATH)/src:./vendor:. --twirp_out=$(GOPATH)/src --go_out=$(GOPATH)/src \
		code.justin.tv/eventbus/controlplane/rpc/event_streams.proto \
		code.justin.tv/eventbus/controlplane/rpc/feature_flags.proto \
		code.justin.tv/eventbus/controlplane/rpc/audit_logs.proto \
		code.justin.tv/eventbus/controlplane/rpc/targets.proto \
		code.justin.tv/eventbus/controlplane/rpc/services.proto \
		code.justin.tv/eventbus/controlplane/rpc/subscriptions.proto && \
	protoc --proto_path=$(GOPATH)/src:./vendor:. --twirp_out=$(GOPATH)/src --go_out=$(GOPATH)/src \
		code.justin.tv/eventbus/controlplane/infrastructure/rpc/infrastructure.proto"

build-postgres:
	$(COMPOSE) up --build --no-deps -d postgres-db

local-postgres-migration: build-postgres
	$(COMPOSE) up --build db-migrations

# run a psql shell to connect to a local db created by docker-compose
psql-shell: build-postgres
	docker exec -it eventbus-db psql -U postgres -h localhost -d eventbus

# Lambda controlplane-updater tasks
build-controlplane-updater:
	mkdir -p output && \
	docker run --rm \
		-v $(shell pwd):/go/src/code.justin.tv/eventbus/controlplane \
		-w /go/src/code.justin.tv/eventbus/controlplane \
		golang:1.13.3 \
		go build -o output/controlplane-updater cmd/controlplane-updater-lambda/main.go && \
	zip -j output/controlplane-updater.zip output/controlplane-updater

mockery:
	go build -o $(shell go env GOPATH)/bin/eventbus-mockery ./vendor/github.com/vektra/mockery/cmd/mockery

db-mocks: mockery
	go generate ./internal/db

infra-mocks: mockery
	go generate ./infrastructure

servicecatalog-mock: mockery
	go generate ./internal/clients/servicecatalog

kms-mock: mockery
	go generate ./internal/clients/kms

sqs-mock: mockery
	go generate ./internal/clients/sqs

ldap-mock: mockery
	go generate ./internal/clients/ldap

sqs-validator-mocks: mockery
	eventbus-mockery -dir internal/validator -output internal/validator/mocks -case snake -name "SQSManager"

twirp-error-mocks: mockery
	go generate ./internal/twirperr

# TODO: Go generate for all the mocks

slack-mock: mockery
	eventbus-mockery -dir internal/clients/slack -output internal/clients/mocks -case snake -name "Slack"

validation-mocks: mockery
	eventbus-mockery -dir infrastructure/validation -output infrastructure/validation/mocks -case snake -name "Item"
	eventbus-mockery -dir infrastructure/validation -output infrastructure/validation/mocks -case snake -name "Item"

twirp-services-mocks:
	eventbus-mockery -dir services -output services/mocks -case snake -name "EncryptionAtRestManager"
	eventbus-mockery -dir services -output services/mocks -case snake -name "CloudformationManager"

twirp-infrastructure-mocks:
	eventbus-mockery -dir infrastructure -output infrastructure/mocks -case snake -name "AuthorizedFieldGrantManager"
	eventbus-mockery -dir infrastructure -output infrastructure/mocks -case snake -name "SNSManager"

twirp-subscriptions-mocks:
	eventbus-mockery -dir subscriptions -output subscriptions/mocks -case snake -name "SNSManager"

mocks: db-mocks servicecatalog-mock kms-mock slack-mock infra-mocks twirp-services-mocks twirp-error-mocks

.PHONY: build run clean test lint twirp psql-shell build-postgres local-postgres-migration build-controlplane-updater mocks db-mocks e2e_db_test
