package actions

import (
	"github.com/caos/zitadel/internal/domain"
	"golang.org/x/text/language"
)

type API map[string]interface{}

func (a API) set(name string, value interface{}) {
	map[string]interface{}(a)[name] = value
}

func (a *API) SetHuman(human *domain.Human) *API {
	a.set("setFirstName", func(firstName string) {
		human.FirstName = firstName
	})
	a.set("setLastName", func(lastName string) {
		human.LastName = lastName
	})
	a.set("setNickName", func(nickName string) {
		human.NickName = nickName
	})
	a.set("setDisplayName", func(displayName string) {
		human.DisplayName = displayName
	})
	a.set("setPreferredLanguage", func(preferredLanguage string) {
		human.PreferredLanguage = language.Make(preferredLanguage)
	})
	a.set("setGender", func(gender domain.Gender) {
		human.Gender = gender
	})
	a.set("setUsername", func(username string) {
		human.Username = username
	})
	a.set("setEmail", func(email string) {
		if human.Email == nil {
			human.Email = &domain.Email{}
		}
		human.Email.EmailAddress = email
	})
	a.set("setEmailVerified", func(verified bool) {
		if human.Email == nil {
			return
		}
		human.Email.IsEmailVerified = verified
	})
	a.set("setPhone", func(email string) {
		if human.Phone == nil {
			human.Phone = &domain.Phone{}
		}
		human.Phone.PhoneNumber = email
	})
	a.set("setPhoneVerified", func(verified bool) {
		if human.Phone == nil {
			return
		}
		human.Phone.IsPhoneVerified = verified
	})
	return a
}

func (a *API) SetExternalUser(user *domain.ExternalUser) *API {
	a.set("setFirstName", func(firstName string) {
		user.FirstName = firstName
	})
	a.set("setLastName", func(lastName string) {
		user.LastName = lastName
	})
	a.set("setNickName", func(nickName string) {
		user.NickName = nickName
	})
	a.set("setDisplayName", func(displayName string) {
		user.DisplayName = displayName
	})
	a.set("setPreferredLanguage", func(preferredLanguage string) {
		user.PreferredLanguage = language.Make(preferredLanguage)
	})
	a.set("setPreferredUsername", func(username string) {
		user.PreferredUsername = username
	})
	a.set("setEmail", func(email string) {
		user.Email = email
	})
	a.set("setEmailVerified", func(verified bool) {
		user.IsEmailVerified = verified
	})
	a.set("setPhone", func(phone string) {
		user.Phone = phone
	})
	a.set("setPhoneVerified", func(verified bool) {
		user.IsPhoneVerified = verified
	})
	return a
}

func (a *API) SetMetadata(metadata *[]*domain.Metadata) *API {
	a.set("metadata", metadata)
	return a
}

func (a *API) SetUserGrants(usergrants *[]UserGrant) *API {
	a.set("userGrants", usergrants)
	return a
}