#!/usr/bin/env python3
"""Generate Xiaohongshu Notion-style infographic series for doany.ai v2.4 release notes."""

from PIL import Image, ImageDraw, ImageFont
import os

# ── Config ──────────────────────────────────────────────
W, H = 1080, 1440
PAD_X, PAD_Y = 60, 80

# Notion palette
BG       = "#FAFAF8"
TEXT_PRI  = "#37352F"
TEXT_SEC  = "#787774"
ACCENT   = "#4A90D9"
HIGHLIGHT = "#FFF3D6"
DIVIDER  = "#E3E2DE"
TAG_BG   = "#F1F1EF"
WHITE    = "#FFFFFF"
CALLOUT_BG = "#F7F6F3"

OUT_DIR = "xhs-images/doany-smart-workflow"

# ── Fonts ───────────────────────────────────────────────
FONT_PATH = "/System/Library/Fonts/STHeiti Medium.ttc"
FONT_FALLBACK = "/Library/Fonts/Arial Unicode.ttf"

def get_font(size, bold=False):
    for p in [FONT_PATH, FONT_FALLBACK]:
        try:
            return ImageFont.truetype(p, size)
        except:
            continue
    return ImageFont.load_default()

FONT_TITLE  = get_font(44)
FONT_H2     = get_font(32)
FONT_H3     = get_font(26)
FONT_BODY   = get_font(22)
FONT_SMALL  = get_font(18)
FONT_TAG    = get_font(16)
FONT_BIG    = get_font(56)
FONT_NUM    = get_font(36)
FONT_DATA   = get_font(28)

# ── Helpers ─────────────────────────────────────────────
def new_card():
    img = Image.new("RGB", (W, H), BG)
    draw = ImageDraw.Draw(img)
    # outer border
    draw.rounded_rectangle([8, 8, W-9, H-9], radius=12, outline=DIVIDER, width=1)
    return img, draw

def draw_text_centered(draw, text, y, font, fill=TEXT_PRI):
    bbox = draw.textbbox((0,0), text, font=font)
    tw = bbox[2] - bbox[0]
    x = (W - tw) // 2
    draw.text((x, y), text, font=font, fill=fill)
    return bbox[3] - bbox[1]

def draw_text_left(draw, text, x, y, font, fill=TEXT_PRI, max_width=None):
    if max_width:
        # simple word wrap for Chinese
        lines = []
        line = ""
        for ch in text:
            test = line + ch
            bbox = draw.textbbox((0,0), test, font=font)
            if bbox[2] - bbox[0] > max_width:
                lines.append(line)
                line = ch
            else:
                line = test
        if line:
            lines.append(line)
        total_h = 0
        for l in lines:
            draw.text((x, y + total_h), l, font=font, fill=fill)
            bbox = draw.textbbox((0,0), l, font=font)
            total_h += bbox[3] - bbox[1] + 8
        return total_h
    else:
        draw.text((x, y), text, font=font, fill=fill)
        bbox = draw.textbbox((0,0), text, font=font)
        return bbox[3] - bbox[1]

def draw_divider(draw, y, x1=PAD_X, x2=W-PAD_X):
    draw.line([(x1, y), (x2, y)], fill=DIVIDER, width=1)

def draw_callout(draw, text, x, y, width, font=FONT_BODY):
    # Left-border callout box
    lines = []
    line = ""
    for ch in text:
        test = line + ch
        bbox = draw.textbbox((0,0), test, font=font)
        if bbox[2] - bbox[0] > width - 40:
            lines.append(line)
            line = ch
        else:
            line = test
    if line:
        lines.append(line)

    line_h = draw.textbbox((0,0), "测", font=font)[3] + 8
    box_h = len(lines) * line_h + 24

    # Background
    draw.rounded_rectangle([x, y, x+width, y+box_h], radius=6, fill=CALLOUT_BG)
    # Left accent bar
    draw.rectangle([x, y+4, x+4, y+box_h-4], fill=ACCENT)

    for i, l in enumerate(lines):
        draw.text((x + 20, y + 12 + i * line_h), l, font=font, fill=TEXT_SEC)

    return box_h

