"""
Per-row MAF workflow for eval-basic.

Converts the `line_process` node from the original PromptFlow evaluation flow.
Each workflow invocation processes a single (groundtruth, prediction) pair and
yields "Correct" or "Incorrect".

Original flow graph (per-row nodes only):
    [inputs: groundtruth, prediction] → [line_process] → output
"""

import asyncio
from dataclasses import dataclass

from typing_extensions import Never

from agent_framework import Executor, WorkflowBuilder, WorkflowContext, handler


@dataclass
class EvalInput:
    groundtruth: str
    prediction: str


class LineProcessExecutor(Executor):
    """Replaces the `line_process` Python node.

    Compares groundtruth and prediction (case-insensitive) and yields the result.
    """

    @handler
    async def process(self, input: EvalInput, ctx: WorkflowContext[Never, str]) -> None:
        result = "Correct" if input.groundtruth.lower() == input.prediction.lower() else "Incorrect"
        await ctx.yield_output(result)


def create_workflow():
    """Create a fresh workflow instance.

    MAF workflows do not support concurrent execution, so each batch row
    needs its own workflow instance.
    """
    _line_process = LineProcessExecutor(id="line_process")
    return WorkflowBuilder(name="EvalBasicRow", start_executor=_line_process).build()


async def main():
    """Quick smoke test with a single row."""
    wf = create_workflow()
    result = await wf.run(EvalInput(groundtruth="sunny", prediction="Sunny"))
    print(result.get_outputs()[0])  # → "Correct"


if __name__ == "__main__":
    asyncio.run(main())
