// package serv_public -- сервер запросов на публикацию
package serv_public

import (
	"context"
	"fmt"
	"log"

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

// ServPublic -- отвечает на запросы публикации
type ServPublic struct {
	serv      types.IService
	dictTopic types.IDictTopic
}

// NewServPublic -- возвращает новый публикатор
func NewServPublic(serv types.IService) (*ServPublic, error) {
	log.Printf("NewServPublic()\n")
	if serv == nil {
		return nil, fmt.Errorf("NewServPublic(): IService==nil")
	}
	sf := &ServPublic{
		serv:      serv,
		dictTopic: serv.DictTopic(),
	}
	return sf, nil
}

// Public -- публикация сообщения в топик
func (sf *ServPublic) Public(ctx context.Context, req *netapi.PublicRequest) (*netapi.DefaultResponse, error) {
	topic := sf.dictTopic.Get(alias.TopicName(req.Topic))
	if topic == nil {
		sf.dictTopic.Add(alias.TopicName(req.Topic))
		topic = sf.dictTopic.Get(alias.TopicName(req.Topic))
	}
	msg := &netapi.TopicMsg{
		Source: req.Source,
		Topic:  req.Topic,
		Msg:    req.Msg,
	}
	topic.Set(msg)
	return &netapi.DefaultResponse{}, nil
}
