/*
Libre Graph API

Libre Graph is a free API for cloud collaboration inspired by the MS Graph API.

API version: v1.0.4
*/

// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.

package libregraph

import (
	"bytes"
	"encoding/json"
	"fmt"
)

// checks if the User type satisfies the MappedNullable interface at compile time
var _ MappedNullable = &User{}

// User Represents an Active Directory user object.
type User struct {
	// Read-only.
	Id *string `json:"id,omitempty"`
	// Set to \"true\" when the account is enabled.
	AccountEnabled *bool `json:"accountEnabled,omitempty"`
	// The apps and app roles which this user has been assigned.
	AppRoleAssignments []AppRoleAssignment `json:"appRoleAssignments,omitempty"`
	// The name displayed in the address book for the user. This value is usually the combination of the user's first name, middle initial, and last name. This property is required when a user is created and it cannot be cleared during updates. Returned by default. Supports $orderby.
	DisplayName string `json:"displayName"`
	// A collection of drives available for this user. Read-only.
	Drives []Drive `json:"drives,omitempty"`
	Drive  *Drive  `json:"drive,omitempty"`
	// Identities associated with this account.
	Identities []ObjectIdentity `json:"identities,omitempty"`
	// The SMTP address for the user, for example, 'jeff@contoso.onowncloud.com'. Returned by default.
	Mail *string `json:"mail,omitempty"`
	// Groups that this user is a member of. HTTP Methods: GET (supported for all groups). Read-only. Nullable. Supports $expand.
	MemberOf []Group `json:"memberOf,omitempty"`
	// Contains the on-premises SAM account name synchronized from the on-premises directory.
	OnPremisesSamAccountName string           `json:"onPremisesSamAccountName"`
	PasswordProfile          *PasswordProfile `json:"passwordProfile,omitempty"`
	// The user's surname (family name or last name). Returned by default.
	Surname *string `json:"surname,omitempty"`
	// The user's givenName. Returned by default.
	GivenName *string `json:"givenName,omitempty"`
	// The user`s type. This can be either \"Member\" for regular user, \"Guest\" for guest users or \"Federated\" for users imported from a federated instance.
	UserType *string `json:"userType,omitempty"`
	// Represents the users language setting, ISO-639-1 Code
	PreferredLanguage *string         `json:"preferredLanguage,omitempty"`
	SignInActivity    *SignInActivity `json:"signInActivity,omitempty"`
	// A unique identifier assigned to the user by the organization.
	ExternalID *string `json:"externalID,omitempty"`
	// A unique reference to the user. This is used to query the user from a different oCIS instance connected to the same identity provider.
	CrossInstanceReference *string `json:"crossInstanceReference,omitempty"`
	// oCIS instances that the user is either a member or a guest of.
	Instances []Instance `json:"instances,omitempty"`
}

type _User User

// NewUser instantiates a new User object
// This constructor will assign default values to properties that have it defined,
// and makes sure properties required by API are set, but the set of arguments
// will change when the set of required properties is changed
func NewUser(displayName string, onPremisesSamAccountName string) *User {
	this := User{}
	this.DisplayName = displayName
	this.OnPremisesSamAccountName = onPremisesSamAccountName
	return &this
}

// NewUserWithDefaults instantiates a new User object
// This constructor will only assign default values to properties that have it defined,
// but it doesn't guarantee that properties required by API are set
func NewUserWithDefaults() *User {
	this := User{}
	return &this
}

// GetId returns the Id field value if set, zero value otherwise.
func (o *User) GetId() string {
	if o == nil || IsNil(o.Id) {
		var ret string
		return ret
	}
	return *o.Id
}

// GetIdOk returns a tuple with the Id field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetIdOk() (*string, bool) {
	if o == nil || IsNil(o.Id) {
		return nil, false
	}
	return o.Id, true
}

// HasId returns a boolean if a field has been set.
func (o *User) HasId() bool {
	if o != nil && !IsNil(o.Id) {
		return true
	}

	return false
}

// SetId gets a reference to the given string and assigns it to the Id field.
func (o *User) SetId(v string) {
	o.Id = &v
}

// GetAccountEnabled returns the AccountEnabled field value if set, zero value otherwise.
func (o *User) GetAccountEnabled() bool {
	if o == nil || IsNil(o.AccountEnabled) {
		var ret bool
		return ret
	}
	return *o.AccountEnabled
}

// GetAccountEnabledOk returns a tuple with the AccountEnabled field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetAccountEnabledOk() (*bool, bool) {
	if o == nil || IsNil(o.AccountEnabled) {
		return nil, false
	}
	return o.AccountEnabled, true
}

