package tech.easyflow.chatlog.service;

import org.springframework.stereotype.Component;
import tech.easyflow.chatlog.domain.dto.ChatMessageRecord;
import tech.easyflow.chatlog.domain.dto.ChatSessionSummary;

import java.math.BigInteger;
import java.util.List;

/**
 * 按会话类型同步分发会话生命周期与历史投影扩展。
 */
@Component
public class ChatSessionExtensionDispatcher {

    private final List<ChatSessionExtension> extensions;

    /**
     * 创建扩展分发器。
     *
     * @param extensions 当前应用注册的会话扩展
     */
    public ChatSessionExtensionDispatcher(List<ChatSessionExtension> extensions) {
        this.extensions = extensions == null ? List.of() : List.copyOf(extensions);
    }

    /**
     * 在会话删除前同步执行匹配扩展。
     *
     * @param summary 会话摘要
     * @param userId 会话用户 ID
     * @param operatorId 操作人 ID
     */
    public void beforeDelete(ChatSessionSummary summary, BigInteger userId, BigInteger operatorId) {
        for (ChatSessionExtension extension : extensions) {
            if (extension.supports(summary)) {
                extension.beforeDelete(summary, userId, operatorId);
            }
        }
    }

    /**
     * 在会话删除分发成功后同步执行匹配扩展。
     *
     * @param summary 会话摘要
     * @param userId 会话用户 ID
     * @param operatorId 操作人 ID
     */
    public void afterDelete(ChatSessionSummary summary, BigInteger userId, BigInteger operatorId) {
        for (ChatSessionExtension extension : extensions) {
            if (extension.supports(summary)) {
                extension.afterDelete(summary, userId, operatorId);
            }
        }
    }

    /**
     * 在消息返回前同步执行匹配扩展。
     *
     * @param summary 会话摘要
     * @param records 本次返回消息
     */
    public void projectMessages(ChatSessionSummary summary, List<ChatMessageRecord> records) {
        for (ChatSessionExtension extension : extensions) {
            if (extension.supports(summary)) {
                extension.projectMessages(summary, records);
            }
        }
    }
}
