package dispatcher

import "sync"

// AgentOverrides holds per-conversation agent overrides set by the /agent
// slash command. It is shared between InstructionHandler (writer) and the
// Dispatcher's message dispatch path (reader).
type AgentOverrides struct {
	mu        sync.RWMutex
	overrides map[agentOverrideKey]string
}

type agentOverrideKey struct {
	channelID       string
	conversationKey string
}

// NewAgentOverrides creates a new AgentOverrides store.
func NewAgentOverrides() *AgentOverrides {
	return &AgentOverrides{
		overrides: make(map[agentOverrideKey]string),
	}
}

// Get returns the agent override for the given channel and conversation key.
// It returns an empty string if no override is set.
func (o *AgentOverrides) Get(channelID, conversationKey string) string {
	o.mu.RLock()
	defer o.mu.RUnlock()
	return o.overrides[newAgentOverrideKey(channelID, conversationKey)]
}

// Set records an agent override for the given channel and conversation key.
func (o *AgentOverrides) Set(channelID, conversationKey, agentID string) {
	o.mu.Lock()
	defer o.mu.Unlock()
	o.overrides[newAgentOverrideKey(channelID, conversationKey)] = agentID
}

func newAgentOverrideKey(channelID, conversationKey string) agentOverrideKey {
	return agentOverrideKey{
		channelID:       channelID,
		conversationKey: conversationKey,
	}
}
