"""데모 모드 — build_demo_fixtures.py 로 저장한 결과를 즉시 반환."""
from __future__ import annotations

import base64
import json
from pathlib import Path
from typing import Any

from app.config import BACKEND_ROOT

FIX = BACKEND_ROOT / "demo_fixtures"
SAMPLE = FIX / "sample.png"


def available() -> bool:
    return (FIX / "extract.json").exists() and (FIX / "generate.json").exists()


def sample_image_data_url() -> str | None:
    if not SAMPLE.exists():
        return None
    b64 = base64.b64encode(SAMPLE.read_bytes()).decode("ascii")
    return f"data:image/png;base64,{b64}"


def load_extract() -> dict[str, Any]:
    data = json.loads((FIX / "extract.json").read_text(encoding="utf-8"))
    url = sample_image_data_url()
    if url:
        data["sampleDataUrl"] = url
    return data


def load_generate() -> dict[str, Any]:
    return json.loads((FIX / "generate.json").read_text(encoding="utf-8"))


def load_preview() -> str | None:
    p = FIX / "preview.html"
    return p.read_text(encoding="utf-8") if p.exists() else None


def export_file(fmt: str) -> Path | None:
    p = FIX / f"report.{fmt.lower()}"
    return p if p.exists() else None


def save_sample_bboxes(bboxes: dict[str, dict[str, float]]) -> int:
    """컴포넌트 id→bbox 매핑을 extract.json IR 과 generate.json(resolvedIr+view)에 반영.

    [임시] 데모 샘플 박스 위치 보정용. 반영한 컴포넌트 수를 반환한다.
    """
    from app.services.view_model import build_view

    updated = 0
    ex = json.loads((FIX / "extract.json").read_text(encoding="utf-8"))
    for c in ex["ir"]["report"]["components"]:
        if c.get("id") in bboxes:
            c["bbox"] = bboxes[c["id"]]
            updated += 1
    (FIX / "extract.json").write_text(json.dumps(ex, ensure_ascii=False, indent=2), encoding="utf-8")

    gen = json.loads((FIX / "generate.json").read_text(encoding="utf-8"))
    for c in gen["resolvedIr"]["report"]["components"]:
        if c.get("id") in bboxes:
            c["bbox"] = bboxes[c["id"]]
    gen["view"] = build_view(gen["resolvedIr"])
    (FIX / "generate.json").write_text(json.dumps(gen, ensure_ascii=False, indent=2), encoding="utf-8")
    return updated
