"""공유 미리보기(OG) 프리렌더 — 카카오톡·트위터 등 크롤러 전용.

SPA(index.html)의 og:image 는 정적이라 모든 /match/:id 공유가 같은 썸네일로
나온다(크롤러는 JS 미실행). 그래서 nginx 가 '크롤러 UA' 의 /match/:id 요청만
이 라우트로 보내고, 여기서 경기별 og:image·og:title 을 박은 HTML 을 반환한다.
일반 사용자는 nginx 가 그대로 SPA 로 보내므로 영향 없음.

경기별 커스텀 이미지는 OG_IMAGES 에 등록된 매치업만 적용되고, 나머지는
기본 썸네일로 폴백한다. 이미지 파일은 frontend/public/assets/og/ 에 둔다.
"""
from __future__ import annotations

import html

from fastapi import APIRouter
from fastapi.responses import HTMLResponse

from ..config import settings
from ..schedule_data import TEAMS

router = APIRouter()

# 경기별 커스텀 OG 이미지: 두 팀 코드(순서무관) → /assets/og/ 하위 파일명.
# 파일을 frontend/public/assets/og/ 에 두고 아래에 등록하면 적용된다.
# 미등록 매치업은 DEFAULT_OG 로 폴백.
#   예) frozenset({"KOR", "MEX"}): "kor_mex.png",
OG_IMAGES: dict[frozenset[str], str] = {
    # 한국-멕시코전 공유 카드 — 가로 1200x630 합성본(앱 배너는 세로 원본 kor_mex.png).
    frozenset({"KOR", "MEX"}): "kor_mex_card.png",
}

DEFAULT_OG = "/assets/bi/og-image.png"
OG_DIR = "/assets/og/"

# 전체 일정(타조 포함) 팀 한글명 — 타이틀용. schedule_data.TEAMS 우선, 없으면 코드.
_KOR_NAME = {code: t["shortName"] for code, t in TEAMS.items()}


def _parse_codes(match_id: str) -> tuple[str | None, str | None]:
    """경기 ID '{조}_{팀A}_{팀B}_{YYYYMMDD}' 에서 두 팀 코드 추출."""
    parts = match_id.split("_")
    if len(parts) >= 3:
        return parts[1], parts[2]
    return None, None


def _team_label(code: str | None) -> str:
    if not code:
        return ""
    return _KOR_NAME.get(code, code)


@router.get("/match/{match_id}", response_class=HTMLResponse)
async def match_share(match_id: str) -> HTMLResponse:
    a, b = _parse_codes(match_id)

    image = DEFAULT_OG
    is_custom = False
    if a and b:
        key = frozenset({a, b})
        if key in OG_IMAGES:
            image = OG_DIR + OG_IMAGES[key]
            is_custom = True

    la, lb = _team_label(a), _team_label(b)
    if la and lb:
        title = f"TriplePick 2026 — {la} vs {lb} AI 승부예측"
    else:
        title = "TriplePick 2026 — AI 2026 글로벌 축구 축전 승부예측"
    desc = "AI 셋이 매 경기를 서로 다르게 예측합니다. 당신의 픽을 찍고 AI와 겨뤄보세요."

    origin = settings.public_origin.rstrip("/")
    page_url = f"{origin}/match/{html.escape(match_id)}"
    img_url = f"{origin}{image}"
    t = html.escape(title)
    d = html.escape(desc)
    # 기본 썸네일만 규격이 1200x630 으로 확정 → width/height 명시.
    # 커스텀 이미지는 규격이 제각각이라 태그를 빼고 크롤러가 직접 측정하게 둔다.
    dims = (
        ""
        if is_custom
        else '<meta property="og:image:width" content="1200" />\n'
        '<meta property="og:image:height" content="630" />\n'
    )

    page = f"""<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>{t}</title>
<meta name="description" content="{d}" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="TriplePick" />
<meta property="og:title" content="{t}" />
<meta property="og:description" content="{d}" />
<meta property="og:url" content="{page_url}" />
<meta property="og:image" content="{img_url}" />
<meta property="og:image:secure_url" content="{img_url}" />
<meta property="og:image:type" content="image/png" />
{dims}<meta property="og:locale" content="ko_KR" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="{t}" />
<meta name="twitter:description" content="{d}" />
<meta name="twitter:image" content="{img_url}" />
<link rel="canonical" href="{page_url}" />
</head>
<body><a href="{page_url}">TriplePick</a></body>
</html>"""
    return HTMLResponse(page)
