# Make all targets .PHONY
.PHONY: $(shell sed -n -e '/^$$/ { n ; /^[^ .\#][^ ]*:/ { s/:.*$$// ; p ; } ; }' $(MAKEFILE_LIST))

SHELL = /usr/bin/env bash
USER_NAME = $(shell whoami)
USER_ID = $(shell id -u)
HOST_NAME = $(shell hostname)

IMAGE_NAME = alarm-detection-system

# export PYTHONPATH=$(pwd)
export PYTHONPATH=$(pwd):$(pwd)/src

# Returns true if the stem is a non-empty environment variable, or else raises an error.
guard-%:
	@#$(or ${$*}, $(error $* is not set))


## Build the Docker image
build:
	@echo "Building Docker image"
	docker build -t $(IMAGE_NAME) -f ./docker/Dockerfile .

## Start all services
dc-up:
	docker-compose up --build -d

## Stop all services
dc-down:
	docker-compose down

## View logs
dc-logs:
	docker-compose logs -f

## interactive Docker session
exec-in:
	@echo "Starting interactive Docker session"
	docker-compose run --rm -it fastapi bash

## Process raw alarm data
process-raw-data:
	@echo "Processing raw alarm data"
	python3 ./src/alarm_data_processor.py

## Process data for training
process-training-data:
	@echo "Processing data for training"
	python3 ./src/training_processor.py

## Train a model
train-model: 
	@echo "Training model"
	python3 ./src/model_training.py 

## Test API
test-api:
	@echo "Testing API"
	python3 ./src/api/api_test.py

## Test the inference script
test-inference:
	@echo "Testing inference script"
	python3 ./src/inference.py

## Run FastAPI server at localhost:8000 in the background
run-server:
	@echo "Running FastAPI server in the background"
	uvicorn src.api.main:app --host localhost --port 8000 --reload & echo $$! > server.PID

## Run Streamlit app
run-app: run-server
	@echo "Running Streamlit app"
	sleep 2
	streamlit run streamlit_app/app.py


.DEFAULT_GOAL := help

# Inspired by <http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html>
# sed script explained:
# /^##/:
# 	* save line in hold space
# 	* purge line
# 	* Loop:
# 		* append newline + line to hold space
# 		* go to next line
# 		* if line starts with doc comment, strip comment character off and loop
# 	* remove target prerequisites
# 	* append hold space (+ newline) to line
# 	* replace newline plus comments by `---`
# 	* print line
# Separate expressions are necessary because labels cannot be delimited by
# semicolon; see <http://stackoverflow.com/a/11799865/1968>
.PHONY: help
help:
	@echo "$$(tput bold)Available rules:$$(tput sgr0)"
	@echo
	@sed -n -e "/^## / { \
		h; \
		s/.*//; \
		:doc" \
		-e "H; \
		n; \
		s/^## //; \
		t doc" \
		-e "s/:.*//; \
		G; \
		s/\\n## /---/; \
		s/\\n/ /g; \
		p; \
	}" ${MAKEFILE_LIST} \
	| LC_ALL='C' sort --ignore-case \
	| awk -F '---' \
		-v ncol=$$(tput cols) \
		-v indent=36 \
		-v col_on="$$(tput setaf 6)" \
		-v col_off="$$(tput sgr0)" \
	'{ \
		printf "%s%*s%s ", col_on, -indent, $$1, col_off; \
		n = split($$2, words, " "); \
		line_length = ncol - indent; \
		for (i = 1; i <= n; i++) { \
			line_length -= length(words[i]) + 1; \
			if (line_length <= 0) { \
				line_length = ncol - indent - length(words[i]) - 1; \
				printf "\n%*s ", -indent, " "; \
			} \
			printf "%s ", words[i]; \
		} \
		printf "\n"; \
	}' \
	| more $(shell test $(shell uname) = Darwin && echo '--no-init --raw-control-chars')
