package scim

const (
	GroupSchema = "urn:ietf:params:scim:schemas:core:2.0:Group"
)

type ScimGroupMeta struct {
	ResourceType string `json:"resourceType"`
}

type ScimGroupMember struct {
	Value   string `json:"value"`
	Display string `json:"display"`
}

type ScimGroupData map[string]interface{}

func (d ScimGroupData) SetSchemas(schemas []string) {
	d["schemas"] = schemas
}

func (d ScimGroupData) SetID(id string) {
	d["id"] = id
}

func (d ScimGroupData) GetDisplayName() string {
	displayNameI, ok := d["displayName"]
	if !ok {
		return ""
	}
	displayName, ok := displayNameI.(string)
	if !ok {
		return ""
	}
	return displayName
}

func (d ScimGroupData) SetDisplayName(displayName string) {
	d["displayName"] = displayName
}

func (d ScimGroupData) GetMembers() []ScimGroupMember {
	var members []ScimGroupMember
	membersI, ok := d["members"]
	if !ok {
		return members
	}
	membersInterface, ok := membersI.([]interface{})
	if !ok {
		return members
	}
	for _, mi := range membersInterface {
		e, ok := mi.(map[string]interface{})
		if !ok {
			continue
		}
		member := ScimGroupMember{}
		if evI, ok := e["value"]; ok {
			if ev, ok := evI.(string); ok {
				member.Value = ev
			}
		}
		if evI, ok := e["display"]; ok {
			if ev, ok := evI.(string); ok {
				member.Display = ev
			}
		}
		members = append(members, member)
	}
	return members
}

func (d ScimGroupData) SetMembers(members []ScimGroupMember) {
	var m []interface{}
	for _, member := range members {
		me := map[string]interface{}{
			"value":   member.Value,
			"display": member.Display,
		}
		m = append(m, me)
	}
	d["members"] = m
}

func (d ScimGroupData) SetMeta(meta ScimGroupMeta) {
	d["meta"] = map[string]interface{}{
		"resourceType": meta.ResourceType,
	}
}
