package consensus

import (
	"sync"
)

// MessageHandler é a função chamada quando uma mensagem é recebida.
type MessageHandler func(msg ConsensusMessage)

// Transport simula o envio e recebimento de mensagens de consenso entre nós.
type Transport struct {
	handlersMu sync.RWMutex
	handlers   map[MessageType][]MessageHandler
}

// NewTransport cria um novo transporte de mensagens de consenso.
func NewTransport() *Transport {
	return &Transport{
		handlers: make(map[MessageType][]MessageHandler),
	}
}

// Register adiciona um handler para um tipo de mensagem.
func (t *Transport) Register(msgType MessageType, handler MessageHandler) {
	t.handlersMu.Lock()
	defer t.handlersMu.Unlock()
	t.handlers[msgType] = append(t.handlers[msgType], handler)
}

// Broadcast envia uma mensagem para todos os handlers registrados daquele tipo.
func (t *Transport) Broadcast(msg ConsensusMessage) {
	t.handlersMu.RLock()
	handlers := t.handlers[msg.Type()]
	t.handlersMu.RUnlock()

	for _, h := range handlers {
		go h(msg) // Envia de forma assíncrona
	}
}