# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the “License”).
# You may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an “AS IS” BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#
# Configuration
#

DEPLOYMENT_BASE_DIR = deployment
DIST_DIR = dist
TERRAFORM_ENVIRONMENT ?= main
AWS_REGION ?= us-east-1
AWS_PROFILE ?= default

ROUTE53_OSDU_SUBDOMAIN ?= 'osdu'

USER_KUBECONFIG ?= "${HOME}/.kube/config"
KUBECONFIG := '$(shell mktemp -d)/kubeconfig.yaml'

###EVALUTED AT RUNTIME###
VPC_ID = `terraform -chdir=${DEPLOYMENT_BASE_DIR}/network output -raw vpc_id`
EKS_CLUSTER_NAME_POST_DEPLOY = `terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks output -raw cluster_name`
LOAD_BALANCER_CONTROLLER_ROLE_ARN = `terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks output -raw aws_load_balancer_controller_irsa_arn`

# Install dependencies required for further steps or development.
# For example: create virtual environment.
.PHONY: init
init:
	python3 scripts/create-conf-files.py --region ${AWS_REGION} --output-path "${DIST_DIR}/${TERRAFORM_ENVIRONMENT}" --terraform-environment ${TERRAFORM_ENVIRONMENT}
	scripts/generate-tfvars.sh
	python3 scripts/generate-helm-values.py --output-path "${DIST_DIR}/${TERRAFORM_ENVIRONMENT}"

	scripts/set-tfvar-defaults.sh
	
	@make OUTPUT="Generated files to the dist folder \($(shell pwd)/${DIST_DIR}/${TERRAFORM_ENVIRONMENT}\), validate files before continuing" output;


.PHONY: tf-init
tf-init:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/network init -upgrade -backend-config=../../dist/${TERRAFORM_ENVIRONMENT}/network.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/elasticache init -upgrade -backend-config=../../dist/${TERRAFORM_ENVIRONMENT}/elasticache.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/cognito init -upgrade -backend-config=../../dist/${TERRAFORM_ENVIRONMENT}/cognito.conf

	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/cluster init -upgrade -backend-config=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-cluster.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/eks-add-ons init -upgrade -backend-config=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-add-ons.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/operators init -upgrade -backend-config=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-operators.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant-group init -upgrade -backend-config=../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-tenant-group.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant/eks-tenant init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-tenant.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant/aws-tenant init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-aws-tenant.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/aws-base init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-aws-instance-base.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/eks-ingress init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-ingress.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/eks-osdu-core init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-osdu-core.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/mwaa init -upgrade -backend-config=../../dist/${TERRAFORM_ENVIRONMENT}/mwaa.conf


.PHONY: tf-init-reconfigure
tf-init-reconfigure:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/network init -upgrade -backend-config=../../dist/${TERRAFORM_ENVIRONMENT}/network.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/elasticache init -upgrade -backend-config=../../dist/${TERRAFORM_ENVIRONMENT}/elasticache.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/cognito init -upgrade -backend-config=../../dist/${TERRAFORM_ENVIRONMENT}/cognito.conf -reconfigure

	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/cluster init -upgrade -backend-config=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-cluster.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/eks-add-ons init -upgrade -backend-config=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-add-ons.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/operators init -upgrade -backend-config=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-operators.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant-group init -upgrade -backend-config=../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-tenant-group.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant/eks-tenant init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-tenant.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant/aws-tenant init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-aws-tenant.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/aws-base init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-aws-instance-base.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/eks-ingress init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-ingress.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/eks-osdu-core init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-osdu-core.conf -reconfigure
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/mwaa init -upgrade -backend-config=../../dist/${TERRAFORM_ENVIRONMENT}/mwaa.conf -reconfigure


.PHONY: tf-init-instance
tf-init-instance:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/aws-base init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-aws-instance-base.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/eks-ingress init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-ingress.conf
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/eks-osdu-core init -upgrade -backend-config=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-osdu-core.conf

.PHONY: tf-init-cloudtrail
tf-init-cloudtrail:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/cloudtrail init -upgrade -backend-config=../../dist/${TERRAFORM_ENVIRONMENT}/cloudtrail.conf

.PHONY: deploy-all
deploy-all: tf-init deploy-network deploy-elasticache deploy-cognito deploy-eks-cluster deploy-eks-add-ons deploy-eks-operators deploy-tenant-group deploy-eks-tenant deploy-aws-tenant deploy-instance-aws-base deploy-instance-osdu-ingress deploy-instance-osdu-core deploy-mwaa

.PHONY: deploy-instance
deploy-instance: tf-init-instance deploy-instance-aws-base deploy-instance-osdu-ingress deploy-instance-osdu-core

.PHONY: deploy-cloudtrail
deploy-cloudtrail: tf-init-cloudtrail
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/cloudtrail apply -var-file=../../dist/${TERRAFORM_ENVIRONMENT}/cloudtrail.tfvars -auto-approve

.PHONY: deploy-network
deploy-network:		
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/network apply -var-file=../../dist/${TERRAFORM_ENVIRONMENT}/network.tfvars -auto-approve

.PHONY: deploy-elasticache
deploy-elasticache:		
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/elasticache apply -var-file=../../dist/${TERRAFORM_ENVIRONMENT}/elasticache.tfvars -auto-approve

.PHONY: deploy-mwaa
deploy-mwaa:		
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/mwaa apply -var-file=../../dist/${TERRAFORM_ENVIRONMENT}/mwaa.tfvars -auto-approve

.PHONY: deploy-cognito
deploy-cognito:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/cognito apply -var-file=../../dist/${TERRAFORM_ENVIRONMENT}/cognito.tfvars -auto-approve

