"""씬 연관 분석 v2 -- 배경 중심 + 인물 중심 분리."""
import logging
from typing import Dict, List, Optional
from app.modules.llm.llm_client import call_structured
from app.modules.prompt_loader import load_prompt, load_schema

logger = logging.getLogger(__name__)
_MODULE = "scene_dependency"


def extract_dependencies(
    segments: List[Dict],
    director_result: Dict = None,
    entities: Dict = None,
    fulltext: str = "",
    project_config: Optional[Dict] = None,
    opik_metadata: Optional[Dict] = None,
) -> Dict:
    """배경 중심 앞2씬 + 인물 중심 앞2씬 연관 분석."""
    system = load_prompt(_MODULE, "system")
    schema = load_schema(_MODULE, "dependency_schema")

    # Build scene summaries
    scene_lines = []
    for seg in segments:
        si = seg.get("scene_index", 0)
        heading = seg.get("heading", "")
        preview = seg.get("text", "")

        # Get present entities from director
        scene_dir = next(
            (s for s in director_result.get("scenes", []) if s.get("scene_index") == si),
            {},
        )
        v_entities = scene_dir.get("present_entity_ids", [])
        scene_lines.append(
            f"씬 {si} [{heading}] 엔티티: {', '.join(v_entities)}\n{preview}"
        )

    user_prompt = (
        f"엔티티 목록:\n{_format_entities(entities)}\n\n"
        f"씬 정보:\n{chr(10).join(scene_lines)}"
    )

    result = call_structured(
        step="scene_dependency",
        system_prompt=system,
        user_prompt=user_prompt,
        response_schema=schema,
        project_config=project_config,
        schema_name="scene_dependency_v2",
        opik_metadata=opik_metadata,
    )
    return result


def _format_entities(entities: Dict) -> str:
    lines = []
    for etype in ["characters", "locations", "props"]:
        for e in entities.get(etype, []):
            sid = e.get("short_id", e.get("name", "?"))
            lines.append(f"- {sid}: {e.get('name', '')} ({etype[:-1]})")
    return "\n".join(lines)
