#!/usr/bin/env python3
"""小红书内页渲染模板 — 已验证可用（2026-08-03）
使用方式：复制此文件，修改 build_pages() 和 COPYWRITING 即可。
"""
import os, base64
from pathlib import Path
from datetime import datetime, timezone, timedelta

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

BASE = Path(os.path.expanduser("~/project/brand"))
INNER_BG, COVER_BG = BASE / "内页.png", BASE / "小红书封面.jpeg"
FONT_T = BASE / "YouSheBiaoTiHei-2.ttf"
PAGE_W, PAGE_H = 1242, 1660

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

# 色彩系统
C = {"dark": "#285A37", "orange": "#E67E22", "text": "#1E3C28",
     "mid": "#649B73", "white": "#FFFFFF", "lg": "#DCEEE2", "lo": "#FCEBD7"}

# ═══════ 组件函数 ═══════
def hero(n, l, s=""): 
    return f'<div class="hero"><div class="hero-num">{n}</div><div class="hero-label">{l}</div>{"".join(f"<div class=hero-sub>{x}</div>" for x in ([s] if s else []))}</div>'
def kpis(items): return '<div class="kpis">'+''.join(f'<div class="kpi"><span class="kpi-num">{n}</span><span class="kpi-label">{l}</span></div>' for n,l in items)+'</div>'
def st(t): return f'<div class="st">{t}</div>'
def insight(t): return f'<div class="insight"><div class="dot"></div><span>{t}</span></div>'
def tip(t): return f'<div class="tip">💡 {t}</div>'
def warn(t): return f'<div class="warn">⚠️ {t}</div>'
def tbl(h, rs):
    th = '<tr>'+''.join(f'<th>{c}</th>' for c in h)+'</tr>'
    tb = ''.join('<tr>'+''.join(f'<td>{c}</td>' for c in r)+'</tr>' for r in rs)
    return f'<table class="tbl">{th}{tb}</table>'
def clist(items):
    return '<div class="cl">'+''.join(f'<div class="cli"><div class="dot"></div><div class="clt"><span class="cll">{l}</span><span class="cld">{d}</span></div></div>' for l,d in items)+'</div>'

# ═══════ 修改此处 ═══════
TOPIC = "选题-示例"
OUT_DIR = Path(os.path.expanduser(f"~/.hermes/articles/{DATE_STR}/{TOPIC}"))
OUT_DIR.mkdir(parents=True, exist_ok=True)

def build_pages():
    pages = []
    # Page 1: 核心数字
    p1 = hero("30", "分差距") + kpis([("575个","公办"),("119个","民办")]) + insight("核心洞察...")
    pages.append(("页面标题", p1))
    # ... 添加更多页
    return pages

COPYWRITING = """小红书文案..."""
COVER_LINES = [("行1","#FFFFFF"),("行2","#FFFFFF"),("行3",C['orange'])]
# ═══════ 修改结束 ═══════

