define install_deps
	@echo "* Installing dependencies"
	@.venv/bin/pip3 install -r requirements-devtools.txt -c constraints.txt
	@.venv/bin/pip3 install -r processor/requirements.txt -c constraints.txt
	@.venv/bin/pip3 install -r scheduler/requirements.txt -c constraints.txt
endef


.PHONY: build
build: build-processor build-scheduler


.PHONY: predeploy
predeploy: build-scheduler prebuild-processor


.PHONY: deploy-dev
deploy-dev: predeploy
	@echo "* Deploying to dev"
	@cd infra && npx cdk deploy Dev*


.PHONY: deploy-prod
deploy-prod: predeploy
	@echo "* Deploying to prod"
	@cd infra && npx cdk deploy Prod*


.PHONY: deploy-dev-apex
deploy-dev-apex: predeploy
	@echo "* Deploying Apex strategy to dev"
	@cd infra && npx cdk deploy DevApex*


.PHONY: deploy-prod-apex
deploy-prod-apex: predeploy
	@echo "* Deploying Apex strategy to prod"
	@cd infra && npx cdk deploy ProdApex*


.PHONY: prebuild-processor
prebuild-processor:
	@echo "* Prebuild: Processor"
	@rm -rf build/processor/
	@mkdir -p build/processor/
	@cp -r constraints.txt pip.conf processor/* build/processor/
	@find build/processor/ -name __pycache__ -type d -prune -exec rm -rf {} \;

.PHONY: build-processor
build-processor: prebuild-processor
	@echo "* Build: Processor"
	@docker build -t metavision-processor build/processor


.PHONY: build-scheduler
build-scheduler:
	@echo '* Build: Scheduler'
	@rm -rf build/scheduler/
	@mkdir -p build/scheduler/
	@cp scheduler/*.py build/scheduler/
	@.venv/bin/pip3 install --no-compile -r scheduler/requirements.txt -c constraints.txt -t build/scheduler/vendor


.PHONY: deps
deps:
	$(call install_deps)


.PHONY: init
init: init-venv init-infra
	@echo "* Removing build directory if any."
	@rm -rf build
	@echo "* Enabling Git LFS."
	@git lfs install


.PHONY: init-venv
init-venv:
	@echo "* Creating virtual environment"
	@rm -rf .venv
	@python3 -m venv .venv/
	@cp pip.conf .venv/
	$(call install_deps)


.PHONY: init-infra
init-infra:
	@echo "* Installing infra dependencies"
	@cd infra && npm ci


.PHONY: clean-docker
clean-docker:
	@docker rmi -f $(shell docker images -q metavision-processor)
	@docker rmi -f $(shell docker images -q 028744397248.dkr.ecr.us-west-2.amazonaws.com/aws-cdk/assets)
	@docker rmi -f $(shell docker images -q 450103335622.dkr.ecr.us-west-2.amazonaws.com/aws-cdk/assets)


.PHONY: constraints
constraints:
	@echo "* Updating constraints file."
	@.venv/bin/pip3 freeze > constraints.txt


.PHONY: run-processor
run-processor: build-processor
	@docker run -it --rm --env-file .env \
		-e AWS_ACCESS_KEY_ID=$(shell aws configure get metavision-dev.aws_access_key_id) \
		-e AWS_SECRET_ACCESS_KEY=$(shell aws configure get metavision-dev.aws_secret_access_key) \
		-e AWS_SESSION_TOKEN=$(shell aws configure get metavision-dev.aws_session_token) \
		metavision-processor:latest


.PHONY: run-scheduler
run-scheduler:
	@cd scheduler && AWS_PROFILE=metavision-dev ./run-dev.sh