// HasAccountEnabled returns a boolean if a field has been set.
func (o *User) HasAccountEnabled() bool {
	if o != nil && !IsNil(o.AccountEnabled) {
		return true
	}

	return false
}

// SetAccountEnabled gets a reference to the given bool and assigns it to the AccountEnabled field.
func (o *User) SetAccountEnabled(v bool) {
	o.AccountEnabled = &v
}

// GetAppRoleAssignments returns the AppRoleAssignments field value if set, zero value otherwise.
func (o *User) GetAppRoleAssignments() []AppRoleAssignment {
	if o == nil || IsNil(o.AppRoleAssignments) {
		var ret []AppRoleAssignment
		return ret
	}
	return o.AppRoleAssignments
}

// GetAppRoleAssignmentsOk returns a tuple with the AppRoleAssignments field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetAppRoleAssignmentsOk() ([]AppRoleAssignment, bool) {
	if o == nil || IsNil(o.AppRoleAssignments) {
		return nil, false
	}
	return o.AppRoleAssignments, true
}

// HasAppRoleAssignments returns a boolean if a field has been set.
func (o *User) HasAppRoleAssignments() bool {
	if o != nil && !IsNil(o.AppRoleAssignments) {
		return true
	}

	return false
}

// SetAppRoleAssignments gets a reference to the given []AppRoleAssignment and assigns it to the AppRoleAssignments field.
func (o *User) SetAppRoleAssignments(v []AppRoleAssignment) {
	o.AppRoleAssignments = v
}

// GetDisplayName returns the DisplayName field value
func (o *User) GetDisplayName() string {
	if o == nil {
		var ret string
		return ret
	}

	return o.DisplayName
}

// GetDisplayNameOk returns a tuple with the DisplayName field value
// and a boolean to check if the value has been set.
func (o *User) GetDisplayNameOk() (*string, bool) {
	if o == nil {
		return nil, false
	}
	return &o.DisplayName, true
}

// SetDisplayName sets field value
func (o *User) SetDisplayName(v string) {
	o.DisplayName = v
}

// GetDrives returns the Drives field value if set, zero value otherwise.
func (o *User) GetDrives() []Drive {
	if o == nil || IsNil(o.Drives) {
		var ret []Drive
		return ret
	}
	return o.Drives
}

// GetDrivesOk returns a tuple with the Drives field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetDrivesOk() ([]Drive, bool) {
	if o == nil || IsNil(o.Drives) {
		return nil, false
	}
	return o.Drives, true
}

// HasDrives returns a boolean if a field has been set.
func (o *User) HasDrives() bool {
	if o != nil && !IsNil(o.Drives) {
		return true
	}

	return false
}

// SetDrives gets a reference to the given []Drive and assigns it to the Drives field.
func (o *User) SetDrives(v []Drive) {
	o.Drives = v
}

// GetDrive returns the Drive field value if set, zero value otherwise.
func (o *User) GetDrive() Drive {
	if o == nil || IsNil(o.Drive) {
		var ret Drive
		return ret
	}
	return *o.Drive
}

// GetDriveOk returns a tuple with the Drive field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetDriveOk() (*Drive, bool) {
	if o == nil || IsNil(o.Drive) {
		return nil, false
	}
	return o.Drive, true
}

// HasDrive returns a boolean if a field has been set.
func (o *User) HasDrive() bool {
	if o != nil && !IsNil(o.Drive) {
		return true
	}

	return false
}

// SetDrive gets a reference to the given Drive and assigns it to the Drive field.
func (o *User) SetDrive(v Drive) {
	o.Drive = &v
}

// GetIdentities returns the Identities field value if set, zero value otherwise.
func (o *User) GetIdentities() []ObjectIdentity {
	if o == nil || IsNil(o.Identities) {
		var ret []ObjectIdentity
		return ret
	}
	return o.Identities
}

// GetIdentitiesOk returns a tuple with the Identities field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetIdentitiesOk() ([]ObjectIdentity, bool) {
	if o == nil || IsNil(o.Identities) {
		return nil, false
	}
	return o.Identities, true
}

// HasIdentities returns a boolean if a field has been set.
func (o *User) HasIdentities() bool {
	if o != nil && !IsNil(o.Identities) {
		return true
	}

	return false
}

// SetIdentities gets a reference to the given []ObjectIdentity and assigns it to the Identities field.
func (o *User) SetIdentities(v []ObjectIdentity) {
	o.Identities = v
}

// GetMail returns the Mail field value if set, zero value otherwise.
func (o *User) GetMail() string {
	if o == nil || IsNil(o.Mail) {
		var ret string
		return ret
	}
	return *o.Mail
}

