SHELL := /bin/bash
export PATH := $(CURDIR)/_tools/bin:$(PATH)
DDIR = /go/src/code.justin.tv/safety/aegis
DOCKER_BUILDER = docker.internal.justin.tv/safety/builder:latest
DOCKER_TOOL = docker run --rm -it -v `pwd`:$(DDIR):delegated -w $(DDIR) $(DOCKER_BUILDER)

.PHONY: setup upgrade docker_tools lint

yarn-setup:
	yarn

docker_tools:
	docker pull $(DOCKER_BUILDER)

fakes: docker_tools
	$(DOCKER_TOOL) make fakes_in_docker

fakes_in_docker:
	# Because the fake is created in the "mocks" package, these structs end up importing a vendored
	# package (e.g. "code.justin.tv/safety/aegis/vendor/code.justin.tv/commerce/hats/twirp/generated/hats_api").
	# This line removes the vendor prefix.
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/commerce/mako/twirp internal/clients/mocks/mako/client.go Mako
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/web/users-service/client/usersclient_internal internal/clients/mocks/users/internal_client.go InternalClient
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/video/clips-upload/client internal/clients/mocks/clips/client.go Client
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/chat/tmi/client internal/clients/mocks/tmi/client.go Client
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/vod/flipper/client internal/clients/mocks/flipper/client.go Client
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/vod/vodapi/rpc/vodapi internal/clients/mocks/vodapi/client.go VodApi
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/revenue/subscriptions/twirp internal/mocks/substwirp.go Subscriptions
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/chat/badges/client internal/clients/mocks/badges/client.go Client
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/chat/chatrooms/rpc/chatrooms internal/clients/mocks/chatrooms/client.go Chatrooms
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/gds/gds/panels/pms/client internal/clients/mocks/panels/client.go Client
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/commerce/payday/client internal/clients/mocks/payday/client.go Client
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/safety/gateway/rpc/gateway internal/clients/mocks/gateway/client.go Gateway
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/safety/devices/rpc/devices internal/clients/mocks/devices/client.go Devices
	/scripts/counterfeiter-vendor.sh safety/aegis github.com/nicksrandall/dataloader internal/mocks/dataloader.go Interface
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/amzn/JaegerLambdaTwirp internal/clients/mocks/jaeger/client.go JaegerService
	/scripts/counterfeiter-vendor.sh safety/aegis code.justin.tv/amzn/TwitchBeefcakeTwirp internal/clients/mocks/beefcake/client.go TwitchBeefcake
	counterfeiter -o internal/clients/mocks/passport/client.gen.go internal/clients/passport Client

test-go:
	CGO_ENABLED=1 go test -cover -race ./...

test-react: yarn-setup
	yarn test --ci

test: test-go test-react

lint-go:
	$(DOCKER_TOOL) gometalinter ./...

lint-react:
	yarn lint

lint: lint-go lint-react

dep: docker_tools
	# starts an ssh-agent with your ssh credentials inside the container so dep ensure has access to pull from code.justin.tv, should it need to.
	docker run --rm -it -v $(HOME)/.ssh:/root/.ssh:ro -v $(GOPATH)/pkg:/go/pkg:delegated -v $(GOPATH)/src:/go/src:delegated -w $(DDIR) $(DOCKER_BUILDER) bash -c 'eval "`ssh-agent -s`" && ssh-add ~/.ssh/id_rsa && dep ensure -v'

snapshot-react: yarn-setup
	yarn test -u --ci

snapshot: snapshot-react

pre-merge: dep fakes test lint

ecr_login:
	`AWS_PROFILE=twitch-safety-staging aws ecr get-login --no-include-email`

skaffold/pod.yaml: skaffold/pod.yaml.template
	bash -c 'sed "s/{\.USER}/${USER}/g" skaffold/pod.yaml.template > skaffold/pod.yaml'

dev: skaffold/pod.yaml ecr_login
	skaffold dev --port-forward

docker:
	docker build . --pull -t aegis:local

integration-test: yarn-setup
	TEST_MODE=integration yarn test --ci

integration-test-debug: yarn-setup
	TEST_MODE=integration KARMA_ENV=debug AEGIS_TEST_USER_PASSWORD=`sandstorm-cli get --role-arn=arn:aws:iam::734326455073:role/sandstorm/production/templated/role/safety-aegis-development messaging/aegis/development/svc-safety-staging-password` yarn test

integration-server:
	go run cmd/testserver/*.go

skaffold-build: linux-build skaffold-docker-build

linux-build:
	GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ./.skaffold-bin/aegis ./cmd/aegis

skaffold-docker-build:
	# Builds and pushes the docker images for skaffold, the $IMAGES variable is set by skaffold when it runs the startup script
	docker build . -f ./DockerFileSkaffold -t ${IMAGES}
	docker push ${IMAGES}
