#!/usr/bin/env python3
"""
小红书内页渲染引擎 v8 — HTML/CSS + Playwright + 底板背景图
详见 xiaohongshu-automation SKILL.md 中「HTML/CSS + Playwright 渲染方案」章节
"""
import os, base64
from pathlib import Path
from datetime import datetime, timezone, timedelta

CST = timezone(timedelta(hours=8)); TODAY = datetime.now(CST)
BASE = Path(os.path.expanduser("~/project/brand"))
FONT_T = BASE / "YouSheBiaoTiHei-2.ttf"
FONT_B = Path("/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc")
INNER_BG = BASE / "内页.png"; COVER_BG = BASE / "小红书封面.jpeg"

BG_B64 = base64.b64encode(open(INNER_BG,"rb").read()).decode()
TB64 = base64.b64encode(open(FONT_T,"rb").read()).decode()
BB64 = base64.b64encode(open(FONT_B,"rb").read()).decode()

C = {"dark":"#285A37","orange":"#E67E22","text":"#1E3C28","mid":"#649B73","white":"#FFFFFF"}

def page(title, blocks, pn, tp):
    badge = f'<div class="pn">{pn}/{tp}</div>' if tp > 1 else ''
    return f'<div class="page"><div class="brand">广东高职高考信息网</div>{badge}<div class="title-area"><div class="title-text">{title}</div><div class="title-line"></div></div><div class="content">{blocks}</div><div class="footer">广东高职高考信息网 | {TODAY.strftime("%Y.%m.%d")}</div></div>'

def render(pages_data, output_dir):
    """pages_data: list of (title, blocks_html) tuples. Renders all pages in one Playwright shot."""
    from playwright.sync_api import sync_playwright
    from PIL import Image
    
    os.makedirs(output_dir, exist_ok=True)
    
    all_pages = ''.join(page(title, blocks, i+1, len(pages_data)) for i, (title, blocks) in enumerate(pages_data))
    
    html = f"""<!DOCTYPE html><html><head><meta charset="utf-8"><style>
@font-face{{font-family:'TF';src:url(data:font/ttf;base64,{TB64}) format('truetype');}}
@font-face{{font-family:'BF';src:url(data:font/ttf;base64,{BB64}) format('truetype');}}
*{{margin:0;padding:0;box-sizing:border-box;}}
body{{width:{1242*len(pages_data)}px;height:1660px;font-family:'BF',sans-serif;color:{C['text']};display:flex;background:#f5f0eb;}}
.page{{width:1242px;height:1660px;background-image:url(data:image/png;base64,{BG_B64});background-size:1242px 1660px;background-repeat:no-repeat;position:relative;overflow:hidden;flex-shrink:0;}}
.brand{{height:72px;display:flex;align-items:center;justify-content:center;font-size:24px;color:{C['white']};letter-spacing:2px;}}
.pn{{position:absolute;top:82px;right:90px;font-size:22px;color:{C['mid']};}}
.title-area{{padding:50px 90px 0;text-align:center;}}
.title-text{{font-family:'TF','BF',sans-serif;font-size:54px;color:{C['dark']};line-height:1.3;letter-spacing:-0.5px;}}
.title-line{{margin:16px 0 0;height:2px;background:{C['dark']};position:relative;}}
.title-line::before{{content:'';position:absolute;left:20px;top:-4px;width:12px;height:12px;background:{C['orange']};border-radius:50%;}}
.content{{padding:32px 90px 0;}}
.footer{{position:absolute;bottom:0;left:0;right:0;height:68px;display:flex;align-items:center;justify-content:center;font-size:20px;color:{C['mid']};}}
</style></head><body>{all_pages}</body></html>"""

    with open("/tmp/v8_render.html", "w", encoding="utf-8") as f:
        f.write(html)
    
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page(viewport={"width": 1242*len(pages_data), "height": 1660})
        page.goto("file:///tmp/v8_render.html")
        page.screenshot(path="/tmp/v8_full.png")
        browser.close()
    
    full = Image.open("/tmp/v8_full.png").convert("RGB")
    for i in range(len(pages_data)):
        x = i * 1242
        full.crop((x, 0, x+1242, 1660)).save(os.path.join(output_dir, f"inner-{i+1:02d}.png"), "PNG", quality=90)
        print(f"📄 内页{i+1}/{len(pages_data)}: {(Path(output_dir)/f'inner-{i+1:02d}.png').stat().st_size//1024}KB")
    
    print(f"✅ {output_dir}/")
