-include .env
export

deps:
ifeq ($(MODE), ci)
	uv sync --all-extras --locked --no-cache
else
	uv sync --all-extras
endif

lock:
	uv lock --upgrade

lint:
ifeq ($(MODE), ci)
	uv run ruff check flowra/ tests/ examples/
	uv run ruff format --check flowra/ tests/ examples/
else
	uv run ruff check --fix flowra/ tests/ examples/
	uv run ruff format flowra/ tests/ examples/
endif
	uv run pyright

# ── test parameters ──────────────────────────────────────────────────
# Examples:
#   make test                                  # all tests, parallel
#   make test name="some_name"                 # filter by name (-k)
#   make test name="foo or bar"                # multiple filters
#   make test parallel=0                       # sequential
#   make test parallel=4                       # 4 workers
#   make test file="tests/lib/test_chat.py"    # specific file
#   make test name="e2e" parallel=0            # filter + sequential
#   make test args="-vv -s"                    # extra pytest arguments
_TEST_ARGS = $(if $(parallel),$(if $(filter 0,$(parallel)),,-n $(parallel)),-n auto) \
             $(if $(name),-k "$(name)")

test:
	uv run pytest $(or $(file),tests/) $(_TEST_ARGS) $(args)

test-unit:
	uv run pytest $(or $(file),tests/) --ignore=tests/llm/providers $(_TEST_ARGS) $(args)

test-failed:
	uv run pytest $(or $(file),tests/) --lf $(_TEST_ARGS) $(args)

test-e2e:
	uv run pytest $(or $(file),tests/llm/providers/) -k e2e $(_TEST_ARGS) $(args)

check: lint test

example1:
	uv run python examples/menu_agent.py $(args)

example2:
	uv run python examples/menu_agent_class.py $(args)

chat:
	CRASH_CHANCE=$(or $(crash),0) TOOL_DELAY=$(or $(delay),0) uv run python examples/console_chat.py $(if $(model),--model $(model)) $(if $(resume),--resume $(resume)) $(if $(input),--input "$(input)") $(args)
# make chat                        — new session
# make chat resume=last            — resume last session
# make chat resume=<session_id>    — resume specific session
# make chat input="What is 2+2?"   — batch mode (single message)
# make chat crash=0.5 input="..."  — crash recovery demo
# make chat delay=3                — slow tools (seconds)

chat-tui:
	CRASH_CHANCE=$(or $(crash),0) TOOL_DELAY=$(or $(delay),0) uv run python examples/tui_chat.py $(if $(model),--model $(model)) $(if $(resume),--resume $(resume)) $(args)

agent-tool:
	uv run python examples/agent_as_tool.py $(if $(model),--model $(model)) $(if $(input),--input "$(input)") $(args)

race:
	uv run python examples/race.py $(if $(model1),--model1 $(model1)) $(if $(model2),--model2 $(model2)) $(if $(question),--question "$(question)") $(if $(timeout),--timeout $(timeout)) $(args)

mlflow-demo:
	uv run python examples/mlflow_demo.py $(args)

mlflow-nested-demo:
	uv run python examples/mlflow_nested_demo.py $(args)

mlflow-parallel:
	uv run python examples/mlflow_parallel_demo.py $(args)

otel-demo:
	uv run python examples/otel_demo.py $(args)

otel-nested-demo:
	uv run python examples/otel_nested_demo.py $(args)

otel-nested-visualize:
	uv run python examples/otel_nested_demo.py 2>&1 | uv run python examples/otel_visualize.py

otel-jaeger-demo:
	uv run python examples/otel_jaeger_demo.py $(args)

# ── MLflow + OTel combinations ──────────────────────────────────────
mlflow-otel-both:
	uv run python examples/mlflow_otel_both_demo.py $(args)

mlflow-dual-export:
	uv run python examples/mlflow_dual_export_demo.py $(args)

mlflow-otel-nested:
	uv run python examples/mlflow_otel_nested_demo.py $(args)

escalation:
	uv run python examples/escalation.py $(if $(fast_model),--fast-model $(fast_model)) $(if $(smart_model),--smart-model $(smart_model)) $(if $(message),--message "$(message)") $(args)

# ── docs examples ───────────────────────────────────────────────────
# make docs-example name=getting_started_chat
# make docs-example name=getting_started_tools
# make docs-example name=getting_started_streaming
# make docs-example name=llm_streaming
# make docs-example name=llm_structured_output
# make docs-example name=tools_service_injection
# make docs-example name=agents_custom
# make docs-example name=agents_parallel
docs-example:
	uv run python examples/docs/$(name).py $(args)
