# Define the targets
.PHONY: help venv pip install dist test test-full docker-run docker-build docs read-docs clean format gitlint mypy run run-dev

# Default target
all: help

# Target to display help information
help:
	@echo "Available targets:"
	@echo "  venv         - Set up a Python 3 virtual environment."
	@echo "  pip          - Install dependencies from requirements.txt."
	@echo "  pip-dev      - Install dependencies from requirements-dev.txt."
	@echo "  format       - Format source code."
	@echo "  gitlint      - Lint last commit message."
	@echo "  mypy         - Run mypy."
	@echo "  install      - Install EOS in editable form (development mode) into virtual environment."
	@echo "  docker-run   - Run entire setup on docker"
	@echo "  docker-build - Rebuild docker image"
	@echo "  docs         - Generate HTML documentation (in build/docs/html/)."
	@echo "  read-docs    - Read HTML documentation in your browser."
	@echo "  gen-docs     - Generate openapi.json and docs/_generated/*."
	@echo "  clean-docs   - Remove generated documentation."
	@echo "  run          - Run EOS production server in virtual environment."
	@echo "  run-dev      - Run EOS development server in virtual environment (automatically reloads)."
	@echo "  run-dash     - Run EOSdash production server in virtual environment."
	@echo "  run-dash-dev - Run EOSdash development server in virtual environment (automatically reloads)."
	@echo "  test         - Run tests."
	@echo "  test-full    - Run tests with full optimization."
	@echo "  test-ci      - Run tests as CI does. No user config file allowed."
	@echo "  dist         - Create distribution (in dist/)."
	@echo "  clean        - Remove generated documentation, distribution and virtual environment."

# Target to set up a Python 3 virtual environment
venv:
	python3 -m venv .venv
	@echo "Virtual environment created in '.venv'. Activate it using 'source .venv/bin/activate'."

# Target to install dependencies from requirements.txt
pip: venv
	.venv/bin/pip install --upgrade pip
	.venv/bin/pip install -r requirements.txt
	@echo "Dependencies installed from requirements.txt."

# Target to install dependencies from requirements.txt
pip-dev: pip
	.venv/bin/pip install -r requirements-dev.txt
	@echo "Dependencies installed from requirements-dev.txt."

# Target to install EOS in editable form (development mode) into virtual environment.
install: pip
	.venv/bin/pip install build
	.venv/bin/pip install -e .
	@echo "EOS installed in editable form (development mode)."

# Target to create a distribution.
dist: pip
	.venv/bin/pip install build
	.venv/bin/python -m build --wheel
	@echo "Distribution created (see dist/)."

# Target to generate documentation
gen-docs: pip-dev
	.venv/bin/pip install -e .
	.venv/bin/python ./scripts/generate_config_md.py --output-file docs/_generated/config.md
	.venv/bin/python ./scripts/generate_openapi_md.py --output-file docs/_generated/openapi.md
	.venv/bin/python ./scripts/generate_openapi.py --output-file openapi.json
	@echo "Documentation generated to openapi.json and docs/_generated."

# Target to build HTML documentation
docs: pip-dev
	.venv/bin/sphinx-build -M html docs build/docs
	@echo "Documentation build to build/docs/html/."

# Target to read the HTML documentation
read-docs: docs
	@echo "Read the documentation in your browser"
	.venv/bin/python -m webbrowser build/docs/html/index.html

# Clean target to remove generated documentation and documentation artefacts
clean-docs:
	@echo "Searching and deleting all '_autosum' directories in docs..."
	@find docs -type d -name '_autosummary' -exec rm -rf {} +;
	@echo "Cleaning docs build directories"
	rm -rf build/docs

# Clean target to remove generated documentation, distribution and virtual environment
clean: clean-docs
	@echo "Cleaning virtual env, distribution and build directories"
	rm -rf build .venv
	@echo "Deletion complete."

run:
	@echo "Starting EOS production server, please wait..."
	.venv/bin/python -m akkudoktoreos.server.eos

run-dev:
	@echo "Starting EOS development server, please wait..."
	.venv/bin/python -m akkudoktoreos.server.eos --host localhost --port 8503 --reload true

run-dash:
	@echo "Starting EOSdash production server, please wait..."
	.venv/bin/python -m akkudoktoreos.server.eosdash

run-dash-dev:
	@echo "Starting EOSdash development server, please wait..."
	.venv/bin/python -m akkudoktoreos.server.eosdash --host localhost --port 8504 --reload true

# Target to setup tests.
test-setup: pip-dev
	@echo "Setup tests"

# Target to run tests.
test:
	@echo "Running tests..."
	.venv/bin/pytest -vs --cov src --cov-report term-missing

# Target to run tests as done by CI on Github.
test-ci:
	@echo "Running tests as CI..."
	.venv/bin/pytest --full-run --check-config-side-effect -vs --cov src --cov-report term-missing

# Target to run all tests.
test-full:
	@echo "Running all tests..."
	.venv/bin/pytest --full-run

# Target to format code.
format:
	.venv/bin/pre-commit run --all-files

# Target to trigger gitlint using pre-commit for the last commit message
gitlint:
	.venv/bin/pre-commit run gitlint --hook-stage commit-msg --commit-msg-filename .git/COMMIT_EDITMSG

# Target to format code.
mypy:
	.venv/bin/mypy

# Run entire setup on docker
docker-run:
	@docker compose up --remove-orphans

docker-build:
	@docker compose build --pull
