#!/usr/bin/env python3
"""
小红书4页图文快速渲染模板 — 复制后修改 pages_data 即可使用
基于 xhs-html-renderer v8 方案：封面 Pillow + 内页 HTML/CSS → Playwright 截图

使用方式：
  1. 修改 pages_data 列表，每项为 (title, blocks_html) 元组
  2. 修改 copywriting 变量
  3. 运行: ~/project/we-mp-rss-main/venv/bin/python3 此脚本

依赖：
  - fonts-noto-cjk (apt)
  - playwright (Chromium 已缓存 ~/.cache/ms-playwright/)
  - Pillow
  - 底板: ~/project/brand/内页.png, ~/project/brand/小红书封面.jpeg
  - 字体: ~/project/brand/YouSheBiaoTiHei-2.ttf
  - /usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc
"""
import os, base64
from pathlib import Path
from datetime import datetime, timezone, timedelta

CST = timezone(timedelta(hours=8))
TODAY = datetime.now(CST)
DATE_STR = TODAY.strftime("%Y-%m-%d")

BASE = Path(os.path.expanduser("~/project/brand"))
INNER_BG = BASE / "内页.png"
COVER_BG = BASE / "小红书封面.jpeg"
FONT_T = BASE / "YouSheBiaoTiHei-2.ttf"
FONT_B = Path("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc")  # Regular + CSS bold; Bold.ttc has Mono only

# ═══════════ 修改此处 ═══════════
TOPIC_NAME = "选题1-示例"
COPYWRITING = """📢 你的小红书文案
#标签1 #标签2"""

# pages_data: list of (title, blocks_html)
# 可用组件函数: hero_block(num, label, sub), kpi_block(items), info_card(title, lines), 
#              tip_box(text), highlight(text), formula_box(html)
def build_pages():
    pages = []
    
    # Page 1
    p1 = hero_block("核心数字", "标签说明", "副标题") + kpi_block([
        ("数据1", "标签1"),
        ("数据2", "标签2"),
        ("数据3", "标签3"),
    ]) + info_card("卡片标题", [
        ("行标签1", "行值1"),
        ("行标签2", "行值2"),
    ])
    pages.append(("页面主标题\n副标题", p1))
    
    # Page 2-4 同理...
    
    return pages
# ═══════════ 修改结束 ═══════════

OUT_DIR = Path(os.path.expanduser(f"~/.hermes/articles/{DATE_STR}/{TOPIC_NAME}"))
OUT_DIR.mkdir(parents=True, exist_ok=True)

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"}
PAGE_W, PAGE_H = 1242, 1660

# ── 组件函数 ──
def hero_block(num, label, sub=""):
    sub_html = f'<div class="hero-sub">{sub}</div>' if sub else ""
    return f'<div class="hero-block"><div class="hero-num">{num}</div><div class="hero-label">{label}</div>{sub_html}</div>'

def kpi_block(items):
    rows = "".join(f'<div class="kpi-item"><span class="kpi-num">{n}</span><span class="kpi-label">{l}</span></div>' for n, l in items)
    return f'<div class="kpi-row">{rows}</div>'

def info_card(title, lines):
    items = "".join(f'<div class="info-item"><span class="info-label">{l}</span><span class="info-value">{v}</span></div>' for l, v in lines)
    return f'<div class="card"><div class="card-title">{title}</div><div class="card-body">{items}</div></div>'

def highlight(text):
    return f'<span class="hl">{text}</span>'

def tip_box(text):
    return f'<div class="tip-box">💡 {text}</div>'

def formula_box(html):
    return f'<div class="formula-box">{html}</div>'

# ── 页面构建 ──
def build_page(title, blocks, pn, total):
    badge = f'<div class="pn">{pn}/{total}</div>' if total > 1 else ""
    return f'''<div class="page"><div class="brand-bar">广东高职高考信息网</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="page-footer">广东高职高考信息网 | {DATE_STR}</div></div>'''

