"""오케스트레이션 — resolve → narrative 생성 → 범용 view 조립."""
from __future__ import annotations

from functools import lru_cache
from typing import Any

from app.graph.extract_graph import build_extract_graph
from app.graph.generate_graph import generate_narratives
from app.services.catalog import get_product
from app.services.resolver import resolve
from app.services.view_model import build_view


@lru_cache(maxsize=1)
def _extract_graph():
    return build_extract_graph()


def run_extract(image_b64: str, mime: str = "image/png") -> dict[str, Any]:
    graph = _extract_graph()
    result = graph.invoke({"image_b64": image_b64, "mime": mime, "attempts": 0})
    return {
        "ir": result.get("ir", {}),
        "confidence": result.get("confidence", 0.0),
        "errors": result.get("errors", []),
    }


def run_generate(ir: dict[str, Any], fund_code: str) -> dict[str, Any]:
    resolved = resolve(ir, fund_code)
    gen_warnings = generate_narratives(resolved)
    view = build_view(resolved)
    resolve_warnings = resolved.get("_meta", {}).get("warnings", [])
    return {
        "resolvedIr": resolved,
        "view": view,
        "warnings": resolve_warnings + gen_warnings,
    }