def draw_tags(draw, tags, y):
    total_w = 0
    tag_data = []
    for t in tags:
        bbox = draw.textbbox((0,0), t, font=FONT_TAG)
        tw = bbox[2] - bbox[0] + 20
        tag_data.append((t, tw))
        total_w += tw + 10

    x = (W - total_w + 10) // 2
    for t, tw in tag_data:
        draw.rounded_rectangle([x, y, x+tw, y+30], radius=15, fill=TAG_BG)
        draw.text((x+10, y+5), t, font=FONT_TAG, fill=TEXT_SEC)
        x += tw + 10

def draw_page_num(draw, num, total):
    text = f"{num}/{total}"
    bbox = draw.textbbox((0,0), text, font=FONT_TAG)
    tw = bbox[2] - bbox[0]
    draw.text((W - PAD_X - tw, H - 50), text, font=FONT_TAG, fill=DIVIDER)

def draw_circled_num(draw, num, cx, cy, r=18):
    draw.ellipse([cx-r, cy-r, cx+r, cy+r], outline=ACCENT, width=2)
    text = str(num)
    bbox = draw.textbbox((0,0), text, font=FONT_H3)
    tw = bbox[2] - bbox[0]
    th = bbox[3] - bbox[1]
    draw.text((cx - tw//2, cy - th//2 - 2), text, font=FONT_H3, fill=ACCENT)

def draw_workflow_icon(draw, cx, cy, icon_type="node"):
    """Draw a simple workflow node icon."""
    r = 24
    draw.rounded_rectangle([cx-r, cy-r, cx+r, cy+r], radius=8, outline=ACCENT, width=2)
    if icon_type == "chat":
        # speech bubble
        draw.rounded_rectangle([cx-12, cy-10, cx+12, cy+6], radius=4, outline=ACCENT, width=2)
        draw.polygon([(cx-4, cy+6), (cx+4, cy+6), (cx, cy+12)], outline=ACCENT)
    elif icon_type == "gear":
        draw.ellipse([cx-10, cy-10, cx+10, cy+10], outline=ACCENT, width=2)
        draw.ellipse([cx-4, cy-4, cx+4, cy+4], fill=ACCENT)
    elif icon_type == "check":
        draw.line([(cx-8, cy), (cx-2, cy+8), (cx+10, cy-8)], fill=ACCENT, width=3)

def draw_title_bar(draw, title, subtitle=None, y_start=PAD_Y):
    """Draw a standard title bar with icon and divider."""
    # Small accent square icon
    draw.rounded_rectangle([PAD_X, y_start+2, PAD_X+8, y_start+34], radius=2, fill=ACCENT)
    h = draw_text_left(draw, title, PAD_X + 20, y_start, FONT_H2, TEXT_PRI)
    y = y_start + h + 8
    if subtitle:
        h2 = draw_text_left(draw, subtitle, PAD_X + 20, y, FONT_SMALL, TEXT_SEC)
        y += h2 + 12
    draw_divider(draw, y)
    return y + 20


# ═══════════════════════════════════════════════════════
# CARD 1: COVER
# ═══════════════════════════════════════════════════════
def card_01_cover():
    img, draw = new_card()

    # Workflow diagram in upper area
    cy_nodes = 400
    nodes = [
        (270, cy_nodes, "chat"),
        (540, cy_nodes, "gear"),
        (810, cy_nodes, "check"),
    ]
    # Connecting arrows
    for i in range(len(nodes)-1):
        x1 = nodes[i][0] + 28
        x2 = nodes[i+1][0] - 28
        y = cy_nodes
        draw.line([(x1, y), (x2, y)], fill=ACCENT, width=2)
        # arrowhead
        draw.polygon([(x2, y), (x2-10, y-6), (x2-10, y+6)], fill=ACCENT)

    for x, y, icon in nodes:
        draw_workflow_icon(draw, x, y, icon)

    # Labels under nodes
    labels = ["输入描述", "AI编排", "工作流就绪"]
    for i, (x, y, _) in enumerate(nodes):
        bbox = draw.textbbox((0,0), labels[i], font=FONT_SMALL)
        tw = bbox[2] - bbox[0]
        draw.text((x - tw//2, y + 35), labels[i], font=FONT_SMALL, fill=TEXT_SEC)

    # Main title
    draw_text_centered(draw, "一句话", 560, FONT_BIG, TEXT_PRI)
    draw_text_centered(draw, "搞定整条AI工作流", 640, FONT_TITLE, TEXT_PRI)

    # Accent underline
    draw.rounded_rectangle([340, 700, 740, 704], radius=2, fill=ACCENT)

    # Subtitle
    draw_text_centered(draw, "doany.ai v2.4 · Smart Workflow Builder", 740, FONT_H3, TEXT_SEC)

    # Version badge
    badge_text = "v2.4 重磅更新"
    bbox = draw.textbbox((0,0), badge_text, font=FONT_SMALL)
    bw = bbox[2] - bbox[0] + 24
    bx = (W - bw) // 2
    draw.rounded_rectangle([bx, 810, bx+bw, 846], radius=18, outline=ACCENT, width=2)
    draw.text((bx+12, 815), badge_text, font=FONT_SMALL, fill=ACCENT)

    # Decorative dots
    for i in range(5):
        x = 200 + i * 170
        draw.ellipse([x, 900, x+4, 904], fill=DIVIDER)

    # Tags
    draw_tags(draw, ["#AI工具", "#效率神器", "#工作流自动化"], 1300)

    draw_page_num(draw, 1, 7)
    return img


# ═══════════════════════════════════════════════════════
# CARD 2: Core Features Part 1
# ═══════════════════════════════════════════════════════
def card_02_core_features():
    img, draw = new_card()

    y = draw_title_bar(draw, "核心功能 · 上篇", "自然语言创建 + 可视化编辑")

    features = [
        ("1", "自然语言创建工作流", [
            "输入一句话描述任务",
            "AI 自动拆解为多个步骤",
            "支持中英文混合输入",
            "智能识别任务依赖关系"
        ]),
        ("2", "可视化流程编辑器", [
            "全新拖拽式画布",
            "支持分支、并行、条件判断",
            "实时预览每个节点的输入输出",
            "一键导出为可分享模板"
        ]),
    ]

    for num, title, points in features:
        y += 10
        draw_circled_num(draw, num, PAD_X + 22, y + 16)
        draw_text_left(draw, title, PAD_X + 54, y, FONT_H3, TEXT_PRI)
        y += 44

        for p in points:
            # bullet point
            draw.ellipse([PAD_X + 54, y + 10, PAD_X + 60, y + 16], fill=ACCENT)
            h = draw_text_left(draw, p, PAD_X + 72, y, FONT_BODY, TEXT_PRI, max_width=W - PAD_X*2 - 80)
            y += max(h, 32) + 4

        y += 16
        if num == "1":
            draw_divider(draw, y, PAD_X + 20, W - PAD_X)
            y += 16

    # Callout
    y += 20
    draw_callout(draw, "告别复杂配置，用说话的方式搭建工作流", PAD_X, y, W - PAD_X*2)

    draw_page_num(draw, 2, 7)
    return img


# ═══════════════════════════════════════════════════════
# CARD 3: Template Library
# ═══════════════════════════════════════════════════════
def card_03_templates():
    img, draw = new_card()

    y = draw_title_bar(draw, "50+ 模板，开箱即用", "覆盖内容创作、数据分析、客服自动化等场景")

    items = [
        ("01", "内容创作", "批量生成 + 多平台适配 + 自动排期发布"),
        ("02", "数据分析", "数据采集 → 清洗 → 图表 → 发送周报"),
        ("03", "客服自动化", "用户消息 → 意图识别 → 智能分派AI/人工"),
        ("04", "代码审查", "PR提交 → 代码扫描 → AI Review → 汇总"),
        ("05", "社区市场", "用户可自由发布和下载社区模板"),
    ]

    for num, title, desc in items:
        y += 8
        # Number badge
        draw.rounded_rectangle([PAD_X, y, PAD_X + 50, y + 36], radius=6, fill=TAG_BG)
        bbox = draw.textbbox((0,0), num, font=FONT_H3)
        tw = bbox[2] - bbox[0]
        draw.text((PAD_X + 25 - tw//2, y + 3), num, font=FONT_H3, fill=ACCENT)

        # Title
        draw_text_left(draw, title, PAD_X + 64, y + 2, FONT_H3, TEXT_PRI)
        y += 44

        # Description
        h = draw_text_left(draw, desc, PAD_X + 64, y, FONT_BODY, TEXT_SEC, max_width=W - PAD_X*2 - 72)
        y += max(h, 28) + 16

        draw_divider(draw, y, PAD_X + 64, W - PAD_X)
        y += 8

    # Callout
    y += 24
    draw_callout(draw, "参数化配置，一键适配不同业务场景", PAD_X, y, W - PAD_X*2)

    draw_page_num(draw, 3, 7)
    return img


# ═══════════════════════════════════════════════════════
# CARD 4: Multi-Model Collaboration
# ═══════════════════════════════════════════════════════
def card_04_multimodel():
    img, draw = new_card()

    y = draw_title_bar(draw, "多模型协作", "省钱又省心")

    features = [
        ("混合调用", "单工作流内可混合使用多种模型", "Claude · GPT · Gemini · 更多"),
        ("智能路由", "根据任务类型自动选择最优模型", "复杂推理 → Claude  |  快速回答 → GPT"),
        ("成本优化", "简单任务自动降级到轻量模型", "节省 40% token 费用"),
    ]

    for i, (title, desc, detail) in enumerate(features):
        y += 16

        # Feature card with background
        card_h = 200
        draw.rounded_rectangle([PAD_X, y, W-PAD_X, y+card_h], radius=8, fill=WHITE, outline=DIVIDER, width=1)

        # Circled number
        draw_circled_num(draw, i+1, PAD_X + 36, y + 36)

        # Title
        draw_text_left(draw, title, PAD_X + 68, y + 22, FONT_H3, TEXT_PRI)

        # Description
        draw_text_left(draw, desc, PAD_X + 24, y + 70, FONT_BODY, TEXT_PRI, max_width=W - PAD_X*2 - 48)

        # Detail in lighter color
        draw_text_left(draw, detail, PAD_X + 24, y + 110, FONT_SMALL, TEXT_SEC, max_width=W - PAD_X*2 - 48)

        # Highlight bar for cost savings
        if i == 2:
            # Savings highlight
            savings = "40%"
            bbox = draw.textbbox((0,0), savings, font=FONT_BIG)
            sw = bbox[2] - bbox[0]
            draw.text((W - PAD_X - sw - 30, y + 120), savings, font=FONT_BIG, fill=ACCENT)

        y += card_h

    # Callout
    y += 30
    draw_callout(draw, "一个工作流，多个大脑协作 — 省40%费用", PAD_X, y, W - PAD_X*2)

    draw_page_num(draw, 4, 7)
    return img


# ═══════════════════════════════════════════════════════
# CARD 5: Enterprise Features
# ═══════════════════════════════════════════════════════
def card_05_enterprise():
    img, draw = new_card()

    y = draw_title_bar(draw, "企业级，稳得住", "从个人工具到企业基础设施")

    # 2x2 grid of feature cards
    features = [
        ("团队协作", "多人同时编辑\n实时同步"),
        ("权限管理", "细粒度角色控制\n数据访问管理"),
        ("审计日志", "完整记录每次\n工作流执行"),
        ("API 网关", "一键发布为\nREST API"),
    ]

    grid_pad = 16
    card_w = (W - PAD_X*2 - grid_pad) // 2
    card_h = 240

    for i, (title, desc) in enumerate(features):
        col = i % 2
        row = i // 2
        cx = PAD_X + col * (card_w + grid_pad)
        cy = y + 20 + row * (card_h + grid_pad)

        # Card background
        draw.rounded_rectangle([cx, cy, cx+card_w, cy+card_h], radius=8, fill=WHITE, outline=DIVIDER, width=1)

        # Accent bar at top
        draw.rounded_rectangle([cx+16, cy+16, cx+card_w-16, cy+20], radius=2, fill=ACCENT)

        # Icon area (circled number)
        draw_circled_num(draw, i+1, cx + card_w//2, cy + 56)

        # Title
        bbox = draw.textbbox((0,0), title, font=FONT_H3)
        tw = bbox[2] - bbox[0]
        draw.text((cx + card_w//2 - tw//2, cy + 90), title, font=FONT_H3, fill=TEXT_PRI)

        # Description lines
        for j, line in enumerate(desc.split("\n")):
            bbox = draw.textbbox((0,0), line, font=FONT_BODY)
            tw = bbox[2] - bbox[0]
            draw.text((cx + card_w//2 - tw//2, cy + 140 + j*34), line, font=FONT_BODY, fill=TEXT_SEC)

    # Bottom callout
    bottom_y = y + 20 + 2*(card_h + grid_pad) + 30
    draw_callout(draw, "从个人工具到企业基础设施，一步到位", PAD_X, bottom_y, W - PAD_X*2)

    draw_page_num(draw, 5, 7)
    return img


# ═══════════════════════════════════════════════════════
# CARD 6: Performance Data
# ═══════════════════════════════════════════════════════
def card_06_performance():
    img, draw = new_card()

    y = draw_title_bar(draw, "性能飞跃", "数据说话")

    # Table header
    y += 10
    cols = [PAD_X, PAD_X + 260, PAD_X + 500, PAD_X + 720]
    headers = ["指标", "v2.3", "v2.4", "提升"]

    # Header row background
    draw.rounded_rectangle([PAD_X, y, W-PAD_X, y+50], radius=6, fill=TAG_BG)
    for i, (cx, h) in enumerate(zip(cols, headers)):
        draw.text((cx + 16, y + 12), h, font=FONT_H3, fill=TEXT_PRI)
    y += 60

    # Data rows
    data = [
        ("工作流启动延迟", "2.1s", "0.4s", "5x faster"),
        ("并行任务上限", "10", "50", "5x capacity"),
        ("模板加载速度", "1.8s", "0.3s", "6x faster"),
        ("最大工作流步骤", "20", "100", "5x larger"),
    ]

    for metric, old, new, boost in data:
        y += 4
        row_h = 90

        # Alternating subtle background
        draw.rounded_rectangle([PAD_X, y, W-PAD_X, y+row_h], radius=4, fill=WHITE, outline=DIVIDER, width=1)

        # Metric name
        draw_text_left(draw, metric, cols[0] + 16, y + 14, FONT_BODY, TEXT_PRI, max_width=230)

        # Old value (crossed out feel - gray)
        draw.text((cols[1] + 16, y + 14), old, font=FONT_DATA, fill=TEXT_SEC)
        # strikethrough line
        bbox_old = draw.textbbox((cols[1] + 16, y + 14), old, font=FONT_DATA)
        mid_y = (bbox_old[1] + bbox_old[3]) // 2
        draw.line([(bbox_old[0], mid_y), (bbox_old[2], mid_y)], fill=TEXT_SEC, width=2)

        # New value (accent)
        draw.text((cols[2] + 16, y + 14), new, font=FONT_DATA, fill=ACCENT)

        # Boost badge
        draw.text((cols[3] + 8, y + 14), boost, font=FONT_SMALL, fill=ACCENT)

        y += row_h + 4

    # Summary callout
    y += 30
    draw_callout(draw, "全面提速，工作流规模扩大5倍", PAD_X, y, W - PAD_X*2)

    # Visual bars showing improvement
    y += 100
    bar_labels = ["启动速度", "并行能力", "加载速度", "流程规模"]
    bar_pcts = [0.8, 0.8, 0.83, 0.8]  # visual representation

    for label, pct in zip(bar_labels, bar_pcts):
        draw.text((PAD_X, y), label, font=FONT_SMALL, fill=TEXT_SEC)
        bar_x = PAD_X + 140
        bar_w = W - PAD_X*2 - 140
        # Background bar
        draw.rounded_rectangle([bar_x, y+2, bar_x + bar_w, y+22], radius=11, fill=TAG_BG)
        # Filled bar
        draw.rounded_rectangle([bar_x, y+2, bar_x + int(bar_w * pct), y+22], radius=11, fill=ACCENT)
        y += 36

    draw_page_num(draw, 6, 7)
    return img


# ═══════════════════════════════════════════════════════
# CARD 7: Pricing & CTA
# ═══════════════════════════════════════════════════════
def card_07_pricing():
    img, draw = new_card()

    y = draw_title_bar(draw, "现在开始，免费体验")

    tiers = [
        ("免费版", "¥0", [
            "每月100次工作流执行",
            "最多5个步骤",
            "基础模板库",
        ], False),
        ("Pro 版", "$29/月", [
            "无限工作流执行",
            "最多50个步骤",
            "优先模型调用",
            "全部模板库",
        ], True),
        ("团队版", "$99/月起", [
            "所有Pro功能",
            "团队协作",
            "审计日志 + SSO",
            "专属客户支持",
        ], False),
    ]

    card_w = (W - PAD_X*2 - 32) // 3
    card_h = 460

    for i, (name, price, features, highlight) in enumerate(tiers):
        cx = PAD_X + i * (card_w + 16)
        cy = y + 10

        border_color = ACCENT if highlight else DIVIDER
        border_width = 2 if highlight else 1
        bg = WHITE

        draw.rounded_rectangle([cx, cy, cx+card_w, cy+card_h], radius=8, fill=bg, outline=border_color, width=border_width)

        if highlight:
            # "推荐" badge
            badge = "推荐"
            bbox = draw.textbbox((0,0), badge, font=FONT_TAG)
            bw = bbox[2] - bbox[0] + 16
            bx = cx + card_w//2 - bw//2
            draw.rounded_rectangle([bx, cy-14, bx+bw, cy+14], radius=14, fill=ACCENT)
            draw.text((bx+8, cy-10), badge, font=FONT_TAG, fill=WHITE)

        # Tier name
        bbox = draw.textbbox((0,0), name, font=FONT_H3)
        tw = bbox[2] - bbox[0]
        draw.text((cx + card_w//2 - tw//2, cy + 30), name, font=FONT_H3, fill=TEXT_PRI)

        # Price
        bbox = draw.textbbox((0,0), price, font=FONT_H2)
        tw = bbox[2] - bbox[0]
        price_color = ACCENT if highlight else TEXT_PRI
        draw.text((cx + card_w//2 - tw//2, cy + 76), price, font=FONT_H2, fill=price_color)

        # Divider
        draw.line([(cx+16, cy+128), (cx+card_w-16, cy+128)], fill=DIVIDER, width=1)

        # Features
        fy = cy + 148
        for feat in features:
            # checkmark
            draw.text((cx+16, fy), "✓", font=FONT_BODY, fill=ACCENT)
            draw_text_left(draw, feat, cx+42, fy, FONT_SMALL, TEXT_PRI, max_width=card_w-58)
            fy += 38

    # CTA section
    cta_y = y + card_h + 60

    # CTA box
    draw.rounded_rectangle([PAD_X + 100, cta_y, W - PAD_X - 100, cta_y + 60], radius=30, fill=ACCENT)
    cta_text = "doany.ai/workflows  立即体验 →"
    bbox = draw.textbbox((0,0), cta_text, font=FONT_H3)
    tw = bbox[2] - bbox[0]
    draw.text(((W - tw)//2, cta_y + 14), cta_text, font=FONT_H3, fill=WHITE)

    # Tags
    draw_tags(draw, ["#doany", "#AI工作流", "#效率工具", "#SaaS"], cta_y + 100)

    draw_page_num(draw, 7, 7)
    return img


# ═══════════════════════════════════════════════════════
# MAIN
# ═══════════════════════════════════════════════════════
if __name__ == "__main__":
    os.makedirs(OUT_DIR, exist_ok=True)

    cards = [
        (card_01_cover, "01-cover-doany-workflow"),
        (card_02_core_features, "02-content-core-features"),
        (card_03_templates, "03-content-templates"),
        (card_04_multimodel, "04-content-multimodel"),
        (card_05_enterprise, "05-content-enterprise"),
        (card_06_performance, "06-content-performance"),
        (card_07_pricing, "07-ending-pricing-cta"),
    ]

    for func, name in cards:
        print(f"Generating {name}...")
        img = func()
        path = os.path.join(OUT_DIR, f"{name}.png")
        img.save(path, "PNG", quality=95)
        print(f"  ✓ Saved: {path}")

    print(f"\nAll {len(cards)} images generated successfully!")
