package interfaces

import "gopkg.in/ldap.v2"

// LDAPGroupLister lists the LDAP groups that need to be synced by a job. The LDAPGroupLister needs to
// be paired with an LDAPMemberExtractor that understands the format of the unique identifiers returned
// to represent the LDAP groups to be synced.
type LDAPGroupLister interface {
	ListGroups() (ldapGroupUIDs []string, err error)
}

// LDAPMemberExtractor retrieves member data about an LDAP group from the LDAP server.
type LDAPMemberExtractor interface {
	// ExtractMembers returns the list of LDAP first-class user entries that are members of the LDAP group
	// specified by the ldapGroupUID
	ExtractMembers(ldapGroupUID string) (members []*ldap.Entry, err error)
}

// LDAPGroupNameMapper maps a ldapGroupUID representing an LDAP group to the OpenShift Group name for the resource
type LDAPGroupNameMapper interface {
	GroupNameFor(ldapGroupUID string) (openShiftGroupName string, err error)
}

// LDAPUserNameMapper maps an LDAP entry representing an LDAP user to the OpenShift User name for the resource
type LDAPUserNameMapper interface {
	UserNameFor(ldapUser *ldap.Entry) (openShiftUserName string, err error)
}

// LDAPGroupGetter maps a ldapGroupUID to a first-class LDAP group entry
type LDAPGroupGetter interface {
	GroupEntryFor(ldapGroupUID string) (group *ldap.Entry, err error)
}

type LDAPGroupListerNameMapper interface {
	LDAPGroupLister
	LDAPGroupNameMapper
}

// LDAPGroupDetector determines if a group identified by an LDAP group UID exists on the LDAP server
type LDAPGroupDetector interface {
	Exists(ldapGroupUID string) (exists bool, err error)
}