// package dict_client_proxy_buffer -- словарь буферизованных клиентов
//
//	Способен переживать отключения клиентов и накапливать информацию по необходимости
package dict_client_proxy_buffer

import (
	"fmt"
	"sync"

	"p78git.ddns.net/svi/gobus/pkg/alias"
	"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"
)

// DictClientProxyBuffer -- словарь буферизованных клиентов
//
//	Способен переживать отключения клиентов и накапливать информацию по необходимости
type DictClientProxyBuffer struct {
	serv      types.IService
	dictTopic types.IDictTopic
	dict      map[alias.ClientName]types.IClientProxyBuffer
	block     sync.RWMutex
}

// NewDictClientProxyBuffer -- возвращает новый словарь буферизованных клиентов
func NewDictClientProxyBuffer(serv types.IService) (*DictClientProxyBuffer, error) {
	if serv == nil {
		return nil, fmt.Errorf("NewDictClientProxyBuffer(): IService==nil")
	}
	sf := &DictClientProxyBuffer{
		serv:      serv,
		dictTopic: serv.DictTopic(),
		dict:      make(map[alias.ClientName]types.IClientProxyBuffer),
	}
	_ = types.IDictClientProxyBuffer(sf)
	return sf, nil
}

// Add -- добавляет нового буферизованного клиента в словарь
func (sf *DictClientProxyBuffer) Add(req *netapi.BuffRequest) (types.IClientProxyBuffer, error) {
	sf.block.Lock()
	defer sf.block.Unlock()
	clientProxyBuff, err := client_proxy_buffer.NewClientProxyBuffer(req)
	if err != nil {
		return nil, fmt.Errorf("DictClientProxyBuffer.Add(): in create ClientProxyBuffer(): err=\n\t%w", err)
	}
	sf.dict[clientProxyBuff.ClientName()] = clientProxyBuff
	// Отправить в словарь топиков на подписку
	sf.dictTopic.Subscribe(clientProxyBuff)
	return clientProxyBuff, nil
}
