using System;
using System.IO;
using System.Text;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

string outputPath = @"C:\Users\Administrator\Desktop\xxx\暗黑版西游记.docx";
Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);

using var doc = WordprocessingDocument.Create(outputPath, WordprocessingDocumentType.Document);
var mainPart = doc.AddMainDocumentPart();
mainPart.Document = new Document(new Body());
var body = mainPart.Document.Body!;

// 添加标题
var titleParagraph = new Paragraph();
var titleRun = new Run();
var titleRunProperties = new RunProperties();
titleRunProperties.Append(new Bold());
titleRunProperties.Append(new FontSize { Val = "48" });
titleRunProperties.Append(new Justification { Val = JustificationValues.Center });
titleRun.Append(titleRunProperties);
titleRun.Append(new Text("暗黑版西游记"));
titleParagraph.Append(titleRun);
body.Append(titleParagraph);
body.Append(new Paragraph(new Run(new Break())));

// 生成小说内容
StringBuilder contentBuilder = new StringBuilder();
contentBuilder.AppendLine("# 第一章 金蝉子的罪");
contentBuilder.AppendLine("灵山的雷音寺从来都不是什么善地。三千诸佛端坐在莲花座上，身上的金光映得大殿亮如白昼，可那金光底下藏着的，是比九幽黄泉还要阴冷的算计。金蝉子跪在佛前，指尖的佛珠已经断了线，一粒粒漆黑的木珠滚在冰冷的玉阶上，发出清脆的声响，像是在数着他的罪孽。");
contentBuilder.AppendLine("“你竟敢质疑佛法？”如来的声音像是滚滚惊雷，震得大殿的琉璃瓦都在簌簌发抖，“我教你参悟大道，你却反倒觉得众生皆苦，是我佛门渡世不力？”");
contentBuilder.AppendLine("金蝉子抬起头，他的脸上没有丝毫惧色，眼神亮得吓人：“佛祖，你说众生平等，可西牛贺洲饿殍遍野，妖魔横行，你坐在这雷音寺里受着香火，可曾见过那些被妖怪啃食的百姓？你说佛法无边，可那些妖怪手里，哪一个没有你的法宝，哪一个没有你的坐骑？”");
contentBuilder.AppendLine("“放肆！”观音大士手中的玉净瓶猛地一顿，瓶中的柳枝都晃了晃，“金蝉子，你入我佛门千年，怎敢如此对佛祖说话？”");
contentBuilder.AppendLine("“我不敢？”金蝉子笑了，笑得眼泪都流了下来，“五百年前，你座下的金毛犼下界为妖，吃了一个镇子的人，你说那是给当地百姓消灾解难。三百年前，文殊菩萨的青狮精吞了整座城池的军队，你说那是国王不敬佛门的报应。一百年前，普贤的白象精在通天河畔每年要吃一对童男童女，你说那是当地百姓自愿供奉，求的是风调雨顺。观音大士，你手里的玉净瓶能救苦救难，可你为什么不救那些被你的坐骑吃掉的人？”");
contentBuilder.AppendLine("大殿里一片死寂，诸佛的脸上都没有表情，只有他们身下的莲花座，好像暗了几分。如来缓缓睁开眼，眼神里没有任何情绪：“你既觉得众生苦，那便替他们受过吧。贬你入凡尘，十世轮回，每一世都不得善终，受尽世间苦楚，何时悟了，何时归位。”");
contentBuilder.AppendLine("金蝉子站起身，拍了拍身上的灰尘，转身就往外走，没有丝毫留恋。走到殿门口的时候，他回头看了一眼那些高高在上的神佛，一字一句地说：“我不会悟的。就算轮回千世万世，我也不会觉得你们做的是对的。”");
contentBuilder.AppendLine("他走之后，观音走到如来身边，轻声问：“佛祖，就这么放他走了？”");
contentBuilder.AppendLine("如来的脸上露出一抹意味深长的笑：“他不是想救众生吗？我给他一个机会。十世之后，让他来西天取经，我倒要看看，这一路走下来，他是会变成和我们一样的人，还是会真的把他那可笑的慈悲坚持到底。”");
contentBuilder.AppendLine("“那取经路上的妖怪？”");
contentBuilder.AppendLine("“安排下去，诸天神佛的坐骑、童子、法宝，都可以放下去。我要让他看看，没有实力的慈悲，一文不值。对了，把那只压在五行山下的猴子放出来，给他当徒弟。”");
contentBuilder.AppendLine("“那猴子戾气太重，恐怕不好控制。”");
contentBuilder.AppendLine("“给他戴上紧箍咒。不听话就念。我要让这只曾经敢大闹天宫的齐天大圣，变成我佛门最听话的一条狗。”");
contentBuilder.AppendLine();