// GetMailOk returns a tuple with the Mail field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetMailOk() (*string, bool) {
	if o == nil || IsNil(o.Mail) {
		return nil, false
	}
	return o.Mail, true
}

// HasMail returns a boolean if a field has been set.
func (o *User) HasMail() bool {
	if o != nil && !IsNil(o.Mail) {
		return true
	}

	return false
}

// SetMail gets a reference to the given string and assigns it to the Mail field.
func (o *User) SetMail(v string) {
	o.Mail = &v
}

// GetMemberOf returns the MemberOf field value if set, zero value otherwise.
func (o *User) GetMemberOf() []Group {
	if o == nil || IsNil(o.MemberOf) {
		var ret []Group
		return ret
	}
	return o.MemberOf
}

// GetMemberOfOk returns a tuple with the MemberOf field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetMemberOfOk() ([]Group, bool) {
	if o == nil || IsNil(o.MemberOf) {
		return nil, false
	}
	return o.MemberOf, true
}

// HasMemberOf returns a boolean if a field has been set.
func (o *User) HasMemberOf() bool {
	if o != nil && !IsNil(o.MemberOf) {
		return true
	}

	return false
}

// SetMemberOf gets a reference to the given []Group and assigns it to the MemberOf field.
func (o *User) SetMemberOf(v []Group) {
	o.MemberOf = v
}

// GetOnPremisesSamAccountName returns the OnPremisesSamAccountName field value
func (o *User) GetOnPremisesSamAccountName() string {
	if o == nil {
		var ret string
		return ret
	}

	return o.OnPremisesSamAccountName
}

// GetOnPremisesSamAccountNameOk returns a tuple with the OnPremisesSamAccountName field value
// and a boolean to check if the value has been set.
func (o *User) GetOnPremisesSamAccountNameOk() (*string, bool) {
	if o == nil {
		return nil, false
	}
	return &o.OnPremisesSamAccountName, true
}

// SetOnPremisesSamAccountName sets field value
func (o *User) SetOnPremisesSamAccountName(v string) {
	o.OnPremisesSamAccountName = v
}

// GetPasswordProfile returns the PasswordProfile field value if set, zero value otherwise.
func (o *User) GetPasswordProfile() PasswordProfile {
	if o == nil || IsNil(o.PasswordProfile) {
		var ret PasswordProfile
		return ret
	}
	return *o.PasswordProfile
}

// GetPasswordProfileOk returns a tuple with the PasswordProfile field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetPasswordProfileOk() (*PasswordProfile, bool) {
	if o == nil || IsNil(o.PasswordProfile) {
		return nil, false
	}
	return o.PasswordProfile, true
}

// HasPasswordProfile returns a boolean if a field has been set.
func (o *User) HasPasswordProfile() bool {
	if o != nil && !IsNil(o.PasswordProfile) {
		return true
	}

	return false
}

// SetPasswordProfile gets a reference to the given PasswordProfile and assigns it to the PasswordProfile field.
func (o *User) SetPasswordProfile(v PasswordProfile) {
	o.PasswordProfile = &v
}

// GetSurname returns the Surname field value if set, zero value otherwise.
func (o *User) GetSurname() string {
	if o == nil || IsNil(o.Surname) {
		var ret string
		return ret
	}
	return *o.Surname
}

// GetSurnameOk returns a tuple with the Surname field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetSurnameOk() (*string, bool) {
	if o == nil || IsNil(o.Surname) {
		return nil, false
	}
	return o.Surname, true
}

// HasSurname returns a boolean if a field has been set.
func (o *User) HasSurname() bool {
	if o != nil && !IsNil(o.Surname) {
		return true
	}

	return false
}

// SetSurname gets a reference to the given string and assigns it to the Surname field.
func (o *User) SetSurname(v string) {
	o.Surname = &v
}

// GetGivenName returns the GivenName field value if set, zero value otherwise.
func (o *User) GetGivenName() string {
	if o == nil || IsNil(o.GivenName) {
		var ret string
		return ret
	}
	return *o.GivenName
}

// GetGivenNameOk returns a tuple with the GivenName field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetGivenNameOk() (*string, bool) {
	if o == nil || IsNil(o.GivenName) {
		return nil, false
	}
	return o.GivenName, true
}

// HasGivenName returns a boolean if a field has been set.
func (o *User) HasGivenName() bool {
	if o != nil && !IsNil(o.GivenName) {
		return true
	}

	return false
}

// SetGivenName gets a reference to the given string and assigns it to the GivenName field.
func (o *User) SetGivenName(v string) {
	o.GivenName = &v
}

