"""§1 AI 编程工具基础 · 9 张内容页 · v1.4 新增

章节定位：开场垫层（§0 Agile/Scrum/TDD）之后、Git 基础（原 §1 → 新 §2）之前。
让学员在写第一行代码之前，先理解 AI 编程范式（Vibe Coding）+ 本课程载体（Claude Code）。

外部入口：main() 调用顺序：
  chapter_intro "AI 工具基础" (1)
  → 章首预测 (2)
  → build_sec_M1_5.build() · 9 张内容 (3-11)
  → takeaway (12)

嵌入 3 张 drawio：
  H1 · AI 编程工具 4 件套对比矩阵
  H2 · Claude Code 6 大核心能力辐射图
  H3 · Claude Code 多 agent 编排原理
"""

from pathlib import Path
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE

from build_main import (
    _fill_ph, _add_textbox, _add_card,
    NAVY, CORAL, CORAL_LIGHT, BLUE_ACCENT, GREEN, GOLD,
    GRAY_300, GRAY_500, GRAY_700, WHITE,
)
from build_sec_M1 import _add_centered_image, _title


# ============================================================
# 9 张内容 slide
# ============================================================

def build_slide_vibe_what(prs):
    """3rd slide: Vibe Coding 是什么 · Karpathy 原文金句 + 定义 + 实战场景"""
    s = prs.slides.add_slide(prs.slide_layouts[3])
    _title(s, "§1 · Vibe Coding 是什么 · Karpathy 2025-02 提出的新范式")

    # 顶部：Karpathy 原文金句卡（CORAL_LIGHT 底）
    _add_card(s, Inches(0.55), Inches(1.45), Inches(12.2), Inches(1.65),
              fill=CORAL_LIGHT, border=CORAL)
    _add_textbox(s, Inches(0.8), Inches(1.55), Inches(11.7), Inches(0.4),
                 "Andrej Karpathy · X · 2025-02-02：",
                 size_pt=15, bold=True, color=CORAL)
    _add_textbox(s, Inches(0.8), Inches(1.95), Inches(11.7), Inches(1.1),
                 '"fully give in to the vibes, embrace exponentials,\n'
                 ' and forget that the code even exists"',
                 size_pt=20, bold=True, color=NAVY, align=PP_ALIGN.CENTER,
                 anchor=MSO_ANCHOR.MIDDLE)

    # 中间：3 个核心特征卡（水平）
    features = [
        ("自然语言驱动", "描述意图 / 跑出结果 · 不写代码而是「描述代码该做什么」", CORAL),
        ("接受 AI 输出", "信任 LLM 写出来的代码 · diff 不必每行审 · 错误粘回 AI 让它修", GOLD),
        ("organically 生长", "代码库随对话演进 · 不预设架构 · 用结果验证而非设计验证", GREEN),
    ]
    card_w = 4.05
    for i, (head, body, c) in enumerate(features):
        x = Inches(0.55 + i * (card_w + 0.05))
        y = Inches(3.4)
        _add_card(s, x, y, Inches(card_w), Inches(2.1),
                  fill=WHITE, border=c, accent=c)
        _add_textbox(s, x + Inches(0.2), y + Inches(0.15), Inches(card_w - 0.4), Inches(0.5),
                     head, size_pt=17, bold=True, color=c)
        _add_textbox(s, x + Inches(0.2), y + Inches(0.7), Inches(card_w - 0.4), Inches(1.3),
                     body, size_pt=13, color=GRAY_700)

    # 底部：上线数据点
    _add_textbox(s, Inches(0.55), Inches(5.85), Inches(12.2), Inches(0.4),
                 "Collins English Dictionary · 2025 Word of the Year（一年内从 tweet 到字典词条）",
                 size_pt=13, color=CORAL, align=PP_ALIGN.CENTER, bold=True)
    _add_textbox(s, Inches(0.55), Inches(6.3), Inches(12.2), Inches(0.4),
                 "原 tweet: x.com/karpathy/status/1886192184808149383 · "
                 "Wikipedia: en.wikipedia.org/wiki/Vibe_coding",
                 size_pt=10, color=GRAY_500, align=PP_ALIGN.CENTER)
    _add_textbox(s, Inches(0.55), Inches(6.75), Inches(12.2), Inches(0.4),
                 "关键点：Vibe Coding 不是工具 · 是「编程范式」转变（自己写 → 让 AI 写）",
                 size_pt=13, color=NAVY, align=PP_ALIGN.CENTER, bold=True)
    return s


