package common

import "context"

type (
	DatabaseEntityType string
	OperationType      string
	PayloadFilterFunc  func(ChangePayload) bool
)

const (
	RepositoryEntityType        DatabaseEntityType = "repository"
	OrganizationEntityType      DatabaseEntityType = "organization"
	EnterpriseEntityType        DatabaseEntityType = "enterprise"
	PoolEntityType              DatabaseEntityType = "pool"
	UserEntityType              DatabaseEntityType = "user"
	InstanceEntityType          DatabaseEntityType = "instance"
	JobEntityType               DatabaseEntityType = "job"
	ControllerEntityType        DatabaseEntityType = "controller"
	GithubCredentialsEntityType DatabaseEntityType = "github_credentials" // #nosec G101
	GithubEndpointEntityType    DatabaseEntityType = "github_endpoint"
)

const (
	CreateOperation OperationType = "create"
	UpdateOperation OperationType = "update"
	DeleteOperation OperationType = "delete"
)

type ChangePayload struct {
	EntityType DatabaseEntityType `json:"entity-type"`
	Operation  OperationType      `json:"operation"`
	Payload    interface{}        `json:"payload"`
}

type Consumer interface {
	Watch() <-chan ChangePayload
	IsClosed() bool
	Close()
	SetFilters(filters ...PayloadFilterFunc)
}

type Producer interface {
	Notify(ChangePayload) error
	IsClosed() bool
	Close()
}

type Watcher interface {
	RegisterProducer(ctx context.Context, ID string) (Producer, error)
	RegisterConsumer(ctx context.Context, ID string, filters ...PayloadFilterFunc) (Consumer, error)
	Close()
}