// GetUserType returns the UserType field value if set, zero value otherwise.
func (o *User) GetUserType() string {
	if o == nil || IsNil(o.UserType) {
		var ret string
		return ret
	}
	return *o.UserType
}

// GetUserTypeOk returns a tuple with the UserType field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetUserTypeOk() (*string, bool) {
	if o == nil || IsNil(o.UserType) {
		return nil, false
	}
	return o.UserType, true
}

// HasUserType returns a boolean if a field has been set.
func (o *User) HasUserType() bool {
	if o != nil && !IsNil(o.UserType) {
		return true
	}

	return false
}

// SetUserType gets a reference to the given string and assigns it to the UserType field.
func (o *User) SetUserType(v string) {
	o.UserType = &v
}

// GetPreferredLanguage returns the PreferredLanguage field value if set, zero value otherwise.
func (o *User) GetPreferredLanguage() string {
	if o == nil || IsNil(o.PreferredLanguage) {
		var ret string
		return ret
	}
	return *o.PreferredLanguage
}

// GetPreferredLanguageOk returns a tuple with the PreferredLanguage field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetPreferredLanguageOk() (*string, bool) {
	if o == nil || IsNil(o.PreferredLanguage) {
		return nil, false
	}
	return o.PreferredLanguage, true
}

// HasPreferredLanguage returns a boolean if a field has been set.
func (o *User) HasPreferredLanguage() bool {
	if o != nil && !IsNil(o.PreferredLanguage) {
		return true
	}

	return false
}

// SetPreferredLanguage gets a reference to the given string and assigns it to the PreferredLanguage field.
func (o *User) SetPreferredLanguage(v string) {
	o.PreferredLanguage = &v
}

// GetSignInActivity returns the SignInActivity field value if set, zero value otherwise.
func (o *User) GetSignInActivity() SignInActivity {
	if o == nil || IsNil(o.SignInActivity) {
		var ret SignInActivity
		return ret
	}
	return *o.SignInActivity
}

// GetSignInActivityOk returns a tuple with the SignInActivity field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetSignInActivityOk() (*SignInActivity, bool) {
	if o == nil || IsNil(o.SignInActivity) {
		return nil, false
	}
	return o.SignInActivity, true
}

// HasSignInActivity returns a boolean if a field has been set.
func (o *User) HasSignInActivity() bool {
	if o != nil && !IsNil(o.SignInActivity) {
		return true
	}

	return false
}

// SetSignInActivity gets a reference to the given SignInActivity and assigns it to the SignInActivity field.
func (o *User) SetSignInActivity(v SignInActivity) {
	o.SignInActivity = &v
}

// GetExternalID returns the ExternalID field value if set, zero value otherwise.
func (o *User) GetExternalID() string {
	if o == nil || IsNil(o.ExternalID) {
		var ret string
		return ret
	}
	return *o.ExternalID
}

// GetExternalIDOk returns a tuple with the ExternalID field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetExternalIDOk() (*string, bool) {
	if o == nil || IsNil(o.ExternalID) {
		return nil, false
	}
	return o.ExternalID, true
}

// HasExternalID returns a boolean if a field has been set.
func (o *User) HasExternalID() bool {
	if o != nil && !IsNil(o.ExternalID) {
		return true
	}

	return false
}

// SetExternalID gets a reference to the given string and assigns it to the ExternalID field.
func (o *User) SetExternalID(v string) {
	o.ExternalID = &v
}

// GetCrossInstanceReference returns the CrossInstanceReference field value if set, zero value otherwise.
func (o *User) GetCrossInstanceReference() string {
	if o == nil || IsNil(o.CrossInstanceReference) {
		var ret string
		return ret
	}
	return *o.CrossInstanceReference
}

// GetCrossInstanceReferenceOk returns a tuple with the CrossInstanceReference field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetCrossInstanceReferenceOk() (*string, bool) {
	if o == nil || IsNil(o.CrossInstanceReference) {
		return nil, false
	}
	return o.CrossInstanceReference, true
}

// HasCrossInstanceReference returns a boolean if a field has been set.
func (o *User) HasCrossInstanceReference() bool {
	if o != nil && !IsNil(o.CrossInstanceReference) {
		return true
	}

	return false
}

// SetCrossInstanceReference gets a reference to the given string and assigns it to the CrossInstanceReference field.
func (o *User) SetCrossInstanceReference(v string) {
	o.CrossInstanceReference = &v
}

// GetInstances returns the Instances field value if set, zero value otherwise.
func (o *User) GetInstances() []Instance {
	if o == nil || IsNil(o.Instances) {
		var ret []Instance
		return ret
	}
	return o.Instances
}

