"""blast_radius parser: list/dict 모두 안전 처리.

AST(ast_dependency_map.py)는 파일 1개면 dict, 여러 개면 list 반환.
또한 데이터는 {"blast_radius": {...}} 중첩 또는 (legacy) 평탄 dict.
본 모듈은 모든 변형을 흡수하여 (direct_importers, test_files) 튜플 반환.
"""
from __future__ import annotations

from typing import Any


def parse_blast_radius(data: Any) -> tuple[list[str], list[str]]:
    """AST 결과에서 direct_importers, test_files를 추출.

    Args:
        data: ast_dependency_map.py --json 출력의 json.loads 결과.
              list (다파일), dict (단일파일/legacy), 기타 타입 모두 허용.

    Returns:
        (direct_importers, test_files) — 중복 제거, 입력 순서 유지.
    """
    items = data if isinstance(data, list) else [data]

    direct_importers: list[str] = []
    test_files: list[str] = []

    for item in items:
        if not isinstance(item, dict):
            continue
        br = item.get("blast_radius")
        if isinstance(br, dict):
            di = br.get("direct_importers", []) or []
            tf = br.get("test_files", []) or []
        else:
            # legacy 평탄 schema
            di = item.get("direct_importers", []) or []
            tf = item.get("test_files", []) or []
        if isinstance(di, list):
            direct_importers.extend(str(x) for x in di)
        if isinstance(tf, list):
            test_files.extend(str(x) for x in tf)

    # 중복 제거(입력 순서 유지)
    direct_importers = list(dict.fromkeys(direct_importers))
    test_files = list(dict.fromkeys(test_files))

    return direct_importers, test_files
