package com.easyagents.agent.runtime.message;

import java.time.Instant;
import java.util.*;

/**
 * 智能体聊天消息
 */
public class AgentMessage {

    private String messageId = UUID.randomUUID().toString();
    private String name;
    /**
     * 聊天发起者角色
     */
    private AgentMessageRole role = AgentMessageRole.USER;
    /**
     * 消息内容块
     */
    private List<AgentContentBlock> contentBlocks = new ArrayList<>();
    /**
     * 知识库引用
     */
    private List<AgentKnowledgeReference> knowledgeReferences = new ArrayList<>();
    /**
     * 元数据
     */
    private Map<String, Object> metadata = new LinkedHashMap<>();
    /**
     * 创建时间
     */
    private Instant createdAt = Instant.now();

    /**
     * 创建纯文本消息。
     *
     * @param role 消息角色
     * @param content 文本内容
     * @return 消息
     */
    public static AgentMessage text(AgentMessageRole role, String content) {
        AgentMessage message = new AgentMessage();
        message.setRole(role);
        message.setContentBlocks(List.of(new AgentTextBlock(content)));
        return message;
    }

    /**
     * 获取消息ID。
     *
     * @return 消息ID
     */
    public String getMessageId() {
        return messageId;
    }

    /**
     * 设置消息ID。
     *
     * @param messageId 消息ID
     */
    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    /**
     * 获取消息名称。
     *
     * @return 消息名称
     */
    public String getName() {
        return name;
    }

    /**
     * 设置消息名称。
     *
     * @param name 消息名称
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取角色。
     *
     * @return 角色
     */
    public AgentMessageRole getRole() {
        return role;
    }

    /**
     * 设置角色。
     *
     * @param role 角色
     */
    public void setRole(AgentMessageRole role) {
        this.role = role == null ? AgentMessageRole.USER : role;
    }

    /**
     * 获取内容块列表。
     *
     * @return 内容块列表
     */
    public List<AgentContentBlock> getContentBlocks() {
        return contentBlocks;
    }

    /**
     * 设置内容块列表。
     *
     * @param contentBlocks 内容块列表
     */
    public void setContentBlocks(List<AgentContentBlock> contentBlocks) {
        this.contentBlocks = contentBlocks == null ? new ArrayList<>() : new ArrayList<>(contentBlocks);
    }

    /**
     * 获取知识库引用。
     *
     * @return 知识库引用
     */
    public List<AgentKnowledgeReference> getKnowledgeReferences() {
        return knowledgeReferences;
    }

    /**
     * 设置知识库引用。
     *
     * @param knowledgeReferences 知识库引用
     */
    public void setKnowledgeReferences(List<AgentKnowledgeReference> knowledgeReferences) {
        this.knowledgeReferences = knowledgeReferences == null ? new ArrayList<>() : new ArrayList<>(knowledgeReferences);
    }

    /**
     * 获取元数据。
     *
     * @return 元数据
     */
    public Map<String, Object> getMetadata() {
        return metadata;
    }

    /**
     * 设置元数据。
     *
     * @param metadata 元数据
     */
    public void setMetadata(Map<String, Object> metadata) {
        this.metadata = metadata == null ? new LinkedHashMap<>() : new LinkedHashMap<>(metadata);
    }

    /**
     * 获取创建时间。
     *
     * @return 创建时间
     */
    public Instant getCreatedAt() {
        return createdAt;
    }

    /**
     * 设置创建时间。
     *
     * @param createdAt 创建时间
     */
    public void setCreatedAt(Instant createdAt) {
        this.createdAt = createdAt == null ? Instant.now() : createdAt;
    }
}
