import { WritableStreamBuffer } from 'stream-buffers'
import { createLLM } from './llm'
import { createFlow } from './flow'
import { createER } from './er'
import { createTable } from './table'
import { uploadDoc } from './upload'
import { createArch } from './arch'
import { createAbstract } from './abstract'
import { createUseCase } from './useCase'
import { genChapters } from './chapter'

export async function genPaper(title: string, desc: string) {
    const tools = createLLM()
    const { llm, usage, conversation } = tools
    const pRetry = (await eval("import('p-retry')")).default

    const chapters = await genChapters(tools, title, desc)

    let paper = new WritableStreamBuffer()
    const startTime = Date.now()

    paper.write(`${await createAbstract(tools, title, desc)}\n\n`)

    const { chain, memory } = conversation(`你是一个擅长写毕业论文的专家，你的任务是帮我完成我的论文。
你要根据我的要求，帮我完成我的论文
我的论文标题是: ${title}
主要论述: ${desc}
现在我们已经为论文拟好了一个大纲：
${chapters.map((i) => `- ${i.chapterName}\n    ${i.chapterDesc}`).join('\n')}

现在我们来一步一步的编写这篇论文
请严格按照markdown格式返回内容。
请注意，你只需要输出能够直接出现在论文中的内容，不需要输出你对该内容的总结或者介绍等其他文字`)

    for (let i = 0; i < chapters.length; i++) {
        const { response } = await chain.call({
            input: `现在我们来编写第${i + 1}章: ${chapters[i].chapterName}, 本章主要内容是${chapters[i].chapterDesc}
注意：如有需要请尽可能的详细描述本章内容，以便读者能够更好的理解。如有需要也可分为多个子章节。
开始:`
        })
        paper.write('\n\n' + response)
    }

    const content = paper.getContentsAsString('utf8')
    const duration = (Date.now() - startTime) / 1000
    const fileUrl = await uploadDoc(title, content)
    return {
        content,
        duration,
        tokenUsage: usage,
        fileUrl
    }
}

genPaper(
    '《中国新能源汽车进出口现状及前景分析》',
    '讨论中国为何需要发展新能源汽车，通过对比分析最近几年中国新能源汽车的产量和产能等数据，找出中国新能源汽车发展的不足之处。对中国新能源汽车的发展前景和未来策略，以及对当前状况和未来前景的看法进行分析和展望'
).then(console.log)