// GetInstancesOk returns a tuple with the Instances field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *User) GetInstancesOk() ([]Instance, bool) {
	if o == nil || IsNil(o.Instances) {
		return nil, false
	}
	return o.Instances, true
}

// HasInstances returns a boolean if a field has been set.
func (o *User) HasInstances() bool {
	if o != nil && !IsNil(o.Instances) {
		return true
	}

	return false
}

// SetInstances gets a reference to the given []Instance and assigns it to the Instances field.
func (o *User) SetInstances(v []Instance) {
	o.Instances = v
}

func (o User) MarshalJSON() ([]byte, error) {
	toSerialize, err := o.ToMap()
	if err != nil {
		return []byte{}, err
	}
	return json.Marshal(toSerialize)
}

func (o User) ToMap() (map[string]interface{}, error) {
	toSerialize := map[string]interface{}{}
	if !IsNil(o.Id) {
		toSerialize["id"] = o.Id
	}
	if !IsNil(o.AccountEnabled) {
		toSerialize["accountEnabled"] = o.AccountEnabled
	}
	if !IsNil(o.AppRoleAssignments) {
		toSerialize["appRoleAssignments"] = o.AppRoleAssignments
	}
	toSerialize["displayName"] = o.DisplayName
	if !IsNil(o.Drives) {
		toSerialize["drives"] = o.Drives
	}
	if !IsNil(o.Drive) {
		toSerialize["drive"] = o.Drive
	}
	if !IsNil(o.Identities) {
		toSerialize["identities"] = o.Identities
	}
	if !IsNil(o.Mail) {
		toSerialize["mail"] = o.Mail
	}
	if !IsNil(o.MemberOf) {
		toSerialize["memberOf"] = o.MemberOf
	}
	toSerialize["onPremisesSamAccountName"] = o.OnPremisesSamAccountName
	if !IsNil(o.PasswordProfile) {
		toSerialize["passwordProfile"] = o.PasswordProfile
	}
	if !IsNil(o.Surname) {
		toSerialize["surname"] = o.Surname
	}
	if !IsNil(o.GivenName) {
		toSerialize["givenName"] = o.GivenName
	}
	if !IsNil(o.UserType) {
		toSerialize["userType"] = o.UserType
	}
	if !IsNil(o.PreferredLanguage) {
		toSerialize["preferredLanguage"] = o.PreferredLanguage
	}
	if !IsNil(o.SignInActivity) {
		toSerialize["signInActivity"] = o.SignInActivity
	}
	if !IsNil(o.ExternalID) {
		toSerialize["externalID"] = o.ExternalID
	}
	if !IsNil(o.CrossInstanceReference) {
		toSerialize["crossInstanceReference"] = o.CrossInstanceReference
	}
	if !IsNil(o.Instances) {
		toSerialize["instances"] = o.Instances
	}
	return toSerialize, nil
}

func (o *User) UnmarshalJSON(data []byte) (err error) {
	// This validates that all required properties are included in the JSON object
	// by unmarshalling the object into a generic map with string keys and checking
	// that every required field exists as a key in the generic map.
	requiredProperties := []string{
		"displayName",
		"onPremisesSamAccountName",
	}

	allProperties := make(map[string]interface{})

	err = json.Unmarshal(data, &allProperties)

	if err != nil {
		return err
	}

	for _, requiredProperty := range requiredProperties {
		if _, exists := allProperties[requiredProperty]; !exists {
			return fmt.Errorf("no value given for required property %v", requiredProperty)
		}
	}

	varUser := _User{}

	decoder := json.NewDecoder(bytes.NewReader(data))
	decoder.DisallowUnknownFields()
	err = decoder.Decode(&varUser)

	if err != nil {
		return err
	}

	*o = User(varUser)

	return err
}

type NullableUser struct {
	value *User
	isSet bool
}

func (v NullableUser) Get() *User {
	return v.value
}

func (v *NullableUser) Set(val *User) {
	v.value = val
	v.isSet = true
}

func (v NullableUser) IsSet() bool {
	return v.isSet
}

func (v *NullableUser) Unset() {
	v.value = nil
	v.isSet = false
}

func NewNullableUser(val *User) *NullableUser {
	return &NullableUser{value: val, isSet: true}
}

func (v NullableUser) MarshalJSON() ([]byte, error) {
	return json.Marshal(v.value)
}

func (v *NullableUser) UnmarshalJSON(src []byte) error {
	v.isSet = true
	return json.Unmarshal(src, &v.value)
}