def build_html(pages_data):
    pages = [build_page(t, b, i+1, len(pages_data)) for i, (t, b) in enumerate(pages_data)]
    return f'''<!DOCTYPE html><html><head><meta charset="utf-8"><style>
@font-face{{font-family:TF;src:url(data:font/ttf;base64,{TB64});}}
@font-face{{font-family:BF;src:url(data:font/ttf;base64,{BB64});}}
*{{margin:0;padding:0;box-sizing:border-box;}}
body{{width:{PAGE_W * len(pages_data)}px;height:{PAGE_H}px;display:flex;background:#f5f0eb;font-family:BF;}}
.page{{width:{PAGE_W}px;height:{PAGE_H}px;position:relative;background-image:url(data:image/png;base64,{BG_B64});background-size:cover;overflow:hidden;color:{C['text']};}}
.brand-bar{{height:72px;background:{C['dark']};color:{C['white']};font-size:24px;line-height:72px;padding-left:48px;letter-spacing:4px;}}
.pn{{position:absolute;top:84px;right:48px;font-size:22px;color:{C['mid']};}}
.title-area{{padding:40px 56px 0 56px;}}
.title-text{{font-family:TF;font-size:54px;color:{C['dark']};line-height:1.3;white-space:pre-line;}}
.title-line{{width:80px;height:5px;background:{C['orange']};margin-top:10px;}}
.content{{padding:16px 56px 0 56px;}}
.hero-block{{text-align:center;margin:20px 0 24px 0;}}
.hero-num{{font-family:TF;font-size:172px;color:{C['orange']};line-height:1;}}
.hero-label{{font-size:36px;font-weight:bold;color:{C['dark']};margin-top:8px;}}
.hero-sub{{font-size:24px;color:{C['mid']};margin-top:4px;}}
.kpi-row{{display:flex;justify-content:space-around;margin:24px 0;}}
.kpi-item{{text-align:center;flex:1;}}
.kpi-num{{display:block;font-family:TF;font-size:48px;color:{C['dark']};}}
.kpi-label{{display:block;font-size:26px;color:{C['text']};margin-top:4px;font-weight:bold;}}
.card{{border:2px solid {C['mid']};border-radius:12px;padding:24px 32px;margin:18px 0;}}
.card-title{{font-family:TF;font-size:32px;color:{C['dark']};margin-bottom:16px;}}
.info-item{{display:flex;justify-content:space-between;font-size:28px;font-weight:bold;padding:8px 0;border-bottom:1px dashed {C['mid']}40;}}
.info-label{{color:{C['mid']};}}
.info-value{{color:{C['text']};text-align:right;}}
.hl{{color:{C['orange']};}}
.formula-box{{background:{C['dark']}08;border-left:5px solid {C['orange']};padding:20px 28px;margin:18px 0;font-size:26px;font-weight:bold;line-height:1.8;}}
.tip-box{{background:{C['dark']}10;border-radius:10px;padding:20px 28px;font-size:26px;font-weight:bold;margin:18px 0;line-height:1.6;}}
.page-footer{{position:absolute;bottom:32px;left:56px;font-size:20px;color:{C['mid']};}}
</style></head><body>{"".join(pages)}</body></html>'''

# ── 渲染 ──
pages_data = build_pages()
html = build_html(pages_data)
html_path = OUT_DIR / "inner.html"
html_path.write_text(html, encoding="utf-8")

from playwright.sync_api import sync_playwright
from PIL import Image, ImageDraw, ImageFont

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page(viewport={"width": PAGE_W * len(pages_data), "height": PAGE_H})
    page.goto(f"file://{html_path}")
    page.wait_for_timeout(2000)
    screenshot_path = str(OUT_DIR / "inner-full.png")
    page.screenshot(path=screenshot_path, full_page=False)
    browser.close()

full = Image.open(screenshot_path)
for i in range(len(pages_data)):
    x = i * PAGE_W
    page_img = full.crop((x, 0, x + PAGE_W, PAGE_H))
    page_img.save(OUT_DIR / f"inner-{i+1:02d}.png", "PNG", optimize=True)

# Cover
cover = Image.open(COVER_BG).convert("RGBA")
draw = ImageDraw.Draw(cover)
# Use font_title, font_sub, font_num to draw cover text...
cover.save(OUT_DIR / "cover.png", "PNG", optimize=True)

# Copywriting
(OUT_DIR / "小红书文案.md").write_text(COPYWRITING, encoding="utf-8")
print(f"✅ {OUT_DIR}")
