"""모델용 고정 텍스트 투영의 scalar 줄 형식을 공유한다."""
from __future__ import annotations

import re


def scalar(value: object) -> str:
    """복합 값과 Markdown 줄 삽입을 노출하지 않는 scalar 문자열이다."""
    if value is None or value == "" or not isinstance(value, (str, int, float, bool)):
        return "-"
    text = str(value).replace("`", "\\`").replace("\n", " ").replace("\r", " ")
    return re.sub(
        r"[\x00-\x09\x0b\x0c\x0e-\x1f\x7f-\x9f\u2028\u2029]",
        lambda match: f"\\u{ord(match.group(0)):04X}",
        text,
    )


def line(label: str, value: object) -> str:
    """한 scalar를 Markdown 목록 한 줄로 렌더한다."""
    if not re.fullmatch(r"[A-Za-z][A-Za-z0-9 ()/.-]*", label):
        raise ValueError("fixed text label must be a static single-line label")
    return f"- {label}: `{scalar(value)}`\n"


def value_lines(label: str, value: object) -> list[str]:
    """JSON 모양의 복합 값을 이름/순서/값 고정 줄로 손실 없이 펼친다."""
    if isinstance(value, dict):
        rows = [line(f"{label} field count", len(value))]
        for index, (name, child) in enumerate(value.items(), 1):
            rows.append(line(f"{label} field {index} name", name))
            rows.extend(value_lines(f"{label} field {index} value", child))
        return rows
    if isinstance(value, list):
        rows = [line(f"{label} item count", len(value))]
        for index, child in enumerate(value, 1):
            rows.extend(value_lines(f"{label} item {index}", child))
        return rows
    return [line(label, value)]
