package cn.teammodel.model.entity.ai;

import cn.hutool.core.lang.UUID;
import cn.teammodel.model.entity.BaseItem;
import com.azure.spring.data.cosmos.core.mapping.Container;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.Instant;
import java.util.List;

/**
 * deepseek聊天会话
 * @Date: 2023/6/5
 */
@EqualsAndHashCode(callSuper = true)
@Container(containerName = "Teacher")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DeepSeekSession extends BaseItem {

    /**
     * 用户id
     */
    @ApiModelProperty("用户id")
    public String userId;

    /**
     * 会话标题
     */
    @ApiModelProperty("会话标题")
    private String title;

    /**
     * 生成该 completion 的模型名。
     */
    @ApiModelProperty("模型名")
    private String model;

    /**
     * 创建时间
     */
    @ApiModelProperty("创建时间")
    private long createTime;

    /**
     * 产生对话即更新时间,按更新时间排序
     */
    @ApiModelProperty("更新时间")
    private Long updateTime;

    /**
     * 会话历史记录
     */
    @ApiModelProperty("历史记录")
    private List<DeepSeekMessage> history;

    @Data
    public static class DeepSeekMessage {
        /**
         * 该对话的唯一标识符。
         */
        @ApiModelProperty("该对话的唯一标识符")
        private String id;

        /**
         * 生成这条消息的角色。
         * 角色 [user, assistant, system]
         * user：用户。
         * assistant：模型。
         * system：模型和用户之间的对话。
         */
        @ApiModelProperty("角色")
        private String role;

        /**
         * 用户的提问文本
         */
        @ApiModelProperty("用户提问文本")
        private String userText;

        /**
         * 模型回答的文本
         */
        @ApiModelProperty("模型回答的文本")
        private String aiText;

        /**
         * 停止原因 [stop, length, content_filter, tool_calls, insufficient_system_resource] 模型停止生成 token 的原因。
         * stop：模型自然停止生成，或遇到 stop 序列中列出的字符串。
         * length ：输出长度达到了模型上下文长度限制，或达到了 max_tokens 的限制。
         * content_filter：输出内容因触发过滤策略而被过滤。
         * insufficient_system_resource：系统推理资源不足，生成被打断。
         */
        @ApiModelProperty("停止原因 [stop, length, content_filter, tool_calls, insufficient_system_resource] 模型停止生成 token 的原因")
        private String finish_reason;

        /**
         * 创建聊天完成时的 Unix 时间戳
         */
        @ApiModelProperty("提问内容创建时间")
        private Long createTime;

        public static DeepSeekMessage of(String userText, String aiText){
            DeepSeekMessage message = new DeepSeekMessage();
            message.setId(UUID.randomUUID().toString());
            message.setUserText(userText);
            message.setAiText(aiText);
            message.setCreateTime(Instant.now().toEpochMilli());
            return message;
        }
    }

}
