package notify

import (
	"context"
	"net"
	"time"
)

type Server interface {
	SetDefaultCommEncode(func([]byte, []byte) []byte)
	SetDefaultCommDecode(func([]byte, []byte) []byte)
	SetDefaultLink(func(message *Message))
	SetLink(string, func(*Message))
	send(c *ClientConn, msg TransferMsg) (WaitMsg, error)
	sendWait(c *ClientConn, msg TransferMsg, timeout time.Duration) (Message, error)
	SendObjCtx(ctx context.Context, c *ClientConn, key string, val interface{}) (Message, error)
	SendObj(c *ClientConn, key string, val interface{}) error
	Send(c *ClientConn, key string, value MsgVal) error
	SendWait(c *ClientConn, key string, value MsgVal, timeout time.Duration) (Message, error)
	SendWaitObj(c *ClientConn, key string, value interface{}, timeout time.Duration) (Message, error)
	SendCtx(ctx context.Context, c *ClientConn, key string, value MsgVal) (Message, error)
	Reply(m Message, value MsgVal) error
	pushMessage([]byte, string)
	removeClient(client *ClientConn)
	Listen(network string, addr string) error
	Stop() error
	StopMonitorChan() <-chan struct{}
	Status() Status

	GetSecretKey() []byte
	SetSecretKey(key []byte)
	RsaPrivKey() []byte
	SetRsaPrivKey([]byte)

	GetClient(id string) *ClientConn
	GetClientLists() []*ClientConn
	GetClientAddrs() []net.Addr

	GetSequenceEn() func(interface{}) ([]byte, error)
	SetSequenceEn(func(interface{}) ([]byte, error))
	GetSequenceDe() func([]byte) (interface{}, error)
	SetSequenceDe(func([]byte) (interface{}, error))
	ShowError(bool)
	DebugMode(bool)
	IsDebugMode() bool

	HeartbeatTimeoutSec() int64
	SetHeartbeatTimeoutSec(int64)
}
