package ktypes

import (
	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
)

// IBusBaseHandler -- базовый обработчик обратного вызова
type IBusBaseHandler interface {
	// Topic -- топик подписки обработчика
	Topic() ATopic
	// Name -- уникальное имя обработчика
	Name() AHandlerName
}

// IBusHandlerSubscribe -- объект обработчика подписки
type IBusHandlerSubscribe interface {
	IBusBaseHandler
	// FnBack -- функция обратного вызова
	FnBack([]byte)
}

// IBusHandlerServe -- обработчик входящих запросов
type IBusHandlerServe interface {
	IBusBaseHandler
	// FnBack -- функция обратного вызова
	FnBack(binReq []byte) Result[[]byte]
}

// IDictSubHook -- словарь обработчиков по единственному топик
type IDictSubHook interface {
	// Subscribe -- подписывает обработчик
	Subscribe(IBusHandlerSubscribe)
	// Read -- все локальные обработчики читают сообщение по его приходу
	Read(binMsg []byte)
	// Unsubscribe -- отписывает обработчик
	Unsubscribe(IBusHandlerSubscribe)
}

// IDictTopicSub -- интерфейс к словарю обработчиков подписки на словарь топиков
//
//	При подписке потребителей топика может быть НЕСКОЛЬКО на КАЖДЫЙ топик
type IDictTopicSub interface {
	// Subscribe -- подписывает подписчиков на любой из топиков
	Subscribe(IBusHandlerSubscribe)
	// Read -- читает сообщение для всех обработчиков подписки по приходу на любой из топиков
	Read(topic ATopic, binMsg []byte)
	// Unsubscribe -- отписывает подписчиков от любого из топиков
	Unsubscribe(IBusHandlerSubscribe)
}

// IDictTopicServe -- интерфейс к обработчику входящих запросов на словарь топиков
//
// При обслуживании входящих запросов обработчик может быть только ОДИН на КАЖДЫЙ топик.
// Но обработчик вызывается конкурентно.
type IDictTopicServe interface {
	// Register -- регистрирует единственный обработчик на единственный топик
	Register(IBusHandlerServe)
	// SendRequest -- выполняет запрос по указанному топику
	SendRequest(topic ATopic, binReq []byte) Result[[]byte]
	// Unregister -- удаляет единственный обработчик с единственного топика
	Unregister(IBusHandlerServe)
}

// IKernelBus -- шина сообщений ядра
//
//	Публикация и запрос требуют параметров на _передачу_.
//	Подписка и обслуживание входящих запросов требует _обработчиков_.
type IKernelBus interface {
	// Publish -- публикует сообщение в шину
	Publish(topic ATopic, binMsg []byte) Result[bool]
	// SendRequest -- выполняет запрос по указанному топику
	SendRequest(topic ATopic, binReq []byte) Result[[]byte]

	// Subscribe -- подписывает обработчик на топик
	Subscribe(IBusHandlerSubscribe) Result[bool]
	// Unsubscribe -- отписывается от топика
	Unsubscribe(IBusHandlerSubscribe)
	// RegisterServe -- Регистрирует обработчик на обслуживание входящих запросов
	RegisterServe(IBusHandlerServe)

	// IsWork -- возвращает признак работы шины
	IsWork() bool
	// Log -- возвращает буферный лог
	Log() ILogBuf
}

// IBusClient -- интерфейс клиента к шину
type IBusClient interface {
	IKernelBus
}
