"""명령의 결과를 표준 출력으로 내보낸다.

`--json` 이면 JSON, 아니면 고정 Markdown 줄이다. 두 형태를 한자리에 둬서
명령마다 출력 모양이 갈라지지 않게 한다. 파일을 읽지도 쓰지도 않는다.
"""
from __future__ import annotations

import json
from typing import Mapping

from ..invocation import PreparedAgentInvocation
from ...fixed_text import line



def _prepared_payload(
    prepared: PreparedAgentInvocation,
    audience: str,
) -> dict[str, object]:
    assignment = prepared.assignment
    return {
        "ok": True,
        "invocationId": prepared.invocation_id,
        "workerId": prepared.worker_id,
        "assignmentRef": prepared.assignment_ref,
        "audience": audience,
        "promptPath": str(prepared.prompt_path),
        "metadataPath": str(prepared.metadata_path),
        "modelAssignment": {
            "provider": assignment.provider,
            "model": assignment.model,
            "modelExecutionValue": assignment.model_execution_value,
            "runner": assignment.runner,
            "hostRuntime": assignment.host_runtime,
            "hostModelValue": assignment.host_model_value,
        },
        "digests": {
            "catalogDigest": prepared.catalog_digest,
            "assignmentDigest": prepared.assignment_digest,
            "dutyDigest": prepared.duty_digest,
            "instructionDigest": prepared.instruction_digest,
            "promptDigest": prepared.prompt_digest,
        },
    }


def _emit(
    payload: Mapping[str, object], as_json: bool, as_text: bool = False
) -> None:
    if as_json:
        print(json.dumps(payload, ensure_ascii=False, indent=2))
    elif as_text:
        print(render_agent_prompt_text(payload), end="")
    else:
        print(payload.get("promptPath") or payload.get("metadataPath") or "ok")


def render_agent_prompt_text(payload: Mapping[str, object]) -> str:
    """agent prompt 검증 결과의 승인된 경로만 투영한다."""
    rows = ["Okstra agent prompt\n"]
    rows.append(line("Status", "ready" if payload.get("ok", True) else "error"))
    for label, key in (("Prompt path", "promptPath"), ("Metadata path", "metadataPath"),
                       ("Assignment ID", "assignmentId"), ("Worker role", "workerRole")):
        if key in payload:
            rows.append(line(label, payload.get(key)))
    return "".join(rows)
