/**
 * 章节迁移脚本 - 将book文件夹的Markdown文件导入数据库
 * 运行方式: npx ts-node scripts/migrate-chapters-to-db.ts
 * 
 * 开发: 卡若
 * 日期: 2026-01-25
 */

import fs from 'fs'
import path from 'path'
import mysql from 'mysql2/promise'

// 数据库配置
const DB_CONFIG = {
  host: '56b4c23f6853c.gz.cdb.myqcloud.com',
  port: 14413,
  user: 'cdb_outerroot',
  password: 'Zhiqun1984',
  database: 'soul_miniprogram',
  charset: 'utf8mb4',
}

// Book目录
const BOOK_DIR = path.join(process.cwd(), 'book')

// 免费章节列表
const FREE_CHAPTERS = ['preface', 'epilogue', '1.1', 'appendix-1', 'appendix-2', 'appendix-3']

// 章节映射配置
interface ChapterConfig {
  id: string
  partId: string
  partTitle: string
  chapterId: string
  chapterTitle: string
  sectionTitle: string
  dir: string
  file: string
  sortOrder: number
}

// 所有章节配置
const CHAPTERS_CONFIG: ChapterConfig[] = [
  // 序言
  { id: 'preface', partId: 'intro', partTitle: '序言', chapterId: 'preface', chapterTitle: '序言', sectionTitle: '为什么我每天早上6点在Soul开播?', dir: '', file: '序言｜为什么我每天早上6点在Soul开播?.md', sortOrder: 0 },
  
  // 第一篇 真实的人
  { id: '1.1', partId: 'part-1', partTitle: '第一篇｜真实的人', chapterId: 'chapter-1', chapterTitle: '第1章｜人与人之间的底层逻辑', sectionTitle: '荷包：电动车出租的被动收入模式', dir: '第一篇｜真实的人/第1章｜人与人之间的底层逻辑', file: '1.1 荷包：电动车出租的被动收入模式.md', sortOrder: 1 },
  { id: '1.2', partId: 'part-1', partTitle: '第一篇｜真实的人', chapterId: 'chapter-1', chapterTitle: '第1章｜人与人之间的底层逻辑', sectionTitle: '老墨:资源整合高手的社交方法', dir: '第一篇｜真实的人/第1章｜人与人之间的底层逻辑', file: '1.2 老墨:资源整合高手的社交方法.md', sortOrder: 2 },
  { id: '1.3', partId: 'part-1', partTitle: '第一篇｜真实的人', chapterId: 'chapter-1', chapterTitle: '第1章｜人与人之间的底层逻辑', sectionTitle: '笑声背后的MBTI：为什么ENTJ适合做资源，INTP适合做系统', dir: '第一篇｜真实的人/第1章｜人与人之间的底层逻辑', file: '1.3 笑声背后的MBTI：为什么ENTJ适合做资源，INTP适合做系统.md', sortOrder: 3 },
  { id: '1.4', partId: 'part-1', partTitle: '第一篇｜真实的人', chapterId: 'chapter-1', chapterTitle: '第1章｜人与人之间的底层逻辑', sectionTitle: '人性的三角结构：利益、情感、价值观', dir: '第一篇｜真实的人/第1章｜人与人之间的底层逻辑', file: '1.4 人性的三角结构：利益、情感、价值观.md', sortOrder: 4 },
  { id: '1.5', partId: 'part-1', partTitle: '第一篇｜真实的人', chapterId: 'chapter-1', chapterTitle: '第1章｜人与人之间的底层逻辑', sectionTitle: '沟通差的问题：为什么你说的别人听不懂', dir: '第一篇｜真实的人/第1章｜人与人之间的底层逻辑', file: '1.5 沟通差的问题：为什么你说的别人听不懂.md', sortOrder: 5 },
  
  { id: '2.1', partId: 'part-1', partTitle: '第一篇｜真实的人', chapterId: 'chapter-2', chapterTitle: '第2章｜人性困境案例', sectionTitle: '相亲故事:你以为找的是人,实际是在找模式', dir: '第一篇｜真实的人/第2章｜人性困境案例', file: '2.1 相亲故事:你以为找的是人,实际是在找模式.md', sortOrder: 6 },
  { id: '2.2', partId: 'part-1', partTitle: '第一篇｜真实的人', chapterId: 'chapter-2', chapterTitle: '第2章｜人性困境案例', sectionTitle: '找工作迷茫者:为什么简历解决不了人生', dir: '第一篇｜真实的人/第2章｜人性困境案例', file: '2.2 找工作迷茫者:为什么简历解决不了人生.md', sortOrder: 7 },
  { id: '2.3', partId: 'part-1', partTitle: '第一篇｜真实的人', chapterId: 'chapter-2', chapterTitle: '第2章｜人性困境案例', sectionTitle: '撸运费险:小钱困住大脑的真实心理', dir: '第一篇｜真实的人/第2章｜人性困境案例', file: '2.3 撸运费险:小钱困住大脑的真实心理.md', sortOrder: 8 },
  { id: '2.4', partId: 'part-1', partTitle: '第一篇｜真实的人', chapterId: 'chapter-2', chapterTitle: '第2章｜人性困境案例', sectionTitle: '游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力', dir: '第一篇｜真实的人/第2章｜人性困境案例', file: '2.4 游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力.md', sortOrder: 9 },
  { id: '2.5', partId: 'part-1', partTitle: '第一篇｜真实的人', chapterId: 'chapter-2', chapterTitle: '第2章｜人性困境案例', sectionTitle: '健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒', dir: '第一篇｜真实的人/第2章｜人性困境案例', file: '2.5 健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒.md', sortOrder: 10 },
  
  // 第二篇 真实的行业
  { id: '3.1', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-3', chapterTitle: '第3章｜电商篇', sectionTitle: '3000万流水如何跑出来(退税模式解析)', dir: '第二篇｜真实的行业/第3章｜电商篇', file: '3.1 3000万流水如何跑出来(退税模式解析).md', sortOrder: 11 },
  { id: '3.2', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-3', chapterTitle: '第3章｜电商篇', sectionTitle: '供应链之王 vs 打工人:利润不在前端', dir: '第二篇｜真实的行业/第3章｜电商篇', file: '3.2 供应链之王 vs 打工人:利润不在前端.md', sortOrder: 12 },
  { id: '3.3', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-3', chapterTitle: '第3章｜电商篇', sectionTitle: '社区团购的底层逻辑', dir: '第二篇｜真实的行业/第3章｜电商篇', file: '3.3 社区团购的底层逻辑.md', sortOrder: 13 },
  { id: '3.4', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-3', chapterTitle: '第3章｜电商篇', sectionTitle: '跨境电商与退税套利', dir: '第二篇｜真实的行业/第3章｜电商篇', file: '3.4 跨境电商与退税套利.md', sortOrder: 14 },
  
  { id: '4.1', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-4', chapterTitle: '第4章｜内容商业篇', sectionTitle: '旅游号:30天10万粉的真实逻辑', dir: '第二篇｜真实的行业/第4章｜内容商业篇', file: '4.1 旅游号:30天10万粉的真实逻辑.md', sortOrder: 15 },
  { id: '4.2', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-4', chapterTitle: '第4章｜内容商业篇', sectionTitle: '做号工厂:如何让一个号变成一个机器', dir: '第二篇｜真实的行业/第4章｜内容商业篇', file: '4.2 做号工厂:如何让一个号变成一个机器.md', sortOrder: 16 },
  { id: '4.3', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-4', chapterTitle: '第4章｜内容商业篇', sectionTitle: '情绪内容为什么比专业内容更赚钱', dir: '第二篇｜真实的行业/第4章｜内容商业篇', file: '4.3 情绪内容为什么比专业内容更赚钱.md', sortOrder: 17 },
  { id: '4.4', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-4', chapterTitle: '第4章｜内容商业篇', sectionTitle: '猫与宠物号:为什么宠物赛道永不过时', dir: '第二篇｜真实的行业/第4章｜内容商业篇', file: '4.4 猫与宠物号:为什么宠物赛道永不过时.md', sortOrder: 18 },
  { id: '4.5', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-4', chapterTitle: '第4章｜内容商业篇', sectionTitle: '直播间里的三种人:演员、技术工、系统流', dir: '第二篇｜真实的行业/第4章｜内容商业篇', file: '4.5 直播间里的三种人:演员、技术工、系统流.md', sortOrder: 19 },
  
  { id: '5.1', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-5', chapterTitle: '第5章｜传统行业篇', sectionTitle: '拍卖行抱朴：一天240万的摇号生意', dir: '第二篇｜真实的行业/第5章｜传统行业篇', file: '5.1 拍卖行抱朴：一天240万的摇号生意.md', sortOrder: 20 },
  { id: '5.2', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-5', chapterTitle: '第5章｜传统行业篇', sectionTitle: '土地拍卖：招拍挂背后的游戏规则', dir: '第二篇｜真实的行业/第5章｜传统行业篇', file: '5.2 土地拍卖：招拍挂背后的游戏规则.md', sortOrder: 21 },
  { id: '5.3', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-5', chapterTitle: '第5章｜传统行业篇', sectionTitle: '地摊经济数字化：一个月900块的餐车生意', dir: '第二篇｜真实的行业/第5章｜传统行业篇', file: '5.3 地摊经济数字化：一个月900块的餐车生意.md', sortOrder: 22 },
  { id: '5.4', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-5', chapterTitle: '第5章｜传统行业篇', sectionTitle: '不良资产拍卖：我错过的一个亿佣金', dir: '第二篇｜真实的行业/第5章｜传统行业篇', file: '5.4 不良资产拍卖：我错过的一个亿佣金.md', sortOrder: 23 },
  { id: '5.5', partId: 'part-2', partTitle: '第二篇｜真实的行业', chapterId: 'chapter-5', chapterTitle: '第5章｜传统行业篇', sectionTitle: '桶装水李总：跟物业合作的轻资产模式', dir: '第二篇｜真实的行业/第5章｜传统行业篇', file: '5.5 桶装水李总：跟物业合作的轻资产模式.md', sortOrder: 24 },
  
  // 第三篇 真实的错误
  { id: '6.1', partId: 'part-3', partTitle: '第三篇｜真实的错误', chapterId: 'chapter-6', chapterTitle: '第6章｜我人生错过的4件大钱', sectionTitle: '电商财税窗口：2016年的千万级机会', dir: '第三篇｜真实的错误/第6章｜我人生错过的4件大钱', file: '6.1 电商财税窗口：2016年的千万级机会.md', sortOrder: 25 },
  { id: '6.2', partId: 'part-3', partTitle: '第三篇｜真实的错误', chapterId: 'chapter-6', chapterTitle: '第6章｜我人生错过的4件大钱', sectionTitle: '供应链金融：我不懂的杠杆游戏', dir: '第三篇｜真实的错误/第6章｜我人生错过的4件大钱', file: '6.2 供应链金融：我不懂的杠杆游戏.md', sortOrder: 26 },
  { id: '6.3', partId: 'part-3', partTitle: '第三篇｜真实的错误', chapterId: 'chapter-6', chapterTitle: '第6章｜我人生错过的4件大钱', sectionTitle: '内容红利：2019年我为什么没做抖音', dir: '第三篇｜真实的错误/第6章｜我人生错过的4件大钱', file: '6.3 内容红利：2019年我为什么没做抖音.md', sortOrder: 27 },
  { id: '6.4', partId: 'part-3', partTitle: '第三篇｜真实的错误', chapterId: 'chapter-6', chapterTitle: '第6章｜我人生错过的4件大钱', sectionTitle: '数据资产化：我还在观望的未来机会', dir: '第三篇｜真实的错误/第6章｜我人生错过的4件大钱', file: '6.4 数据资产化：我还在观望的未来机会.md', sortOrder: 28 },
  
  { id: '7.1', partId: 'part-3', partTitle: '第三篇｜真实的错误', chapterId: 'chapter-7', chapterTitle: '第7章｜别人犯的错误', sectionTitle: '投资房年轻人的迷茫:资金 vs 能力', dir: '第三篇｜真实的错误/第7章｜别人犯的错误', file: '7.1 投资房年轻人的迷茫:资金 vs 能力.md', sortOrder: 29 },
  { id: '7.2', partId: 'part-3', partTitle: '第三篇｜真实的错误', chapterId: 'chapter-7', chapterTitle: '第7章｜别人犯的错误', sectionTitle: '信息差骗局:永远有人靠卖学习赚钱', dir: '第三篇｜真实的错误/第7章｜别人犯的错误', file: '7.2 信息差骗局:永远有人靠卖学习赚钱.md', sortOrder: 30 },
  { id: '7.3', partId: 'part-3', partTitle: '第三篇｜真实的错误', chapterId: 'chapter-7', chapterTitle: '第7章｜别人犯的错误', sectionTitle: '在Soul找恋爱但想赚钱的人', dir: '第三篇｜真实的错误/第7章｜别人犯的错误', file: '7.3 在Soul找恋爱但想赚钱的人.md', sortOrder: 31 },
  { id: '7.4', partId: 'part-3', partTitle: '第三篇｜真实的错误', chapterId: 'chapter-7', chapterTitle: '第7章｜别人犯的错误', sectionTitle: '创业者的三种死法:冲动、轻信、没结构', dir: '第三篇｜真实的错误/第7章｜别人犯的错误', file: '7.4 创业者的三种死法:冲动、轻信、没结构.md', sortOrder: 32 },
  { id: '7.5', partId: 'part-3', partTitle: '第三篇｜真实的错误', chapterId: 'chapter-7', chapterTitle: '第7章｜别人犯的错误', sectionTitle: '人情生意的终点:关系越多亏得越多', dir: '第三篇｜真实的错误/第7章｜别人犯的错误', file: '7.5 人情生意的终点:关系越多亏得越多.md', sortOrder: 33 },
  
  // 第四篇 真实的赚钱
  { id: '8.1', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-8', chapterTitle: '第8章｜底层结构', sectionTitle: '流量杠杆:抖音、Soul、飞书', dir: '第四篇｜真实的赚钱/第8章｜底层结构', file: '8.1 流量杠杆:抖音、Soul、飞书.md', sortOrder: 34 },
  { id: '8.2', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-8', chapterTitle: '第8章｜底层结构', sectionTitle: '价格杠杆:供应链与信息差', dir: '第四篇｜真实的赚钱/第8章｜底层结构', file: '8.2 价格杠杆:供应链与信息差.md', sortOrder: 35 },
  { id: '8.3', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-8', chapterTitle: '第8章｜底层结构', sectionTitle: '时间杠杆:自动化 + AI', dir: '第四篇｜真实的赚钱/第8章｜底层结构', file: '8.3 时间杠杆:自动化 + AI.md', sortOrder: 36 },
  { id: '8.4', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-8', chapterTitle: '第8章｜底层结构', sectionTitle: '情绪杠杆:咨询、婚恋、生意场', dir: '第四篇｜真实的赚钱/第8章｜底层结构', file: '8.4 情绪杠杆:咨询、婚恋、生意场.md', sortOrder: 37 },
  { id: '8.5', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-8', chapterTitle: '第8章｜底层结构', sectionTitle: '社交杠杆:认识谁比你会什么更重要', dir: '第四篇｜真实的赚钱/第8章｜底层结构', file: '8.5 社交杠杆:认识谁比你会什么更重要.md', sortOrder: 38 },
  { id: '8.6', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-8', chapterTitle: '第8章｜底层结构', sectionTitle: '云阿米巴:分不属于自己的钱', dir: '第四篇｜真实的赚钱/第8章｜底层结构', file: '8.6 云阿米巴:分不属于自己的钱.md', sortOrder: 39 },
  
  { id: '9.1', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '游戏账号私域:账号即资产', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.1 游戏账号私域:账号即资产.md', sortOrder: 40 },
  { id: '9.2', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '健康包模式:高复购、高毛利', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.2 健康包模式:高复购、高毛利.md', sortOrder: 41 },
  { id: '9.3', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '药物私域:长期关系赛道', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.3 药物私域:长期关系赛道.md', sortOrder: 42 },
  { id: '9.4', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '残疾机构合作:退税 × AI × 人力成本', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.4 残疾机构合作:退税 × AI × 人力成本.md', sortOrder: 43 },
  { id: '9.5', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '私域银行:粉丝即小股东', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.5 私域银行:粉丝即小股东.md', sortOrder: 44 },
  { id: '9.6', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: 'Soul派对房:陌生人成交的最快场景', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.6 Soul派对房:陌生人成交的最快场景.md', sortOrder: 45 },
  { id: '9.7', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '飞书中台:从聊天到成交的流程化体系', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.7 飞书中台:从聊天到成交的流程化体系.md', sortOrder: 46 },
  { id: '9.8', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '餐饮女孩：6万营收、1万利润的死撑生意', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.8 餐饮女孩：6万营收、1万利润的死撑生意.md', sortOrder: 47 },
  { id: '9.9', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '电竞生态：从陪玩到签约到酒店的完整链条', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.9 电竞生态：从陪玩到签约到酒店的完整链条.md', sortOrder: 48 },
  { id: '9.10', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '淘客大佬：损耗30%的白色通道', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.10 淘客大佬：损耗30%的白色通道.md', sortOrder: 49 },
  { id: '9.11', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '蔬菜供应链：农户才是最赚钱的人', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.11 蔬菜供应链：农户才是最赚钱的人.md', sortOrder: 50 },
  { id: '9.12', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '美业整合：一个人的公司如何月入十万', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.12 美业整合：一个人的公司如何月入十万.md', sortOrder: 51 },
  { id: '9.13', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: 'AI工具推广：一个隐藏的高利润赛道', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.13 AI工具推广：一个隐藏的高利润赛道.md', sortOrder: 52 },
  { id: '9.14', partId: 'part-4', partTitle: '第四篇｜真实的赚钱', chapterId: 'chapter-9', chapterTitle: '第9章｜我在Soul上亲访的赚钱案例', sectionTitle: '大健康私域：一个月150万的70后', dir: '第四篇｜真实的赚钱/第9章｜我在Soul上亲访的赚钱案例', file: '9.14 大健康私域：一个月150万的70后.md', sortOrder: 53 },
  
  // 第五篇 真实的社会
  { id: '10.1', partId: 'part-5', partTitle: '第五篇｜真实的社会', chapterId: 'chapter-10', chapterTitle: '第10章｜未来职业的变化趋势', sectionTitle: 'AI时代：哪些工作会消失，哪些会崛起', dir: '第五篇｜真实的社会/第10章｜未来职业的变化趋势', file: '10.1 AI时代：哪些工作会消失，哪些会崛起.md', sortOrder: 54 },
  { id: '10.2', partId: 'part-5', partTitle: '第五篇｜真实的社会', chapterId: 'chapter-10', chapterTitle: '第10章｜未来职业的变化趋势', sectionTitle: '一人公司：为什么越来越多人选择单干', dir: '第五篇｜真实的社会/第10章｜未来职业的变化趋势', file: '10.2 一人公司：为什么越来越多人选择单干.md', sortOrder: 55 },
  { id: '10.3', partId: 'part-5', partTitle: '第五篇｜真实的社会', chapterId: 'chapter-10', chapterTitle: '第10章｜未来职业的变化趋势', sectionTitle: '为什么链接能力会成为第一价值', dir: '第五篇｜真实的社会/第10章｜未来职业的变化趋势', file: '10.3 为什么链接能力会成为第一价值.md', sortOrder: 56 },
  { id: '10.4', partId: 'part-5', partTitle: '第五篇｜真实的社会', chapterId: 'chapter-10', chapterTitle: '第10章｜未来职业的变化趋势', sectionTitle: '新型公司:Soul-飞书-线下的三位一体', dir: '第五篇｜真实的社会/第10章｜未来职业的变化趋势', file: '10.4 新型公司:Soul-飞书-线下的三位一体.md', sortOrder: 57 },
  
  { id: '11.1', partId: 'part-5', partTitle: '第五篇｜真实的社会', chapterId: 'chapter-11', chapterTitle: '第11章｜中国社会商业生态的未来', sectionTitle: '私域经济：为什么流量越来越贵', dir: '第五篇｜真实的社会/第11章｜中国社会商业生态的未来', file: '11.1 私域经济：为什么流量越来越贵.md', sortOrder: 58 },
  { id: '11.2', partId: 'part-5', partTitle: '第五篇｜真实的社会', chapterId: 'chapter-11', chapterTitle: '第11章｜中国社会商业生态的未来', sectionTitle: '银发经济与孤独经济：两个被忽视的万亿市场', dir: '第五篇｜真实的社会/第11章｜中国社会商业生态的未来', file: '11.2 银发经济与孤独经济：两个被忽视的万亿市场.md', sortOrder: 59 },
  { id: '11.3', partId: 'part-5', partTitle: '第五篇｜真实的社会', chapterId: 'chapter-11', chapterTitle: '第11章｜中国社会商业生态的未来', sectionTitle: '流量红利的终局', dir: '第五篇｜真实的社会/第11章｜中国社会商业生态的未来', file: '11.3 流量红利的终局.md', sortOrder: 60 },
  { id: '11.4', partId: 'part-5', partTitle: '第五篇｜真实的社会', chapterId: 'chapter-11', chapterTitle: '第11章｜中国社会商业生态的未来', sectionTitle: '大模型 + 供应链的组合拳', dir: '第五篇｜真实的社会/第11章｜中国社会商业生态的未来', file: '11.4 大模型 + 供应链的组合拳.md', sortOrder: 61 },
  { id: '11.5', partId: 'part-5', partTitle: '第五篇｜真实的社会', chapterId: 'chapter-11', chapterTitle: '第11章｜中国社会商业生态的未来', sectionTitle: '社会分层的最终逻辑', dir: '第五篇｜真实的社会/第11章｜中国社会商业生态的未来', file: '11.5 社会分层的最终逻辑.md', sortOrder: 62 },
  
  // 尾声
  { id: 'epilogue', partId: 'outro', partTitle: '尾声', chapterId: 'epilogue', chapterTitle: '尾声', sectionTitle: '这本书的真实目的', dir: '', file: '尾声｜这本书的真实目的.md', sortOrder: 63 },
  
  // 附录
  { id: 'appendix-1', partId: 'appendix', partTitle: '附录', chapterId: 'appendix', chapterTitle: '附录', sectionTitle: 'Soul派对房精选对话', dir: '附录', file: '附录1｜Soul派对房精选对话.md', sortOrder: 64 },
  { id: 'appendix-2', partId: 'appendix', partTitle: '附录', chapterId: 'appendix', chapterTitle: '附录', sectionTitle: '创业者自检清单', dir: '附录', file: '附录2｜创业者自检清单.md', sortOrder: 65 },
  { id: 'appendix-3', partId: 'appendix', partTitle: '附录', chapterId: 'appendix', chapterTitle: '附录', sectionTitle: '本书提到的工具和资源', dir: '附录', file: '附录3｜本书提到的工具和资源.md', sortOrder: 66 },
]

async function main() {
  console.log('🚀 开始迁移章节内容到数据库...')
  console.log(`📁 Book目录: ${BOOK_DIR}`)
  console.log(`📊 共${CHAPTERS_CONFIG.length}个章节\n`)

  // 连接数据库
  const connection = await mysql.createConnection(DB_CONFIG)
  console.log('✅ 数据库连接成功\n')

  // 创建表（如果不存在）
  await connection.execute(`
    CREATE TABLE IF NOT EXISTS chapters (
      id VARCHAR(20) PRIMARY KEY COMMENT '章节ID，如1.1、preface等',
      part_id VARCHAR(20) NOT NULL COMMENT '所属篇ID，如part-1',
      part_title VARCHAR(100) NOT NULL COMMENT '篇标题，如第一篇｜真实的人',
      chapter_id VARCHAR(20) NOT NULL COMMENT '所属章ID，如chapter-1',
      chapter_title VARCHAR(200) NOT NULL COMMENT '章标题，如第1章｜人与人之间的底层逻辑',
      section_title VARCHAR(200) NOT NULL COMMENT '节标题',
      content LONGTEXT NOT NULL COMMENT '章节正文内容（Markdown格式）',
      word_count INT DEFAULT 0 COMMENT '字数统计',
      is_free BOOLEAN DEFAULT FALSE COMMENT '是否免费章节',
      price DECIMAL(10,2) DEFAULT 1.00 COMMENT '单章价格',
      sort_order INT DEFAULT 0 COMMENT '排序顺序',
      status ENUM('draft', 'published', 'archived') DEFAULT 'published' COMMENT '状态',
      created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      INDEX idx_part_id (part_id),
      INDEX idx_chapter_id (chapter_id),
      INDEX idx_status (status),
      INDEX idx_sort_order (sort_order)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  `)
  console.log('✅ chapters表创建/确认成功\n')

  // 迁移章节
  let successCount = 0
  let errorCount = 0

  for (const config of CHAPTERS_CONFIG) {
    const filePath = path.join(BOOK_DIR, config.dir, config.file)
    
    try {
      if (!fs.existsSync(filePath)) {
        console.log(`⚠️  文件不存在: ${config.id} - ${config.file}`)
        errorCount++
        continue
      }

      const content = fs.readFileSync(filePath, 'utf-8')
      const wordCount = content.replace(/\s/g, '').length
      const isFree = FREE_CHAPTERS.includes(config.id)

      // 使用 REPLACE INTO 实现更新或插入
      await connection.execute(`
        REPLACE INTO chapters (id, part_id, part_title, chapter_id, chapter_title, section_title, content, word_count, is_free, price, sort_order, status)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'published')
      `, [
        config.id,
        config.partId,
        config.partTitle,
        config.chapterId,
        config.chapterTitle,
        config.sectionTitle,
        content,
        wordCount,
        isFree,
        isFree ? 0 : 1,
        config.sortOrder
      ])

      console.log(`✅ ${config.id}: ${config.sectionTitle} (${wordCount}字${isFree ? ' 免费' : ''})`)
      successCount++
    } catch (error) {
      console.log(`❌ ${config.id}: ${error}`)
      errorCount++
    }
  }

  console.log('\n' + '='.repeat(50))
  console.log(`📊 迁移完成: 成功 ${successCount} 个, 失败 ${errorCount} 个`)
  console.log('='.repeat(50))

  // 查询验证
  const [rows] = await connection.execute('SELECT COUNT(*) as count FROM chapters')
  console.log(`\n📚 数据库中共有 ${(rows as any)[0].count} 个章节`)

  await connection.end()
  console.log('\n✅ 数据库连接已关闭')
}

main().catch(console.error)
