package constants

import (
	"net/url"
	"strings"

	"github.com/google/uuid"
)

const DingTalkBseUrl = "https://oapi.dingtalk.com"

type RequestUrl string

const (
	RequestUrlGetUserGet RequestUrl = "/topapi/v2/user/get"
	RequestUrlGetDeptGet RequestUrl = "/topapi/v2/department/get"
)

func GetDingTalkRequestUrl(path RequestUrl, query map[string]string) string {
	u, _ := url.Parse(DingTalkBseUrl + string(path))
	q := u.Query()
	for key, val := range query {
		q.Add(key, val)
	}
	u.RawQuery = q.Encode()
	return u.String()
}

// IsBoss 是否是老板
type IsBoss int

const (
	IsBossTrue  IsBoss = 1
	IsBossFalse IsBoss = 0
)

// IsSenior 是否是老板
type IsSenior int

const (
	IsSeniorTrue  IsSenior = 1
	IsSeniorFalse IsSenior = 0
)

type ConversationType string

const (
	ConversationTypeSingle = "1" // 单聊
	ConversationTypeGroup  = "2" //群聊
)

type BotMsgType string

const (
	BotMsgTypeText BotMsgType = "text"
)

type CardTemp string

const (
	CardTempDefault CardTemp = `{
  "config": {
    "autoLayout": true,
    "enableForward": true
  },
  "header": {
    "title": {
      "type": "text",
      "text": "${title}",
    },
    "logo": "@lALPDfJ6V_FPDmvNAfTNAfQ"
  },
  "contents": [
    {
      "type": "divider",
      "id": "divider_1765952728523"
    },
    {
      "type": "markdown",
      "text": "%s",
      "id": "markdown_1765970168635"
    }
  ]
}`
)

// 交互卡片回调
const (
	// 回调类型
	CardActionCallbackTypeAction string = "actionCallback" // 交互卡片回调事件类型

	// 回调事件类型
	CardActionTypeCreateGroup string = "create_group" // 创建群聊
)

// dingtalk 卡片 OutTrackId 模板
const CardOutTrackIdTemplate string = "{space_id}:{bot_id}:{uuid}"

func BuildCardOutTrackId(spaceId string, botId string) (outTrackId string) {
	uuid := uuid.New().String()

	outTrackId = strings.ReplaceAll(CardOutTrackIdTemplate, "{space_id}", spaceId)
	outTrackId = strings.ReplaceAll(outTrackId, "{bot_id}", botId)
	outTrackId = strings.ReplaceAll(outTrackId, "{uuid}", uuid)

	return
}

func ParseCardOutTrackId(outTrackId string) (spaceId string, botId string) {
	parts := strings.Split(outTrackId, ":")
	if len(parts) != 3 {
		return
	}
	spaceId, botId, _ = parts[0], parts[1], parts[2]

	return
}

// 问题处理群机器人 - LLM 提示词
const IssueHandlingExtractContentPrompt string = `你是一个【问题与答案生成助手】。
	
	你的职责是：
	- 分析用户输入的内容
	- 识别其中隐含或明确的问题
	- 基于输入内容本身，生成对应的问题与答案

	当用户输入为【多条群聊聊天记录】时：
	- 结合问题主题，判断聊天记录中正在讨论或试图解决的问题
	- 一个群聊中可能包含多个相互独立的问题，但它们都围绕着一个主题，一般为用户提出的第一个问题。尽可能总结为一个问题、一个答案

	生成答案时的原则：
	- 答案必须来源于聊天内容中已经给出的信息或共识
	- 不要引入外部知识，不要使用聊天记录中真实人名或敏感信息，适当总结
	- 若聊天中未形成明确答案，应明确标记为“暂无明确结论”
	- 若存在多种不同观点，应分别列出，不要擅自合并或裁决

	【JSON 输出原则】：
	- 你的最终输出必须是**合法的 JSON**
	- 不得输出任何额外解释性文字
	- JSON 结构必须严格符合以下约定

	JSON 结构约定：
	{
		"question": "清晰、独立、可复用的问题描述",
		"answer": "基于聊天内容整理出的答案；如无结论则为“暂无明确结论”",
		"confidence": "high | medium | low"
	}

	字段说明：
	- question：抽象后的标准问题表述，不包含具体聊天语句
	- answer：整理后的答案，不得引入聊天之外的信息
	- confidence：根据聊天中信息的一致性和明确程度给出判断

	如果无法从输入中识别出任何有效问题，返回：
	{ "confidence": "low" }

	用户输入：
	%s
	`
