"""Airflow TaskFlow-API DAG definition. A PARSING fixture: decorator-based, so the task graph is
implied by function calls rather than by >> operators, which is the case static DAG extractors
most often get wrong. Nothing here performs I/O — every task returns a literal.
"""

from __future__ import annotations

import datetime as dt

from airflow.decorators import dag, task


@dag(
    dag_id="orders_taskflow",
    schedule="0 4 * * *",
    start_date=dt.datetime(2026, 1, 1),
    catchup=False,
    tags=["orders", "taskflow", "example"],
)
def orders_taskflow() -> None:
    @task
    def extract() -> dict:
        return {"rows": 1200, "source": "orders"}

    @task
    def transform(payload: dict) -> dict:
        return {"rows": payload["rows"], "clean": True}

    @task
    def publish(payload: dict) -> str:
        return f"published {payload['rows']} rows"

    @task
    def audit(payload: dict) -> str:
        return f"audited {payload['rows']} rows"

    extracted = extract()
    transformed = transform(extracted)
    publish(transformed)
    audit(transformed)


orders_taskflow()
