package goidentity

import (
	
	
	
	
)

type User struct {
	authenticated   bool
	domain          string
	userName        string
	displayName     string
	email           string
	human           bool
	groupMembership map[string]bool
	authTime        time.Time
	sessionID       string
	expiry          time.Time
	attributes      map[string]interface{}
}

func ( string) User {
	,  := uuid.GenerateUUID()
	if  != nil {
		 = "00unique-sess-ions-uuid-unavailable0"
	}
	return User{
		userName:        ,
		groupMembership: make(map[string]bool),
		sessionID:       ,
	}
}

func ( *User) () string {
	return .userName
}

func ( *User) ( string) {
	.userName = 
}

func ( *User) () string {
	return .domain
}

func ( *User) ( string) {
	.domain = 
}

func ( *User) () string {
	if .displayName == "" {
		return .userName
	}
	return .displayName
}

func ( *User) ( string) {
	.displayName = 
}

func ( *User) () bool {
	return .human
}

func ( *User) ( bool) {
	.human = 
}

func ( *User) () time.Time {
	return .authTime
}

func ( *User) ( time.Time) {
	.authTime = 
}

func ( *User) () []string {
	 := make([]string, len(.groupMembership))
	 := 0
	for  := range .groupMembership {
		[] = 
		++
	}
	return 
}

func ( *User) () bool {
	return .authenticated
}

func ( *User) ( bool) {
	.authenticated = 
}

func ( *User) ( string) {
	.groupMembership[] = true
}

func ( *User) ( string) {
	if ,  := .groupMembership[]; ! {
		return
	}
	delete(.groupMembership, )
}

func ( *User) ( string) {
	if ,  := .groupMembership[];  && ! {
		.groupMembership[] = true
	}
}

func ( *User) ( string) {
	if ,  := .groupMembership[];  &&  {
		.groupMembership[] = false
	}
}

func ( *User) ( string) bool {
	if ,  := .groupMembership[];  &&  {
		return true
	}
	return false
}

func ( *User) () string {
	return .sessionID
}

func ( *User) ( time.Time) {
	.expiry = 
}

func ( *User) () bool {
	if !.expiry.IsZero() && time.Now().UTC().After(.expiry) {
		return true
	}
	return false
}

func ( *User) () map[string]interface{} {
	return .attributes
}

func ( *User) ( string,  interface{}) {
	.attributes[] = 
}

func ( *User) ( map[string]interface{}) {
	.attributes = 
}

func ( *User) ( string) {
	delete(.attributes, )
}

func ( *User) () ([]byte, error) {
	 := new(bytes.Buffer)
	 := gob.NewEncoder()
	 := .Encode()
	if  != nil {
		return []byte{}, 
	}
	return .Bytes(), nil
}

func ( *User) ( []byte) error {
	 := bytes.NewBuffer()
	 := gob.NewDecoder()
	return .Decode()
}