package cluster

import (
	"context"

	"github.com/docker/docker/api/types/network"
)

const (
	// EventSocketChange control socket changed
	EventSocketChange = iota
	// EventNodeReady cluster node in ready state
	EventNodeReady
	// EventNodeLeave node is leaving the cluster
	EventNodeLeave
	// EventNetworkKeysAvailable network keys correctly configured in the networking layer
	EventNetworkKeysAvailable
)

// ConfigEventType type of the event produced by the cluster
type ConfigEventType uint8

// Provider provides clustering config details
type Provider interface {
	IsManager() bool
	IsAgent() bool
	GetLocalAddress() string
	GetListenAddress() string
	GetAdvertiseAddress() string
	GetDataPathAddress() string
	GetRemoteAddressList() []string
	ListenClusterEvents() <-chan ConfigEventType
	AttachNetwork(string, string, []string) (*network.NetworkingConfig, error)
	DetachNetwork(string, string) error
	UpdateAttachment(string, string, *network.NetworkingConfig) error
	WaitForDetachment(context.Context, string, string, string, string) error
}