.PHONY: deploy-eks-cluster
deploy-eks-cluster:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/cluster apply -var-file=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-cluster.tfvars -auto-approve

.PHONY: deploy-eks-add-ons
deploy-eks-add-ons:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/eks-add-ons apply -var-file=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-add-ons.tfvars -auto-approve

.PHONY: deploy-eks-operators
deploy-eks-operators:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/operators apply -var-file=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-operators.tfvars -auto-approve

.PHONY: deploy-tenant-group
deploy-tenant-group:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant-group apply -var-file=../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-tenant-group.tfvars -auto-approve

.PHONY: deploy-eks-tenant
deploy-eks-tenant:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant/eks-tenant apply -var-file=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-tenant.tfvars -auto-approve

.PHONY: deploy-aws-tenant
deploy-aws-tenant:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant/aws-tenant apply -var-file=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-aws-tenant.tfvars -auto-approve

.PHONY: deploy-instance-aws-base
deploy-instance-aws-base:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/aws-base apply -var-file=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-aws-instance-base.tfvars -auto-approve

.PHONY: deploy-instance-osdu-ingress
deploy-instance-osdu-ingress:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/eks-ingress apply -var-file=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-ingress.tfvars -auto-approve

.PHONY: deploy-instance-osdu-core
deploy-instance-osdu-core:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/eks-osdu-core apply -var-file=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-osdu-core.tfvars -auto-approve

.PHONY: set-user-kubeconfig
set-user-kubeconfig:
	aws eks update-kubeconfig --profile ${AWS_PROFILE} --region ${AWS_REGION} --name ${EKS_CLUSTER_NAME_POST_DEPLOY} --kubeconfig ${USER_KUBECONFIG}


.PHONY: output
output: 
	@echo ""
	@printf -- '=%.0s' {1..$(shell tput cols)}; echo ""
	@echo ${OUTPUT}
	@printf -- '=%.0s' {1..$(shell tput cols)}; echo ""

.PHONY: clean
clean: 
	find ./${DEPLOYMENT_BASE_DIR} -type d -name '.terraform' -exec rm -rf {} \;
	find ./${DEPLOYMENT_BASE_DIR} -type f -name '.terraform.lock.hcl' -delete
	find ./${DEPLOYMENT_BASE_DIR} -type f -name 'terraform.tfstate' -delete
	find ./${DEPLOYMENT_BASE_DIR} -type f -name 'terraform.tfstate.backup' -delete
	rm -rf dist/${TERRAFORM_ENVIRONMENT}/

.PHONY: destroy-all
destroy-all: destroy-mwaa destroy-instance-osdu-core destroy-instance-osdu-ingress destroy-instance-aws-base destroy-aws-tenant destroy-eks-tenant destroy-tenant-group destroy-eks-operators destroy-eks-add-ons destroy-eks-cluster destroy-cognito destroy-elasticache destroy-network

.PHONY: destroy-instance
destroy-instance: tf-init-instance destroy-instance-osdu-core destroy-instance-osdu-ingress destroy-instance-aws-base

.PHONY: destroy-cloudtrail
destroy-cloudtrail: tf-init-cloudtrail
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/cloudtrail destroy -var-file=../../dist/${TERRAFORM_ENVIRONMENT}/cloudtrail.tfvars -auto-approve

.PHONY: destroy-network
destroy-network:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/network destroy -var-file=../../dist/${TERRAFORM_ENVIRONMENT}/network.tfvars -auto-approve

.PHONY: destroy-elasticache
destroy-elasticache:		
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/elasticache destroy -var-file=../../dist/${TERRAFORM_ENVIRONMENT}/elasticache.tfvars -auto-approve

.PHONY: destroy-cognito
destroy-cognito:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/cognito destroy -var-file=../../dist/${TERRAFORM_ENVIRONMENT}/cognito.tfvars -auto-approve

.PHONY: destroy-eks-cluster
destroy-eks-cluster:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/cluster destroy -var-file=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-cluster.tfvars -auto-approve

.PHONY: destroy-eks-add-ons
destroy-eks-add-ons:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/eks-add-ons destroy -var-file=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-add-ons.tfvars -auto-approve

.PHONY: destroy-eks-operators
destroy-eks-operators:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/eks/operators destroy -var-file=../../../dist/${TERRAFORM_ENVIRONMENT}/eks-operators.tfvars -auto-approve

.PHONY: destroy-tenant-group
destroy-tenant-group:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant-group destroy -var-file=../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-tenant-group.tfvars -auto-approve

.PHONY: destroy-eks-tenant
destroy-eks-tenant:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant/eks-tenant destroy -var-file=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-tenant.tfvars -auto-approve

.PHONY: destroy-aws-tenant
destroy-aws-tenant:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/tenant/aws-tenant destroy -var-file=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-aws-tenant.tfvars -auto-approve

.PHONY: destroy-instance-aws-base
destroy-instance-aws-base:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/aws-base destroy -var-file=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-aws-instance-base.tfvars -auto-approve

.PHONY: destroy-instance-osdu-ingress
destroy-instance-osdu-ingress:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/eks-ingress destroy -var-file=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-ingress.tfvars -auto-approve

.PHONY: destroy-instance-osdu-core
destroy-instance-osdu-core:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/osdu/instance/eks-osdu-core destroy -var-file=../../../../dist/${TERRAFORM_ENVIRONMENT}/osdu-eks-osdu-core.tfvars -auto-approve

.PHONY: destroy-mwaa
destroy-mwaa:
	terraform -chdir=${DEPLOYMENT_BASE_DIR}/mwaa destroy -var-file=../../dist/${TERRAFORM_ENVIRONMENT}/mwaa.tfvars -auto-approve