##
# Example:
# make create-stack STACK_ENVIRONMENT_NAME=staging
# make create-stack STACK_ENVIRONMENT_NAME=production
#
# # make update-stack STACK_ENVIRONMENT_NAME=staging
##
STACK_NAME=graphql

GITHUB_REPO := graphql-api-js
GITHUB_USER := Photowall
$(eval GITHUB_TOKEN=$(shell aws ssm get-parameter --with-decryption --name /github/CODE_PIPELINE_TOKEN --output text --query Parameter.Value))

AWS_REGION=$(shell aws configure get region)
AWS_ACCOUNT_ID=$(shell aws sts get-caller-identity --query Account --output text)

# HOSTED_ZONE=photowall.com default in the template
# Cert ARN for the hosted zone
CERTIFICATE_ARN='arn:aws:acm:eu-west-1:954747537408:certificate/1278df32-006d-48a4-abd6-2bfccabb11fd'
DB_SECURITY_GROUP_ID_PRODUCTION=sg-0b5bafc1e0a97e848
DB_SECURITY_GROUP_ID_STAGING=sg-001b3667edf19e1ce


checkdef = $(if $(value $(1)),,$(error $(1) not set))

DOCKER_IMAGE=$(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)

ifeq ($(STACK_ENVIRONMENT_NAME),production)
	SUBDOMAIN=$(STACK_NAME)
	GITHUB_BRANCH=master
	DB_SECURITY_GROUP_ID=$(DB_SECURITY_GROUP_ID_PRODUCTION)
	CPU_SIZE=1024
	MEMORY_SIZE=2GB
	IMAGES_BUCKET=photowall-images
	UPLOAD_BUCKET=photowall-inquiries
else
	SUBDOMAIN=$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
	GITHUB_BRANCH=$(STACK_ENVIRONMENT_NAME)
	DB_SECURITY_GROUP_ID=$(DB_SECURITY_GROUP_ID_STAGING)
	CPU_SIZE=512
	MEMORY_SIZE=1GB
	IMAGES_BUCKET=photowall-images-dev
	UPLOAD_BUCKET=photowall-inquiries-dev
endif

check-create-initial-ecr-image:
	@echo Checking for inital image $(DOCKER_IMAGE)
	@aws ecr list-images --repository-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) 2>/dev/null | grep imageTag | grep -q latest; \
			status=$$?; \
			if [ $$status != 0 ]; \
			then \
				echo ""; \
				echo "ECR Repo for initial image does not exist, creating"; \
				echo ""; \
				aws ecr create-repository --repository $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME); \
				aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com; \
				docker pull nginx; \
				docker tag nginx $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME):latest; \
				docker push $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME):latest; \
				echo ""; \
			fi

set-repository-lifecycle-policy:
	@echo Setting lifecycle policy for repo $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
	@aws ecr put-lifecycle-policy \
    --repository-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) \
    --lifecycle-policy-text "file://ecr-lifecycle-policy.json"

check-create-variables-set:
	$(call checkdef,STACK_NAME)
	$(call checkdef,STACK_ENVIRONMENT_NAME)
	$(call checkdef,GITHUB_TOKEN)
	$(call checkdef,GITHUB_USER)
	$(call checkdef,GITHUB_REPO)

check-update-variables-set:
	$(call checkdef,STACK_ENVIRONMENT_NAME)

delete-stack:
	aws cloudformation delete-stack --stack-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
	aws ecr delete-repository --force --repository-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
	@echo ""
	@echo "################################################################"
	@echo "# Do not forget to delete the articast bucket and loggroup:"
	@aws s3 ls | grep $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
	@echo "# aws s3 rb --force s3://<bucket name>"
	@echo ""
	@echo "aws logs delete-log-group --log-group-name /aws/codebuild/$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)"
	@echo "aws logs delete-log-group --log-group-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)"
	@echo "################################################################"

create-stack: check-create-variables-set check-create-initial-ecr-image
	aws cloudformation create-stack --stack-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) --template-body file://ecs-service.yaml \
		--capabilities CAPABILITY_NAMED_IAM \
		--tags Key=EnvironmentName,Value=$(STACK_ENVIRONMENT_NAME) \
		--parameters ParameterKey="EnvironmentName",ParameterValue="$(STACK_ENVIRONMENT_NAME)" \
								 ParameterKey="Image",ParameterValue="$(DOCKER_IMAGE)" \
		             ParameterKey="Subdomain",ParameterValue="$(SUBDOMAIN)" \
		             ParameterKey="Certificate",ParameterValue="$(CERTIFICATE_ARN)" \
		             ParameterKey="DatabaseSecurityGroup",ParameterValue="$(DB_SECURITY_GROUP_ID)" \
		             ParameterKey="GitHubRepo",ParameterValue="$(GITHUB_REPO)" \
								 ParameterKey="GitHubUser",ParameterValue="$(GITHUB_USER)" \
								 ParameterKey="GitHubBranch",ParameterValue="$(GITHUB_BRANCH)" \
								 ParameterKey="GitHubToken",ParameterValue="$(GITHUB_TOKEN)" \
								 ParameterKey="CpuSize",ParameterValue="$(CPU_SIZE)" \
								 ParameterKey="MemorySize",ParameterValue="$(MEMORY_SIZE)" \
								 ParameterKey="ImagesBucket",ParameterValue="$(IMAGES_BUCKET)" \
								 ParameterKey="UploadBucket",ParameterValue="$(UPLOAD_BUCKET)"

update-stack: set-repository-lifecycle-policy
	$(call checkdef,STACK_NAME)
	$(call checkdef,ENVIRONMENT_NAME)
	aws cloudformation update-stack --stack-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) --template-body file://ecs-service.yaml \
		--capabilities CAPABILITY_NAMED_IAM \
		--tags Key=EnvironmentName,Value=$(STACK_ENVIRONMENT_NAME) \
		--parameters ParameterKey="EnvironmentName",UsePreviousValue=true \
								 ParameterKey="Image",UsePreviousValue=true \
		             ParameterKey="Subdomain",UsePreviousValue=true \
		             ParameterKey="Certificate",UsePreviousValue=true \
		             ParameterKey="DatabaseSecurityGroup",,UsePreviousValue=true \
		             ParameterKey="GitHubRepo",UsePreviousValue=true \
								 ParameterKey="GitHubUser",UsePreviousValue=true \
								 ParameterKey="GitHubBranch",UsePreviousValue=true \
								 ParameterKey="GitHubToken",UsePreviousValue=true \
								 ParameterKey="CpuSize",ParameterValue="$(CPU_SIZE)" \
								 ParameterKey="MemorySize",ParameterValue="$(MEMORY_SIZE)" \
								 ParameterKey="ImagesBucket",ParameterValue="$(IMAGES_BUCKET)" \
								 ParameterKey="UploadBucket",ParameterValue="$(UPLOAD_BUCKET)"
