package channel

import (
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/unread"
)

type channelUnreadRealtime interface {
	EmitUnreadUpdated(workspaceID string, delta unread.UnreadDelta)
}

func applyChannelScopeInvalidated(unreadRuntime ChannelUnreadReader, workspaceID string, scopeID string, memberID string, reason string) {
	if unreadRuntime == nil {
		return
	}
	event := unread.ScopeInvalidated{
		WorkspaceID: strings.TrimSpace(workspaceID),
		ScopeID:     strings.TrimSpace(scopeID),
		Reason:      reason,
	}
	if memberID = strings.TrimSpace(memberID); memberID != "" {
		event.MemberIDs = []string{memberID}
	}
	_ = unreadRuntime.ApplyScopeInvalidated(event)
}

func applyChannelMemberScopeInvalidated(
	realtime channelUnreadRealtime,
	unreadRuntime ChannelUnreadReader,
	workspaceID string,
	userID string,
	memberID string,
	scopeID string,
	scopeType unread.ScopeType,
	reason string,
) {
	applyChannelScopeInvalidated(unreadRuntime, workspaceID, scopeID, memberID, reason)
	emitChannelSuppressedUnreadState(realtime, unreadRuntime, workspaceID, userID, memberID, scopeID, scopeType, unread.ServingStateStale)
}

func emitChannelSuppressedUnreadState(
	realtime channelUnreadRealtime,
	unreadRuntime ChannelUnreadReader,
	workspaceID string,
	userID string,
	memberID string,
	scopeID string,
	scopeType unread.ScopeType,
	state unread.ServingState,
) {
	if realtime == nil || unreadRuntime == nil {
		return
	}
	workspaceID = strings.TrimSpace(workspaceID)
	userID = strings.TrimSpace(userID)
	memberID = strings.TrimSpace(memberID)
	scopeID = strings.TrimSpace(scopeID)
	if workspaceID == "" || userID == "" || memberID == "" || scopeID == "" {
		return
	}
	workspaceHasUnread := unreadRuntime.WorkspaceHasUnread(workspaceID, memberID)
	workspaceUnreadConversationCount := unreadRuntime.WorkspaceUnreadConversationCount(workspaceID, memberID)
	realtime.EmitUnreadUpdated(workspaceID, unread.UnreadDelta{
		WorkspaceID:                      workspaceID,
		UserID:                           userID,
		MemberID:                         memberID,
		ScopeID:                          scopeID,
		ScopeType:                        scopeType,
		ServingState:                     state,
		WorkspaceHasUnread:               workspaceHasUnread,
		WorkspaceUnreadConversationCount: workspaceUnreadConversationCount,
	})
}
