/*
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 (
	"encoding/json"
	"time"
)

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

// Permission The Permission resource provides information about a sharing permission granted for a DriveItem resource.  ### Remarks  The Permission resource uses *facets* to provide information about the kind of permission represented by the resource.  Permissions with a `link` facet represent sharing links created on the item. Sharing links contain a unique token that provides access to the item for anyone with the link.  Permissions with a `invitation` facet represent permissions added by inviting specific users or groups to have access to the file.
type Permission struct {
	// The unique identifier of the permission among all permissions on the item. Read-only.
	Id *string `json:"id,omitempty"`
	// Indicates whether the password is set for this permission. This property only appears in the response. Optional. Read-only.
	HasPassword *bool `json:"hasPassword,omitempty"`
	// An optional expiration date which limits the permission in time.
	ExpirationDateTime NullableTime `json:"expirationDateTime,omitempty"`
	// An optional creation date. Libregraph only.
	CreatedDateTime NullableTime           `json:"createdDateTime,omitempty"`
	GrantedToV2     *SharePointIdentitySet `json:"grantedToV2,omitempty"`
	Link            *SharingLink           `json:"link,omitempty"`
	Roles           []string               `json:"roles,omitempty"`
	// For link type permissions, the details of the identity to whom permission was granted. This could be used to grant access to a an external user that can be identified by email, aka guest accounts.
	// Deprecated
	GrantedToIdentities []IdentitySet `json:"grantedToIdentities,omitempty"`
	// Use this to create a permission with custom actions.
	LibreGraphPermissionsActions []string           `json:"@libre.graph.permissions.actions,omitempty"`
	Invitation                   *SharingInvitation `json:"invitation,omitempty"`
}

// NewPermission instantiates a new Permission 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 NewPermission() *Permission {
	this := Permission{}
	return &this
}

// NewPermissionWithDefaults instantiates a new Permission 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 NewPermissionWithDefaults() *Permission {
	this := Permission{}
	return &this
}

// GetId returns the Id field value if set, zero value otherwise.
func (o *Permission) 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 *Permission) 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 *Permission) 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 *Permission) SetId(v string) {
	o.Id = &v
}

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

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

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

	return false
}

// SetHasPassword gets a reference to the given bool and assigns it to the HasPassword field.
func (o *Permission) SetHasPassword(v bool) {
	o.HasPassword = &v
}

// GetExpirationDateTime returns the ExpirationDateTime field value if set, zero value otherwise (both if not set or set to explicit null).
func (o *Permission) GetExpirationDateTime() time.Time {
	if o == nil || IsNil(o.ExpirationDateTime.Get()) {
		var ret time.Time
		return ret
	}
	return *o.ExpirationDateTime.Get()
}

// GetExpirationDateTimeOk returns a tuple with the ExpirationDateTime field value if set, nil otherwise
// and a boolean to check if the value has been set.
// NOTE: If the value is an explicit nil, `nil, true` will be returned
func (o *Permission) GetExpirationDateTimeOk() (*time.Time, bool) {
	if o == nil {
		return nil, false
	}
	return o.ExpirationDateTime.Get(), o.ExpirationDateTime.IsSet()
}

// HasExpirationDateTime returns a boolean if a field has been set.
func (o *Permission) HasExpirationDateTime() bool {
	if o != nil && o.ExpirationDateTime.IsSet() {
		return true
	}

	return false
}

// SetExpirationDateTime gets a reference to the given NullableTime and assigns it to the ExpirationDateTime field.
func (o *Permission) SetExpirationDateTime(v time.Time) {
	o.ExpirationDateTime.Set(&v)
}

// SetExpirationDateTimeNil sets the value for ExpirationDateTime to be an explicit nil
func (o *Permission) SetExpirationDateTimeNil() {
	o.ExpirationDateTime.Set(nil)
}

// UnsetExpirationDateTime ensures that no value is present for ExpirationDateTime, not even an explicit nil
func (o *Permission) UnsetExpirationDateTime() {
	o.ExpirationDateTime.Unset()
}

// GetCreatedDateTime returns the CreatedDateTime field value if set, zero value otherwise (both if not set or set to explicit null).
func (o *Permission) GetCreatedDateTime() time.Time {
	if o == nil || IsNil(o.CreatedDateTime.Get()) {
		var ret time.Time
		return ret
	}
	return *o.CreatedDateTime.Get()
}

// GetCreatedDateTimeOk returns a tuple with the CreatedDateTime field value if set, nil otherwise
// and a boolean to check if the value has been set.
// NOTE: If the value is an explicit nil, `nil, true` will be returned
func (o *Permission) GetCreatedDateTimeOk() (*time.Time, bool) {
	if o == nil {
		return nil, false
	}
	return o.CreatedDateTime.Get(), o.CreatedDateTime.IsSet()
}

// HasCreatedDateTime returns a boolean if a field has been set.
func (o *Permission) HasCreatedDateTime() bool {
	if o != nil && o.CreatedDateTime.IsSet() {
		return true
	}

	return false
}

// SetCreatedDateTime gets a reference to the given NullableTime and assigns it to the CreatedDateTime field.
func (o *Permission) SetCreatedDateTime(v time.Time) {
	o.CreatedDateTime.Set(&v)
}

// SetCreatedDateTimeNil sets the value for CreatedDateTime to be an explicit nil
func (o *Permission) SetCreatedDateTimeNil() {
	o.CreatedDateTime.Set(nil)
}

// UnsetCreatedDateTime ensures that no value is present for CreatedDateTime, not even an explicit nil
func (o *Permission) UnsetCreatedDateTime() {
	o.CreatedDateTime.Unset()
}

// GetGrantedToV2 returns the GrantedToV2 field value if set, zero value otherwise.
func (o *Permission) GetGrantedToV2() SharePointIdentitySet {
	if o == nil || IsNil(o.GrantedToV2) {
		var ret SharePointIdentitySet
		return ret
	}
	return *o.GrantedToV2
}

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

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

	return false
}

// SetGrantedToV2 gets a reference to the given SharePointIdentitySet and assigns it to the GrantedToV2 field.
func (o *Permission) SetGrantedToV2(v SharePointIdentitySet) {
	o.GrantedToV2 = &v
}

// GetLink returns the Link field value if set, zero value otherwise.
func (o *Permission) GetLink() SharingLink {
	if o == nil || IsNil(o.Link) {
		var ret SharingLink
		return ret
	}
	return *o.Link
}

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

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

	return false
}

// SetLink gets a reference to the given SharingLink and assigns it to the Link field.
func (o *Permission) SetLink(v SharingLink) {
	o.Link = &v
}

// GetRoles returns the Roles field value if set, zero value otherwise.
func (o *Permission) GetRoles() []string {
	if o == nil || IsNil(o.Roles) {
		var ret []string
		return ret
	}
	return o.Roles
}

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

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

	return false
}

// SetRoles gets a reference to the given []string and assigns it to the Roles field.
func (o *Permission) SetRoles(v []string) {
	o.Roles = v
}

// GetGrantedToIdentities returns the GrantedToIdentities field value if set, zero value otherwise.
// Deprecated
func (o *Permission) GetGrantedToIdentities() []IdentitySet {
	if o == nil || IsNil(o.GrantedToIdentities) {
		var ret []IdentitySet
		return ret
	}
	return o.GrantedToIdentities
}

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

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

	return false
}

// SetGrantedToIdentities gets a reference to the given []IdentitySet and assigns it to the GrantedToIdentities field.
// Deprecated
func (o *Permission) SetGrantedToIdentities(v []IdentitySet) {
	o.GrantedToIdentities = v
}

// GetLibreGraphPermissionsActions returns the LibreGraphPermissionsActions field value if set, zero value otherwise.
func (o *Permission) GetLibreGraphPermissionsActions() []string {
	if o == nil || IsNil(o.LibreGraphPermissionsActions) {
		var ret []string
		return ret
	}
	return o.LibreGraphPermissionsActions
}

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

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

	return false
}

// SetLibreGraphPermissionsActions gets a reference to the given []string and assigns it to the LibreGraphPermissionsActions field.
func (o *Permission) SetLibreGraphPermissionsActions(v []string) {
	o.LibreGraphPermissionsActions = v
}

// GetInvitation returns the Invitation field value if set, zero value otherwise.
func (o *Permission) GetInvitation() SharingInvitation {
	if o == nil || IsNil(o.Invitation) {
		var ret SharingInvitation
		return ret
	}
	return *o.Invitation
}

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

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

	return false
}

// SetInvitation gets a reference to the given SharingInvitation and assigns it to the Invitation field.
func (o *Permission) SetInvitation(v SharingInvitation) {
	o.Invitation = &v
}

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

func (o Permission) ToMap() (map[string]interface{}, error) {
	toSerialize := map[string]interface{}{}
	if !IsNil(o.Id) {
		toSerialize["id"] = o.Id
	}
	if !IsNil(o.HasPassword) {
		toSerialize["hasPassword"] = o.HasPassword
	}
	if o.ExpirationDateTime.IsSet() {
		toSerialize["expirationDateTime"] = o.ExpirationDateTime.Get()
	}
	if o.CreatedDateTime.IsSet() {
		toSerialize["createdDateTime"] = o.CreatedDateTime.Get()
	}
	if !IsNil(o.GrantedToV2) {
		toSerialize["grantedToV2"] = o.GrantedToV2
	}
	if !IsNil(o.Link) {
		toSerialize["link"] = o.Link
	}
	if !IsNil(o.Roles) {
		toSerialize["roles"] = o.Roles
	}
	if !IsNil(o.GrantedToIdentities) {
		toSerialize["grantedToIdentities"] = o.GrantedToIdentities
	}
	if !IsNil(o.LibreGraphPermissionsActions) {
		toSerialize["@libre.graph.permissions.actions"] = o.LibreGraphPermissionsActions
	}
	if !IsNil(o.Invitation) {
		toSerialize["invitation"] = o.Invitation
	}
	return toSerialize, nil
}

type NullablePermission struct {
	value *Permission
	isSet bool
}

func (v NullablePermission) Get() *Permission {
	return v.value
}

func (v *NullablePermission) Set(val *Permission) {
	v.value = val
	v.isSet = true
}

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

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

func NewNullablePermission(val *Permission) *NullablePermission {
	return &NullablePermission{value: val, isSet: true}
}

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

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