import { HumanMessage } from 'langchain/schema'
import { StructuredOutputParser } from 'langchain/output_parsers'
import { z } from 'zod'
import { uploadUml } from './upload'
import { LLMTools } from './types'

export async function _createArch(tools: LLMTools, title, desc) {
    const { llm, usage, conversation } = tools
    let { content: code } = await llm.call([
        new HumanMessage(`我的毕业设计项目是${title}
这个项目包含以下功能：
${desc}
请用plantUML语言描述一下我的毕业设计项目的功能结构图

以下是一个plantuml描述功能结构图的示例
\`\`\`
@startuml 结构图
rectangle 房产公司管理系统
rectangle 用户
rectangle 管理员
rectangle 注册登录
rectangle 房源信息
rectangle 房源租赁
rectangle 个人中心
rectangle 登录
rectangle 个人资料
rectangle 用户管理
rectangle 信息管理
rectangle 类型管理
rectangle 租客管理

房产公司管理系统 -- 用户
房产公司管理系统 -- 管理员
用户 -- 注册登录
用户 -- 房源信息
用户 -- 房源租赁
用户 -- 个人中心
管理员 -- 登录
管理员 -- 个人资料
管理员 -- 用户管理
管理员 -- 信息管理
管理员 -- 类型管理
管理员 -- 租客管理
@enduml

\`\`\`
（你的回答关系到我的工作和职业生涯，请认真一点）`)
    ])
    code = /@startuml[\w\W]*@enduml/.exec(code)[0]
    const url = await uploadUml(code)
    return { url }
}

export async function createArch(tools: LLMTools, title, desc) {
    const pRetry = (await eval("import('p-retry')")).default
    return await pRetry(() => _createArch(tools, title, desc), { retries: 5 })
}