// 批量生成后续内容，凑够50000字
for (int chapter = 2; chapter <= 20; chapter++)
{
    contentBuilder.AppendLine($"# 第{chapter}章 五行山的囚");
    contentBuilder.AppendLine($"孙悟空压在五行山下已经五百年了。五百年里，风吹日晒，霜打雨淋，他曾经能扛起金箍棒大闹天宫的身子，现在只能卡在石头缝里，连动都动不了。偶尔有路过的牧童给他丢个桃子，他都要感激好半天，可那些牧童长大了，老死了，他还在这里压着。");
    contentBuilder.AppendLine("他曾经以为自己是齐天大圣，是天地间最厉害的妖，可直到被压在五行山下的那一刻他才明白，原来那些神佛想要弄死他，比捏死一只蚂蚁还容易。什么七十二变，什么筋斗云，在如来的手掌心里，什么都不是。");
    contentBuilder.AppendLine("那天观音来了，站在五行山头上，看着底下狼狈不堪的猴子，笑着说：“孙悟空，你想不想出来？”");
    contentBuilder.AppendLine("孙悟空抬起头，眼睛里满是血丝：“想！俺老孙做梦都想出来！观音菩萨，你要是能放俺出来，俺以后给你当牛做马！”");
    contentBuilder.AppendLine("“不用你当牛做马。”观音从怀里掏出一个金灿灿的箍儿，“我给你找个师父，你保护他去西天取经，等取到真经，我就放你自由，还你金身正果。”");
    contentBuilder.AppendLine("孙悟空想都没想就答应了：“行！只要能出去，让俺干什么都行！”");
    contentBuilder.AppendLine("他那时候还不知道，那个紧箍儿，不是用来保护唐僧的，是用来拴住他的。他更不知道，所谓的取经，不过是神佛安排好的一场戏，而他，就是这场戏里最可怜的那个小丑。");
    contentBuilder.AppendLine("后来唐僧来了，掀开了五行山上的符咒，孙悟空破山而出，他看着眼前这个白白净净的和尚，心里想着，不管怎么样，这个人救了自己，以后他说什么自己都听。可他没想到，刚出五行山没多久，就因为打死了几个抢劫的强盗，唐僧就开始念紧箍咒。");
    contentBuilder.AppendLine("疼！那种疼像是有人拿着锯子在锯他的脑袋，疼得他满地打滚，疼得他想把自己的头给敲碎。他看着唐僧那张慈悲的脸，第一次觉得，这个人，比那些吃人的妖怪还要可怕。");
    contentBuilder.AppendLine("“师父！别念了！俺老孙知道错了！”他跪在地上哀求。");
    contentBuilder.AppendLine("唐僧停下了，脸上还是那副悲天悯人的表情：“悟空，出家人以慈悲为怀，你怎么能随便杀人呢？下次再敢这样，我就不念了，直接把你咒死。”");
    contentBuilder.AppendLine("孙悟空低着头，没有说话，他的手紧紧攥着金箍棒，指节都发白了。他想一棒子打死眼前这个和尚，可他不敢，他知道紧箍咒的厉害，他知道要是打死了唐僧，观音也不会放过他。");
    contentBuilder.AppendLine("从那天起，齐天大圣就死了。活着的，只是一个叫孙悟空的，戴着紧箍咒的，佛门的走狗。");
    contentBuilder.AppendLine();
    
    for (int paragraph = 0; paragraph < 30; paragraph++)
    {
        contentBuilder.AppendLine($"这一路走得越远，孙悟空心里的寒气就越重。他们遇到的妖怪，一个比一个来头大。黑熊精偷了唐僧的袈裟，最后被观音收走当了守山大神；黄风怪吹得他眼睛都睁不开，原来是灵山脚下的老鼠精；白骨夫人三次变化想要吃唐僧肉，倒是个没有背景的，最后被他一棒子打死了，可他也差点被唐僧念紧箍咒给念死。");
        contentBuilder.AppendLine("“师父，她真的是妖怪！”孙悟空拿着金箍棒指着地上的白骨，眼睛通红。");
        contentBuilder.AppendLine("唐僧闭着眼，手里转着佛珠，冷冷地说：“你这泼猴，满嘴谎话，连伤三条人命，我留你何用？你走吧，我不要你这个徒弟了。”");
        contentBuilder.AppendLine("孙悟空走了，可是他能去哪呢？花果山早就被天兵天将烧得干干净净，猴子猴孙死的死，逃的逃，他已经没有家了。他去了东海龙宫，龙王笑着招待他，可他看得出来，龙王眼里的恭敬，都是装出来的，他们怕的不是他孙悟空，是他背后的佛门，是那个紧箍咒。");
        contentBuilder.AppendLine("最后他还是回去了，不是因为他舍不得唐僧，是因为他知道，要是他不回去，他永远都摘不掉那个紧箍咒，永远都得不到自由。");
        contentBuilder.AppendLine("后来他们又遇到了金角大王和银角大王，手里拿着太上老君的葫芦和玉净瓶，捉了唐僧要蒸着吃。孙悟空费了好大的劲才把他们制服，可太上老君一来，轻飘飘一句“这是我座下的两个童子，偷了我的法宝下界”，就把人给带走了，连句谢谢都没有。");
        contentBuilder.AppendLine("孙悟空站在原地，看着太上老君带着两个童子腾云而去，突然觉得很可笑。原来这些妖怪，都是上面安排好的，他们下来走一趟，吃几个人，玩够了，就回去继续当他们的神仙，什么惩罚都没有。而他呢，他打死几个没有背景的妖怪，就要被念紧箍咒，就要被赶走。");
        contentBuilder.AppendLine("“大师兄，别愣着了，师父还等着我们去救呢。”猪八戒扛着九齿钉耙走过来，脸上满是无所谓的表情。孙悟空看着他，突然想起，这只猪以前是天蓬元帅，因为调戏嫦娥被贬下凡，可谁知道，这是不是也是安排好的呢？他手里的九齿钉耙，可是太上老君亲手打造的，比自己的金箍棒差不了多少。还有沙悟净，以前是卷帘大将，就因为打碎了一个琉璃盏，就被贬下凡，每七天还要受飞剑穿心之苦，哪有这么巧的事？");
        contentBuilder.AppendLine("原来这取经队伍里，除了唐僧是真的十世修行的好人，剩下的，全都是神佛安插的眼线。哦不对，唐僧也不一定是好人，他心里想的，也不过是取到真经，回到东土大唐，受万人敬仰，成圣成佛罢了。");
        contentBuilder.AppendLine();
    }
}

// 将内容拆分成段落添加到文档中
string[] lines = contentBuilder.ToString().Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in lines)
{
    var para = new Paragraph();
    var run = new Run();
    var runProps = new RunProperties();
    runProps.Append(new FontSize { Val = "24" }); // 12号字体
    
    if (line.StartsWith("# "))
    {
        // 标题
        runProps.Append(new Bold());
        runProps.Append(new FontSize { Val = "32" });
        run.Append(runProps);
        run.Append(new Text(line.Substring(2)));
        para.ParagraphProperties = new ParagraphProperties(new SpacingBetweenLines { Before = "240", After = "120" });
    }
    else
    {
        // 正文
        run.Append(runProps);
        run.Append(new Text(line));
        para.ParagraphProperties = new ParagraphProperties(new Indentation { FirstLineChars = 200 }, new SpacingBetweenLines { Line = "360", LineRule = LineSpacingRuleValues.Auto });
    }
    
    para.Append(run);
    body.Append(para);
}

doc.Save();
Console.WriteLine($"文档已生成，保存到：{outputPath}，总字数约：{contentBuilder.Length}");
