WORKDIR = /go/src/code.justin.tv/eventbus/dashboard
GO_VERSION = 1.11.4
REPO = eventbus/dashboard

GIT_SHA = $(shell git rev-parse --short HEAD)

STAGING_ACCT_ID = 297385687169
STAGING_DOCKER_ECR = $(STAGING_ACCT_ID).dkr.ecr.us-west-2.amazonaws.com/dashboard
PROD_ACCT_ID = 859517684765
PROD_DOCKER_ECR = $(PROD_ACCT_ID).dkr.ecr.us-west-2.amazonaws.com/dashboard

export PATH := $(CURDIR)/_tools/bin:$(PATH)
SHELL := /bin/bash

default: build

# Targets for local dev
node_modules:
	yarn install

tools:
	retool sync
	retool build
	go install ./vendor/go.larrymyers.com/protoc-gen-twirp_typescript

lint:
	gometalinter --config='.gometalinter.json' ./cmd/...
	yarn lint:typescript

test:
	go test -race ./cmd/server
	yarn test

build:
	yarn build

# TODO: verify hot-loading works
run:
	yarn server

ecr:
	@$(shell aws ecr get-login --region us-west-2 --no-include-email)

# Targets for deploy pipeline (CD)
push_staging: docker-build ecr
	docker tag $(REPO):$(GIT_SHA) $(STAGING_DOCKER_ECR):$(GIT_SHA) && \
	docker push $(STAGING_DOCKER_ECR) && \
	docker tag $(REPO):$(GIT_SHA) $(STAGING_DOCKER_ECR):latest && \
	docker push $(STAGING_DOCKER_ECR)

deploy_staging: push_staging
	./ecs-deploy.sh \
		--verbose \
		--timeout 180 \
		--cluster eventbus-staging \
		--service-name dashboard-staging \
		--image $(STAGING_DOCKER_ECR):$(GIT_SHA)

push_prod: docker-build ecr
	docker tag $(REPO):$(GIT_SHA) $(PROD_DOCKER_ECR):$(GIT_SHA) && \
	docker push $(PROD_DOCKER_ECR) && \
	docker tag $(REPO):$(GIT_SHA) $(PROD_DOCKER_ECR):latest && \
	docker push $(PROD_DOCKER_ECR)

deploy_prod: push_prod
	./ecs-deploy.sh \
		--verbose \
		--timeout 180 \
		--cluster eventbus-prod \
		--service-name dashboard-prod \
		--image $(PROD_DOCKER_ECR):$(GIT_SHA)

.PHONY: build lint test setup_tools run

# Targets for docker (CI)

# docker-specific makefile targets here, prepended w/ docker-*
# These are used by Jenkins, BUT they can be used by users to 
# verify these things work locally as well. Requires using twinit to access
# internal NPM registry through docker
docker-build: 
	docker build -f cmd/server/Dockerfile -t $(REPO):$(GIT_SHA) .

docker-test: docker-test-go docker-test-js

docker-test-go: docker-build
	docker run --rm $(REPO):$(GIT_SHA) go test -race ./...

docker-test-js: docker-build
	docker run --rm $(REPO):$(GIT_SHA) yarn test

docker-lint: docker-lint-go docker-lint-js

docker-lint-js: docker-build
	docker run --rm $(REPO):$(GIT_SHA) yarn lint:typescript

docker-lint-go: docker-build
	docker run --rm $(REPO):$(GIT_SHA) gometalinter --config='.gometalinter.json' ./cmd/...