def build_slide_vibe_extreme(prs):
    """4th slide: Vibe Coding 极致玩法 · 4 种典型行为"""
    s = prs.slides.add_slide(prs.slide_layouts[3])
    _title(s, "§1 · Vibe Coding 极致玩法 · 4 种典型行为（Karpathy 原版）")

    behaviors = [
        ("1⃣ 语音输入 · SuperWhisper",
         "minimize 键盘 · 嘴说出需求 / 系统转 text / 喂给 LLM",
         "@karpathy 个人实践：边喝咖啡边「说」代码", CORAL),
        ("2⃣ 接受所有 AI 输出",
         "不审 diff · 不读代码 · 直接 commit + 跑",
         "信任 Cursor Composer / Sonnet 输出 = 心法核心", GOLD),
        ("3⃣ 错误粘回 AI",
         "报错信息 / stack trace 直接复制 · 粘回 chat · 让 AI 修",
         "不查文档 · 不 Google · LLM 自迭代", GREEN),
        ("4⃣ organically 生长",
         "无预设架构 / 无设计 doc · 跟着对话走",
         "结果对 = 代码就对 · 不在乎过程", BLUE_ACCENT),
    ]
    for i, (head, body, hint, c) in enumerate(behaviors):
        row, col = i // 2, i % 2
        x = Inches(0.55 + col * 6.25)
        y = Inches(1.5 + row * 2.45)
        _add_card(s, x, y, Inches(6.05), Inches(2.25),
                  fill=WHITE, border=c, accent=c)
        _add_textbox(s, x + Inches(0.25), y + Inches(0.12), Inches(5.55), Inches(0.5),
                     head, size_pt=18, bold=True, color=c)
        _add_textbox(s, x + Inches(0.25), y + Inches(0.7), Inches(5.55), Inches(0.7),
                     body, size_pt=14, color=NAVY)
        _add_textbox(s, x + Inches(0.25), y + Inches(1.5), Inches(5.55), Inches(0.6),
                     f"▎ {hint}", size_pt=12, color=GRAY_500)

    # 底部
    _add_textbox(s, Inches(0.55), Inches(6.55), Inches(12.2), Inches(0.4),
                 "共同点：开发者从「写代码」退到「指挥代码」· 关注点从 syntax 上升到 intent",
                 size_pt=14, bold=True, color=CORAL, align=PP_ALIGN.CENTER)
    _add_textbox(s, Inches(0.55), Inches(6.95), Inches(12.2), Inches(0.3),
                 "适合 1 人玩具项目 / prototype · 不适合多人协作 / 生产环境（下一页解释为什么）",
                 size_pt=11, color=GRAY_700, align=PP_ALIGN.CENTER)
    return s


