package com.lanyuanxiaoyao.digtal.market.service

import cn.hutool.json.JSONUtil
import com.lanyuanxiaoyao.digtal.market.ai.Chat
import com.lanyuanxiaoyao.digtal.market.ai.QianfanChat
import com.lanyuanxiaoyao.digtal.market.ai.ZhipuChat
import dev.failsafe.Failsafe
import dev.failsafe.RetryPolicy
import dev.failsafe.function.CheckedSupplier
import kotlin.time.Duration.Companion.seconds
import kotlin.time.toJavaDuration
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service

@Service
class DescriptionService {
    private val logger = LoggerFactory.getLogger(javaClass)
    private val retryPolicy = RetryPolicy
        .builder<Any>()
        .withDelay(10.seconds.toJavaDuration())
        .withMaxRetries(2)
        .build()

    private val chats = listOf(
        ZhipuChat(),
        QianfanChat(),
    )

    fun parseDescription(content: String?): Triple<String, String, Int>? {
        return content?.let {
            if (it.isNotBlank()) {
                var description: String?
                for (chat in chats) {
                    try {
                        description = Failsafe
                            .with(retryPolicy)
                            .get(CheckedSupplier {
                                chat.ask(
                                    // language=text
                                    Chat.Companion.SystemMessage("数据要素是指那些以电子形式存在的、通过计算的方式参与到生产经营活动并发挥重要价值的数据资源。在数字经济中，数据要素的角色可与传统的生产要素（如劳动力、资本和土地）相提并论。数据要素是推动数字经济发展的核心引擎，是赋能行业数字化转型和智能化升级的重要支撑，也是国家基础性战略资源。数据要素市场化的含义是指通过市场机制来配置数据这一新型生产要素，旨在建立一个更加开放、安全和高效的数据流通环境，不断释放数据要素价值。具体来说，数据要素市场化建设就是将尚未完全由市场配置的数据要素转向由市场配置的动态过程，形成以市场为根本的数据资源体系，实现以数据流促进生产、分配、流通、消费各个环节高效贯通。数据要素市场化的目的是提升数据要素的价值创造能力，促进数据要素的有效配置和优化利用，推动数字经济和实体经济的协同发展。"),
                                    // language=text
                                    Chat.Companion.SystemMessage("您作为专职新闻编辑，您需要总结归纳输入的文稿，强调时间、数据、人物、政策、法律等关键信息。请注意，您只能写一段总述，不能分点或分段，也不能添加任何其他与内容无关的提示性文字。请使用以下模板输出符合JSON格式的结果(不添加任何Markdown代码格式)：{\"title\":\"(一句话总结)\",\"description\":\"(500字概要)\",\"tags\":\"(文本的关键词标签，最多10个，使用英文逗号分隔)\",\"score\":\"(文本内容和「数据要素市场化建设」的相关程度，0到100，相关程度越大数字越高，精确到个位数)\"}"),
                                    Chat.Companion.UserMessage(content)
                                )
                            })
                        logger.info("description: {}", description)
                        if (description.isNullOrBlank()) {
                            continue
                        }
                        val root = JSONUtil.parse(
                            description
                                .replace("```json", "")
                                .replace("```", "")
                        )
                        val subtitle = root.getByPath("title", String::class.java)
                        val desc = root.getByPath("description", String::class.java)
                        val score = root.getByPath("score", Int::class.java)
                        return@let Triple(subtitle, desc, score)
                    } catch (e: Throwable) {
                        continue
                    }
                }
                null
            } else null
        }
    }
}