#!/usr/bin/env python3
"""AI 배경 + HTML 오버레이 하이브리드 이미지 생성기 (v4-hybrid)"""

import argparse
import json
import sys
from pathlib import Path

from playwright.sync_api import sync_playwright

# ─────────────────────────────────────────────────────────────────────────────
# 상수 정의
# ─────────────────────────────────────────────────────────────────────────────

BASE_DIR = Path(__file__).parent
OUTPUT_DIR = BASE_DIR / "output" / "v4-hybrid"
TEMPLATE_PATH = OUTPUT_DIR / "overlay_template.html"

SCENARIOS: dict[str, dict] = {
    "A": {
        "scenario": "A",
        "headline": "당신의 커리어, 새로운 시작",
        "subText": "업계 최고 대우, 최고의 시스템",
        "ctaText": "지금 상담받기",
    },
    "B": {
        "scenario": "B",
        "headline": "보험의 모든 것",
        "subText": "15년 경력 전문 컨설턴트",
        "contact": "전문 상담 | 지금 바로 연락주세요",
    },
    "C": {
        "scenario": "C",
        "headline": "지금이 기회입니다",
        "subText": "더 나은 내일을 위한 선택",
    },
}


# ─────────────────────────────────────────────────────────────────────────────
# 경로 헬퍼 함수
# ─────────────────────────────────────────────────────────────────────────────


def get_bg_path(scenario: str) -> Path:
    """시나리오 키에 해당하는 배경 이미지 경로를 반환합니다."""
    return OUTPUT_DIR / f"bg_{scenario}.jpg"


def get_hybrid_output_path(scenario: str) -> Path:
    """시나리오 키에 해당하는 출력 이미지 경로를 반환합니다."""
    return OUTPUT_DIR / f"hybrid_{scenario}.png"


# ─────────────────────────────────────────────────────────────────────────────
# 캡처 함수
# ─────────────────────────────────────────────────────────────────────────────


def capture_hybrid(
    page,
    template_path: Path,
    scenario_data: dict,
    bg_path: Path,
    output_path: Path,
) -> None:
    """HTML 템플릿에 시나리오 데이터와 배경 이미지를 주입한 뒤 PNG로 캡처합니다.

    Args:
        page: Playwright page 객체 (1080x1080 viewport)
        template_path: overlay_template.html 경로
        scenario_data: 시나리오 데이터 딕셔너리
        bg_path: 배경 이미지(.jpg) 경로
        output_path: 저장할 PNG 경로
    """
    if not template_path.exists():
        raise FileNotFoundError(f"템플릿 파일을 찾을 수 없습니다: {template_path}")
    if not bg_path.exists():
        raise FileNotFoundError(f"배경 이미지를 찾을 수 없습니다: {bg_path}")

    template_url = f"file://{template_path.resolve()}"
    page.goto(template_url, wait_until="networkidle")

    page.evaluate(f"""() => {{
            window.BG_IMAGE_PATH = "file://{bg_path.resolve()}";
            window.SCENARIO_DATA = {json.dumps(scenario_data, ensure_ascii=False)};
            if (typeof render === 'function') {{
                render(window.SCENARIO_DATA, window.BG_IMAGE_PATH);
            }}
        }}""")

    # 폰트 및 렌더링 완료 대기
    page.wait_for_timeout(1500)

    output_path.parent.mkdir(parents=True, exist_ok=True)
    page.screenshot(path=str(output_path), type="png")
    print(f"  [캡처] {output_path}")


# ─────────────────────────────────────────────────────────────────────────────
# 단일 시나리오 생성 함수
# ─────────────────────────────────────────────────────────────────────────────


def generate_hybrid(scenario: str) -> None:
    """단일 시나리오에 대한 하이브리드 이미지를 생성합니다.

    Args:
        scenario: 시나리오 키 ("A", "B", "C")
    """
    if scenario not in SCENARIOS:
        raise ValueError(f"알 수 없는 시나리오: {scenario!r}. 유효한 값: {list(SCENARIOS.keys())}")

    scenario_data = SCENARIOS[scenario]
    bg_path = get_bg_path(scenario)
    output_path = get_hybrid_output_path(scenario)

    print(f"[시나리오 {scenario}] 생성 시작")

    with sync_playwright() as p:
        browser = p.chromium.launch()
        try:
            page = browser.new_page(viewport={"width": 1080, "height": 1080})
            capture_hybrid(page, TEMPLATE_PATH, scenario_data, bg_path, output_path)
        finally:
            browser.close()

    size_kb = output_path.stat().st_size / 1024
    print(f"[시나리오 {scenario}] 완료: {output_path} ({size_kb:.0f} KB)")


# ─────────────────────────────────────────────────────────────────────────────
# CLI 진입점
# ─────────────────────────────────────────────────────────────────────────────


def main() -> None:
    parser = argparse.ArgumentParser(description="AI 배경 + HTML 오버레이 하이브리드 이미지 생성기")
    parser.add_argument(
        "--scenario",
        required=True,
        choices=list(SCENARIOS.keys()),
        help="생성할 시나리오 (A, B, C)",
    )
    parser.add_argument(
        "--all",
        action="store_true",
        dest="all_scenarios",
        help="전체 3개 시나리오를 모두 생성합니다",
    )
    args = parser.parse_args()

    if args.all_scenarios:
        print("=== 전체 시나리오 생성 시작 ===")
        for key in SCENARIOS:
            generate_hybrid(key)
        print("=== 전체 시나리오 생성 완료 ===")
    else:
        generate_hybrid(args.scenario)


if __name__ == "__main__":
    main()