def build_slide_vibe_sideeffect(prs):
    """5th slide: Vibe Coding 副作用 · 真实案例"""
    s = prs.slides.add_slide(prs.slide_layouts[3])
    _title(s, "§1 · Vibe Coding 副作用 · 一个真实案例 + 3 类风险")

    # 顶部：@nijho.lt 案例（CORAL 边框告警）
    _add_card(s, Inches(0.55), Inches(1.45), Inches(12.2), Inches(1.5),
              fill=CORAL_LIGHT, border=CORAL)
    _add_textbox(s, Inches(0.8), Inches(1.55), Inches(11.7), Inches(0.4),
                 "真实案例 · @nijho.lt 博客 · nijho.lt/post/vibe-coding/",
                 size_pt=14, bold=True, color=CORAL)
    _add_textbox(s, Inches(0.8), Inches(1.95), Inches(11.7), Inches(0.45),
                 "「Vibe coding worked—until the 15-hour cleanup」",
                 size_pt=20, bold=True, color=NAVY, align=PP_ALIGN.CENTER)
    _add_textbox(s, Inches(0.8), Inches(2.45), Inches(11.7), Inches(0.4),
                 "用 vibe coding 跑 prototype 顺利 · 但后续清理 / 测试 / 文档 / 重构花了 15 小时",
                 size_pt=12, color=GRAY_700, align=PP_ALIGN.CENTER)

    # 中间：3 类风险卡（水平）
    risks = [
        ("不可维护",
         "代码无设计 / 无注释 / 命名随意",
         "1 周后自己看不懂 · 新人接手成本指数级", CORAL),
        ("安全风险",
         "AI 可能写出含 secret / SQL 注入 / 路径遍历",
         "Fast Company：「the hidden risks of vibe coding」", GOLD),
        ("技术债爆炸",
         "短期跑通 · 长期 refactor / 调试成本高",
         "「15 小时清理」是有数据的下限 · 大项目更高", BLUE_ACCENT),
    ]
    card_w = 4.05
    for i, (head, body, src, c) in enumerate(risks):
        x = Inches(0.55 + i * (card_w + 0.05))
        y = Inches(3.25)
        _add_card(s, x, y, Inches(card_w), Inches(2.5),
                  fill=WHITE, border=c, accent=c)
        _add_textbox(s, x + Inches(0.2), y + Inches(0.15), Inches(card_w - 0.4), Inches(0.5),
                     head, size_pt=17, bold=True, color=c)
        _add_textbox(s, x + Inches(0.2), y + Inches(0.75), Inches(card_w - 0.4), Inches(0.9),
                     body, size_pt=13, color=NAVY)
        _add_textbox(s, x + Inches(0.2), y + Inches(1.75), Inches(card_w - 0.4), Inches(0.7),
                     f"▎ {src}", size_pt=11, color=GRAY_500)

    # 底部
    _add_textbox(s, Inches(0.55), Inches(6.05), Inches(12.2), Inches(0.4),
                 "不是反对 Vibe Coding · 是反对「无兜底的 Vibe Coding」· AGF 给出取舍方案（最后一张展开）",
                 size_pt=14, bold=True, color=CORAL, align=PP_ALIGN.CENTER)
    _add_textbox(s, Inches(0.55), Inches(6.5), Inches(12.2), Inches(0.4),
                 "fastcompany.com/91527397/the-hidden-risks-of-vibe-coding-4-steps-to-protect-your-organization",
                 size_pt=10, color=GRAY_500, align=PP_ALIGN.CENTER)
    return s


def build_slide_tools_matrix(prs):
    """6th slide: 嵌入 H1 4 件套对比矩阵"""
    s = prs.slides.add_slide(prs.slide_layouts[3])
    _title(s, "§1 · AI 编程工具 4 件套 · 选型矩阵（2026-05）")
    _add_centered_image(s, "H1-ai-tools-matrix.png", top_inch=1.4, height_inch=5.8)
    return s


def build_slide_claude_code_intro(prs):
    """7th slide: Claude Code 是什么 · 5 张关键信息卡"""
    s = prs.slides.add_slide(prs.slide_layouts[3])
    _title(s, "§1 · Claude Code · 本课程的运行环境")

    cards = [
        ("发布时间线", "2025-02 preview / 2025-05 GA（与 Claude 4 同发）", CORAL),
        ("形态",       "Agentic CLI · 终端原生 · 读整个 codebase · 执行 git", NAVY),
        ("核心能力",   "写代码 / 跑测试 / git workflow / 多 agent 编排", GOLD),
        ("安装",       "brew install claude-ai-cli · 或 npm i -g @anthropic/claude-code", GREEN),
        ("采用度",     "2025-07 收入同比 5.5×（Anthropic 官方）", BLUE_ACCENT),
    ]
    for i, (head, body, c) in enumerate(cards):
        row, col = i // 2, i % 2
        x = Inches(0.55 + col * 6.25)
        y = Inches(1.5 + row * 1.4)
        w = Inches(6.05)
        h = Inches(1.25)
        _add_card(s, x, y, w, h, fill=WHITE, border=c, accent=c)
        _add_textbox(s, x + Inches(0.25), y + Inches(0.15), w - Inches(0.5), Inches(0.45),
                     head, size_pt=16, bold=True, color=c)
        _add_textbox(s, x + Inches(0.25), y + Inches(0.65), w - Inches(0.5), Inches(0.55),
                     body, size_pt=13, color=GRAY_700)

    _add_textbox(s, Inches(0.55), Inches(5.75), Inches(12.2), Inches(0.5),
                 "AGF 选 Claude Code 原因：CLI 友好 · 多 agent 原生 · skill / hook 生态完整",
                 size_pt=16, bold=True, color=CORAL, align=PP_ALIGN.CENTER)
    _add_textbox(s, Inches(0.55), Inches(6.4), Inches(12.2), Inches(0.4),
                 "docs.anthropic.com/en/release-notes/claude-code · github.com/anthropics/claude-code",
                 size_pt=11, color=GRAY_500, align=PP_ALIGN.CENTER)
    _add_textbox(s, Inches(0.55), Inches(6.85), Inches(12.2), Inches(0.4),
                 "Simon Willison 2025-10-20 · Claude Code for Web 上线（与 OpenAI Codex Cloud 对标）",
                 size_pt=11, color=GRAY_500, align=PP_ALIGN.CENTER)
    return s