# ═══════ CSS（字体：WenQuanYi 优先，系统字体名不走base64）═══════
pages = build_pages()
total = len(pages)
CSS = f'''<style>
@font-face{{font-family:TF;src:url(data:font/ttf;base64,{TB64});}}
*{{margin:0;padding:0;box-sizing:border-box;font-weight:bold;}}
body{{width:{PAGE_W*total}px;height:{PAGE_H}px;display:flex;background:#f5f0eb;font-family:'WenQuanYi Zen Hei','Noto Sans CJK SC',sans-serif;}}
.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']};}}
.bar{{height:72px;background:{C['dark']};color:#fff;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']};}}
.ta{{padding:28px 56px 0;}}
.tt{{font-family:TF;font-size:48px;color:{C['dark']};line-height:1.3;white-space:pre-line;}}
.tl{{width:80px;height:5px;background:{C['orange']};margin-top:8px;}}
.ct{{padding:4px 56px 0;}}
.hero{{text-align:center;margin:4px 0 8px;}}
.hero-num{{font-family:TF;font-size:140px;color:{C['orange']};line-height:1;}}
.hero-label{{font-size:30px;color:{C['dark']};margin-top:2px;}}
.hero-sub{{font-size:22px;color:{C['mid']};}}
.kpis{{display:flex;justify-content:space-around;margin:10px 0;}}
.kpi{{text-align:center;flex:1;}}
.kpi-num{{display:block;font-family:TF;font-size:40px;color:{C['dark']};}}
.kpi-label{{display:block;font-size:22px;color:{C['text']};}}
.st{{font-family:TF;font-size:28px;color:{C['dark']};margin:10px 0 6px;}}
.tbl{{width:100%;border-collapse:collapse;margin:6px 0;font-size:21px;}}
.tbl th{{background:{C['orange']};color:#fff;padding:8px 10px;text-align:left;font-size:21px;}}
.tbl td{{padding:7px 10px;border-bottom:1px solid {C['mid']}40;}}
.tbl tr:nth-child(even) td{{background:{C['lg']}50;}}
.insight{{background:{C['dark']}08;border-left:5px solid {C['orange']};padding:10px 16px;margin:6px 0;font-size:22px;line-height:1.5;display:flex;align-items:flex-start;}}
.dot{{width:10px;height:10px;background:{C['orange']};border-radius:50%;margin:6px 10px 0 0;flex-shrink:0;}}
.tip{{background:{C['lo']};border-radius:10px;padding:10px 16px;font-size:22px;margin:6px 0;line-height:1.5;color:{C['dark']};}}
.warn{{background:{C['orange']};color:#fff;border-radius:10px;padding:10px 16px;font-size:24px;margin:6px 0;text-align:center;}}
.cl{{margin:4px 0;}}
.cli{{display:flex;align-items:flex-start;margin-bottom:6px;}}
.clt{{flex:1;}}
.cll{{display:block;font-size:24px;color:{C['dark']};margin-bottom:1px;}}
.cld{{display:block;font-size:20px;color:{C['text']};line-height:1.4;}}
.pf{{position:absolute;bottom:22px;left:56px;font-size:17px;color:{C['mid']};}}
</style>'''

html = f'<!DOCTYPE html><html><head><meta charset="utf-8">{CSS}</head><body>'
for i, (t, b) in enumerate(pages):
    badge = f'<div class="pn">{i+1}/{total}</div>' if total > 1 else ""
    html += f'<div class="page"><div class="bar">广东高职高考信息网</div>{badge}<div class="ta"><div class="tt">{t}</div><div class="tl"></div></div><div class="ct">{b}</div><div class="pf">广东高职高考信息网 | {DATE_STR}</div></div>'
html += '</body></html>'
(OUT_DIR / "inner.html").write_text(html, encoding="utf-8")

# ═══════ Playwright 渲染 ═══════
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*total, "height": PAGE_H})
    page.goto(f"file://{OUT_DIR}/inner.html")
    page.wait_for_timeout(3000)
    page.screenshot(path=str(OUT_DIR / "inner-full.png"), full_page=False)
    browser.close()

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

# ═══════ Pillow 封面 ═══════
cover = Image.open(COVER_BG).convert("RGBA")
draw = ImageDraw.Draw(cover)
ft = ImageFont.truetype(str(FONT_T), 155)
fn = ImageFont.truetype(str(FONT_T), 145)
fz = ImageFont.truetype("/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc", 50)

W, top, gap = 1242, 380, 75
y = top
for txt, clr in [(COVER_LINES[0][0], COVER_LINES[0][1]),
                  (COVER_LINES[1][0], COVER_LINES[1][1]),
                  (COVER_LINES[2][0], COVER_LINES[2][1])]:
    font = fn if txt == COVER_LINES[2][0] else ft
    b = draw.textbbox((0,0),txt,font=font)
    draw.text(((W-b[2]+b[0])//2,y),txt,fill=clr,font=font)
    y += b[3]-b[1]+gap
tag = "【热点话题】"; tb = draw.textbbox((0,0),tag,font=fz)
draw.text(((W-tb[2]+tb[0])//2,y+25),tag,fill="#FFFFFF",font=fz)
cover.save(OUT_DIR / "cover.png","PNG",optimize=True)

(OUT_DIR / "小红书文案.txt").write_text(COPYWRITING, encoding="utf-8")
print(f"✅ {TOPIC}: {total}页+封面 → {OUT_DIR}")
