// package serv_subscribe_buffer -- сервер подписки с буфером хранения
package serv_subscribe_buffer

import (
	"fmt"

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

// ServSubscribeBuffer -- буферизованная подписка (на случай временного отключения клиента)
type ServSubscribeBuffer struct {
	serv            types.IService
	dictTopic       types.IDictTopic
	dictProxyBuffer types.IDictClientProxyBuffer
}

// NewServSubscribeBuffer -- возвращает новый сервер буферизованной подписки
func NewServSubscribeBuffer(serv types.IService) (*ServSubscribeBuffer, error) {
	if serv == nil {
		return nil, fmt.Errorf("NewServSubscribeBuffer(): IService==nil")
	}
	sf := &ServSubscribeBuffer{
		serv:            serv,
		dictTopic:       serv.DictTopic(),
		dictProxyBuffer: serv.DictClientProxyBuffer(),
	}
	return sf, nil
}

// SubscribeBuffer -- обслуживает буферизованные попдиски
func (sf *ServSubscribeBuffer) SubscribeBuffer(req *netapi.BuffRequest, serv netapi.GoBus_SubscribeBufferServer) error {
	clientProxy, err := client_proxy_buffer.NewClientProxyBuffer(req)
	if err != nil {
		return fmt.Errorf("ServSubscribe.Subscribe(): in create ClientProxy, err=\n\t%w", err)
	}
	sf.dictTopic.Subscribe(clientProxy)

	return nil
}