def build_slide_capabilities(prs):
    """8th slide: 嵌入 H2 6 大核心能力辐射图"""
    s = prs.slides.add_slide(prs.slide_layouts[3])
    _title(s, "§1 · Claude Code 6 大核心能力 · 不仅是 CLI 聊天")
    _add_centered_image(s, "H2-claude-code-capabilities.png", top_inch=1.4, height_inch=5.6)
    # 底部：本课程哪一章详讲哪个能力
    _add_textbox(s, Inches(0.55), Inches(7.1), Inches(12.2), Inches(0.35),
                 "本课程拆解：subagent → §3-§6 场景剧本 · hook → §4 机制兜底 · skill → 全程 · Plan Mode → §5 失败回路",
                 size_pt=11, color=NAVY, align=PP_ALIGN.CENTER)
    return s


def build_slide_orchestration(prs):
    """9th slide: 嵌入 H3 多 agent 编排原理"""
    s = prs.slides.add_slide(prs.slide_layouts[3])
    _title(s, "§1 · Claude Code 多 agent 编排原理 · Team Mode + Parallel Dispatch")
    _add_centered_image(s, "H3-claude-code-orchestration.png", top_inch=1.4, height_inch=5.6)
    _add_textbox(s, Inches(0.55), Inches(7.1), Inches(12.2), Inches(0.35),
                 "本课程的 14 同事就是按这个原理跑起来 · §7 综合 Lab 现场跑通完整流程",
                 size_pt=11, color=CORAL, align=PP_ALIGN.CENTER, bold=True)
    return s


def build_slide_hands_on(prs):
    """10th slide: Claude Code 实操 · 第一次跑的 4 步"""
    s = prs.slides.add_slide(prs.slide_layouts[3])
    _title(s, "§1 · Claude Code 实操 · 第一次跑的 4 步")

    steps = [
        ("1⃣ 安装 + 验证",
         "$ brew install claude-ai-cli\n$ claude --version  # 看 v2.1.130+",
         CORAL),
        ("2⃣ 启动交互",
         "$ claude\n> 进入 REPL · 输入自然语言 / 文件路径 / git diff 都可",
         GOLD),
        ("3⃣ 触发 slash command",
         "> /agf-team-start \"做一个旅游明信片生成器\"\n# 自动 spawn product-lead + 进入 Team Mode",
         GREEN),
        ("4⃣ 看 skill 自动触发",
         "PL 自动调 agf-writing-prd skill 写 PRD\n→ skill-suggester hook 提示其他相关 skill",
         BLUE_ACCENT),
    ]
    for i, (head, cmd, c) in enumerate(steps):
        y = Inches(1.5 + i * 1.15)
        _add_card(s, Inches(0.55), y, Inches(12.2), Inches(1.05),
                  fill=WHITE, border=c, accent=c)
        _add_textbox(s, Inches(0.85), y + Inches(0.1), Inches(4.0), Inches(0.5),
                     head, size_pt=17, bold=True, color=c)
        # 命令灰底 box
        _add_card(s, Inches(4.85), y + Inches(0.15), Inches(7.75), Inches(0.8),
                  fill=GRAY_700, border=GRAY_700)
        _add_textbox(s, Inches(5.05), y + Inches(0.2), Inches(7.55), Inches(0.7),
                     cmd, size_pt=11, color=WHITE, bold=True)

    # 底部
    _add_textbox(s, Inches(0.55), Inches(6.2), Inches(12.2), Inches(0.4),
                 "§7 综合 Lab 会现场跑完整 9 步流程 · 现在只演示第 1-4 步建立 mental model",
                 size_pt=13, color=CORAL, bold=True, align=PP_ALIGN.CENTER)
    _add_textbox(s, Inches(0.55), Inches(6.65), Inches(12.2), Inches(0.4),
                 "项目 slash 命令位置：.claude/commands/agf-team-start.md（YAML frontmatter + Markdown 内容）",
                 size_pt=11, color=GRAY_500, align=PP_ALIGN.CENTER)
    _add_textbox(s, Inches(0.55), Inches(7.05), Inches(12.2), Inches(0.4),
                 "skill 位置：.claude/skills/agf-team-start/SKILL.md（YAML frontmatter + Markdown 内容 + 触发条件 description）",
                 size_pt=11, color=GRAY_500, align=PP_ALIGN.CENTER)
    return s


