// package topic -- потокобезопасный топик шины данных
package topic

import (
	"fmt"
	"sync"

	"p78git.ddns.net/svi/gobus/pkg/alias"
	"p78git.ddns.net/svi/gobus/pkg/types"
)

// Topic -- потокобезопасный топик шины данных
type Topic struct {
	name   alias.TopicName
	srcNum int    // Номер источника
	val    []byte // Содержимое топика
	block  sync.RWMutex
}

// Newtopic -- возвращает новый топик
func NewTopic(name alias.TopicName) (*Topic, error) {
	if name == "" {
		return nil, fmt.Errorf("NewTopic(): name is empty")
	}
	sf := &Topic{
		name: name,
		val:  []byte{},
	}
	_ = types.ITopic(sf)
	return sf, nil
}

// Name -- возвращает имя топика
func (sf *Topic) Name() alias.TopicName {
	return sf.name
}

// Get -- возвращает содержимое топика
func (sf *Topic) Get() []byte {
	sf.block.RLock()
	defer sf.block.RUnlock()
	return sf.val
}

// Set -- устанавливает значение топика
func (sf *Topic) Set(srcNum int, val []byte) {
	sf.block.Lock()
	defer sf.block.Unlock()
	sf.srcNum = srcNum
	sf.val = val
}

// Size -- возвращает размер топика
func (sf *Topic) Size() int {
	sf.block.RLock()
	defer sf.block.RUnlock()
	return len(sf.name) + len(sf.val)
}
