.PHONY: clean clean_all env env_dev lint lint_fix format format_fix test \
	docker_local_up docker_local_down local_event \
	docker_test docker_test_up docker_test_down \
	docker_test_functional docker_test_functional_up docker_test_functional_down \
	test_integration docker_test_integration_up docker_test_integration_down \
	docker_ows_up docker_ows_down docker_login \
	docker_down

clean:
	@echo "Cleaning up..."
	@find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
	@find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true
	@find . -type d -name ".ruff_cache" -exec rm -rf {} + 2>/dev/null || true
	@find . -type d -name ".mypy_cache" -exec rm -rf {} + 2>/dev/null || true
	@find . -type f -name "*.pyc" -delete 2>/dev/null || true
	@find . -type f -name "*.pyo" -delete 2>/dev/null || true
	@rm -rf -- build dist *.egg-info .cache .coverage \
		coverage.xml pyunit.xml
	@echo "Done!"

clean_all: clean
	@echo "Removing virtual environment..."
	@rm -rf .venv
	@echo "Done!"

env: ## Install default dependencies
	@uv sync --frozen

env_dev: ## Install default and dev dependencies
	@uv sync --group dev --frozen

env_integration:
	@uv sync --group integration --frozen

format: env_dev ## Run the formatter to check
	@echo "Checking formatting..."
	@uv run --no-sync -- ruff format --check --diff

format_fix: env_dev ## Run the formatter to fix
	@echo "Fixing formatting..."
	@uv run --no-sync -- ruff format

lint: env_dev ## Run the linter to check
	@echo "Running linter..."
	@uv run --no-sync -- ruff check

lint_fix: env_dev ## Run the linter to fix
	@echo "Fixing linting..."
	@uv run --no-sync -- ruff check --fix

###############
### Testing ###
###############

run: env_dev
	uv run -- python dev.py

test: env_dev ## Run unit tests with coverage
	uv run --no-sync -- pytest tests/unit \
		--cov app \
		--cov sync_contract_sap \
		--cov-report term-missing

local_event:
	curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" \
		-d '{"abacus_event_id":359,"target_type":"contract","target_id":"1","event_name":"sync_contract_sap","event_date":"1997-07-16T19:20:30.45+01:00"}'

##############
### Docker ###
##############

docker_login:
	aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 437795906767.dkr.ecr.us-east-1.amazonaws.com
	aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 086679231553.dkr.ecr.us-east-1.amazonaws.com

docker_local: docker_local_down docker_local_up

docker_local_up:
	docker compose up --build -d function

docker_local_down:
	docker compose down function --volumes --remove-orphans

docker_test: docker_test_down docker_test_up

docker_test_up:
	docker compose up \
		--exit-code-from lint-and-test \
		--abort-on-container-exit \
		--build lint-and-test

docker_test_down:
	docker compose down lint-and-test --volumes --remove-orphans

# Functional tests: discovery query against the real MySQL schema.
# Needs only the MySQL + liquibase containers (no SAP, no OWS services).
docker_test_functional: docker_test_functional_down docker_test_functional_up

docker_test_functional_up:
	docker compose up -d sync-contract-sap-mysql
	docker compose up sync-contract-sap-liquibase-runner
	docker compose up \
		--exit-code-from test-functional \
		--abort-on-container-exit \
		--build test-functional

docker_test_functional_down:
	docker compose down test-functional --volumes --remove-orphans
	docker compose down sync-contract-sap-liquibase-runner --volumes --remove-orphans
	docker compose down sync-contract-sap-mysql --volumes --remove-orphans

# Integration tests disabled — SAP integration not available locally
docker_test_integration:
	exit 0

docker_test_integration_up: docker_ows_up
	docker compose up -d sync-contract-sap-lambda
	docker compose up \
		--exit-code-from test-integration \
		--abort-on-container-exit \
		--build test-integration

docker_test_integration_down: docker_ows_down
	docker compose down sync-contract-sap-lambda --volumes --remove-orphans
	docker compose down test-integration --volumes --remove-orphans

docker_ows_up:
	docker compose up -d sync-contract-sap-mysql
	docker compose up sync-contract-sap-liquibase-runner
	docker compose up -d sync-contract-sap-ows-royalties
	docker compose up -d sync-contract-sap-ows-abacus-account
	docker compose up -d sync-contract-sap-ows-abacus-state

docker_ows_down:
	docker compose down sync-contract-sap-mysql --volumes --remove-orphans
	docker compose down sync-contract-sap-liquibase-runner --volumes --remove-orphans
	docker compose down sync-contract-sap-ows-royalties --volumes --remove-orphans
	docker compose down sync-contract-sap-ows-abacus-account --volumes --remove-orphans
	docker compose down sync-contract-sap-ows-abacus-state --volumes --remove-orphans

test_integration: docker_test_integration
docker_down: docker_test_down docker_test_integration_down