def build_slide_vibe_vs_agf(prs):
    """11th slide: Vibe Coding vs AGF 取舍 · 双栏对比"""
    s = prs.slides.add_slide(prs.slide_layouts[3])
    _title(s, "§1 · Vibe Coding vs AGF · 取舍对比（保速度 + 加兜底）")

    # 左栏：Vibe Coding 极致
    _add_card(s, Inches(0.55), Inches(1.5), Inches(5.95), Inches(5.3),
              fill=WHITE, border=GRAY_500, accent=GRAY_500)
    _add_textbox(s, Inches(0.8), Inches(1.6), Inches(5.5), Inches(0.5),
                 "✗ Vibe Coding 极致（Karpathy 原版）", size_pt=16, bold=True, color=GRAY_700)
    _add_textbox(s, Inches(0.8), Inches(2.1), Inches(5.5), Inches(0.3),
                 "适合 1 人玩具项目 / prototype",
                 size_pt=11, color=GRAY_500)
    vibe_items = [
        "接受所有 AI 生成代码（不审 diff）",
        "用 SuperWhisper 语音输入 minimize 键盘",
        "错误 → 直接贴回 AI 让它修",
        "不写测试 · 不查文档 · organically 生长",
        "结果对 = 代码就对 · 不在乎过程",
        "副作用：15 小时清理 / 安全风险 / 不可维护",
    ]
    for i, item in enumerate(vibe_items):
        _add_textbox(s, Inches(0.95), Inches(2.55 + i * 0.55), Inches(5.4), Inches(0.5),
                     f"▎ {item}", size_pt=13, color=GRAY_700)

    # 右栏：AGF 取舍
    _add_card(s, Inches(6.8), Inches(1.5), Inches(5.95), Inches(5.3),
              fill=WHITE, border=GREEN, accent=GREEN)
    _add_textbox(s, Inches(7.05), Inches(1.6), Inches(5.5), Inches(0.5),
                 "✓ AGF 取舍（保速度 + 加兜底）", size_pt=16, bold=True, color=GREEN)
    _add_textbox(s, Inches(7.05), Inches(2.1), Inches(5.5), Inches(0.3),
                 "适合 14 同事真协作 / 上生产",
                 size_pt=11, color=GRAY_500)
    agf_items = [
        "接受 LLM 速度 · 但 4 层 hook 拦危险命令",
        "skill 强制路径（不走 skill 不行）",
        "DoD 9 项 checklist · 不达标任务不能 done",
        "AC 派单 + dev 自跑 SIT + code review 双 verdict",
        "结果 + 证据 + 可追溯 = 才算 done",
        "目标：享 vibe 速度 · 免 cleanup 灾难",
    ]
    for i, item in enumerate(agf_items):
        _add_textbox(s, Inches(7.2), Inches(2.55 + i * 0.55), Inches(5.4), Inches(0.5),
                     f"▎ {item}", size_pt=13, color=GREEN)

    # 底部
    _add_textbox(s, Inches(0.55), Inches(6.95), Inches(12.2), Inches(0.4),
                 "核心：AGF ≠ 反 Vibe Coding · AGF = Vibe Coding + 机制兜底（接下来 §3-§8 详解兜底如何嵌入）",
                 size_pt=14, bold=True, color=CORAL, align=PP_ALIGN.CENTER)
    return s


# ============================================================
# 主调用
# ============================================================

def build(prs):
    """构建 §1 AI 工具基础 9 张内容 slide
    （chapter_intro / 预测 / takeaway 由 main() 直接调用，不在本 build 内）
    """
    build_slide_vibe_what(prs)              # 3 · Vibe Coding 是什么
    build_slide_vibe_extreme(prs)           # 4 · 极致玩法 4 行为
    build_slide_vibe_sideeffect(prs)        # 5 · 副作用 + 3 类风险
    build_slide_tools_matrix(prs)           # 6 · 4 件套对比矩阵 H1
    build_slide_claude_code_intro(prs)      # 7 · Claude Code 简介
    build_slide_capabilities(prs)           # 8 · 6 大核心能力 H2
    build_slide_orchestration(prs)          # 9 · 多 agent 编排 H3
    build_slide_hands_on(prs)               # 10 · 实操 4 步
    build_slide_vibe_vs_agf(prs)            # 11 · Vibe Coding vs AGF 取舍
