// Code generated by go-swagger; DO NOT EDIT.

// (c) 2012-2023 by Vernon Keenan
// All rights reserved worldwide.
// Proprietary product; unlicensed use is not allowed

package members_models

// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command

import (
	"context"
	"encoding/json"

	"github.com/go-openapi/errors"
	"github.com/go-openapi/strfmt"
	"github.com/go-openapi/swag"
	"github.com/go-openapi/validate"
)

// ClerkUser Clerk user object
//
// swagger:model ClerkUser
type ClerkUser struct {

	// If Backup Codes are configured on the instance, you can provide them to enable it on the newly created user without the need to reset them.
	// You must provide the backup codes in plain format or the corresponding bcrypt digest.
	BackupCodes []string `json:"backup_codes"`

	// A custom date/time denoting _when_ the user signed up to the application, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`).
	CreatedAt *string `json:"created_at,omitempty"`

	// Email addresses to add to the user.
	// Must be unique across your instance.
	// The first email address will be set as the user's primary email address.
	EmailAddress []string `json:"email_address"`

	// The ID of the user as used in your external systems or your previous authentication solution.
	// Must be unique across your instance.
	ExternalID *string `json:"external_id,omitempty"`

	// The first name to assign to the user
	FirstName *string `json:"first_name,omitempty"`

	// The last name to assign to the user
	LastName *string `json:"last_name,omitempty"`

	// The plaintext password to give the user.
	// Must be at least 8 characters long, and can not be in any list of hacked passwords.
	Password *string `json:"password,omitempty"`

	// In case you already have the password digests and not the passwords, you can use them for the newly created user via this property.
	// The digests should be generated with one of the supported algorithms.
	// The hashing algorithm can be specified using the `password_hasher` property.
	PasswordDigest *string `json:"password_digest,omitempty"`

	// The hashing algorithm that was used to generate the password digest.
	// The algorithms we support at the moment are [bcrypt](https://en.wikipedia.org/wiki/Bcrypt), md5, pbkdf2_sha256, [pbkdf2_sha256_django](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [scrypt_firebase](https://firebaseopensource.com/projects/firebase/scrypt/) and 2 [argon2](https://argon2.online/) variants, argon2i and argon2id.
	// Each of the above expects the incoming digest to be of a particular format.
	//
	// More specifically:
	//
	// **bcrypt:** The digest should be of the following form:
	//
	// `$<algorithm version>$<cost>$<salt & hash>`
	//
	// **md5:** The digest should follow the regular form e.g.:
	//
	// `5f4dcc3b5aa765d61d8327deb882cf99`
	//
	// **pbkdf2_sha256:** This is the PBKDF2 algorithm using the SHA256 hashing function. The format should be as follows:
	//
	// `pbkdf2_sha256$<iterations>$<salt>$<hash>`
	//
	// Note: Both the salt and the hash are expected to be base64-encoded.
	//
	// **pbkdf2_sha256_django:** This is the Django-specific variant of PBKDF2 and the digest should have the following format (as exported from Django):
	//
	// `pbkdf2_sha256$<iterations>$<salt>$<hash>`
	//
	// Note: The salt is expected to be un-encoded, the hash is expected base64-encoded.
	//
	// **pbkdf2_sha1:** This is similar to pkbdf2_sha256_django, but with two differences:
	// 1. uses sha1 instead of sha256
	// 2. accepts the hash as a hex-encoded string
	//
	// The format is the following:
	//
	// `pbkdf2_sha1$<iterations>$<salt>$<hash-as-hex-string>`
	//
	//
	// **scrypt_firebase:** The Firebase-specific variant of scrypt.
	// The value is expected to have 6 segments separated by the $ character and include the following information:
	//
	// _hash:_ The actual Base64 hash. This can be retrieved when exporting the user from Firebase.
	// _salt:_ The salt used to generate the above hash. Again, this is given when exporting the user.
	// _signer key:_ The base64 encoded signer key.
	// _salt separator:_ The base64 encoded salt separator.
	// _rounds:_ The number of rounds the algorithm needs to run.
	// _memory cost:_ The cost of the algorithm run
	//
	// The first 2 (hash and salt) are per user and can be retrieved when exporting the user from Firebase.
	// The other 4 values (signer key, salt separator, rounds and memory cost) are project-wide settings and can be retrieved from the project's password hash parameters.
	//
	// Once you have all these, you can combine it in the following format and send this as the digest in order for Clerk to accept it:
	//
	// `<hash>$<salt>$<signer key>$<salt separator>$<rounds>$<memory cost>`
	//
	// **argon2i:** Algorithms in the argon2 family generate digests that encode the following information:
	//
	// _version (v):_ The argon version, version 19 is assumed
	// _memory (m):_ The memory used by the algorithm (in kibibytes)
	// _iterations (t):_ The number of iterations to perform
	// _parallelism (p):_ The number of threads to use
	//
	// Parts are demarcated by the `$` character, with the first part identifying the algorithm variant.
	// The middle part is a comma-separated list of the encoding options (memory, iterations, parallelism).
	// The final part is the actual digest.
	//
	// `$argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc`
	//
	// **argon2id:** See the previous algorithm for an explanation of the formatting.
	//
	// For the argon2id case, the value of the algorithm in the first part of the digest is `argon2id`:
	//
	// `$argon2id$v=19$m=64,t=4,p=8$Z2liZXJyaXNo$iGXEpMBTDYQ8G/71tF0qGjxRHEmR3gpGULcE93zUJVU`
	//
	// If you need support for any particular hashing algorithm, [please let us know](https://clerk.com/support).
	// Enum: [bcrypt md5 pbkdf2_sha256 pbkdf2_sha256_django pbkdf2_sha1 scrypt_firebase argon2i argon2id]
	PasswordHasher *string `json:"password_hasher,omitempty"`

	// Phone numbers to add to the user.
	// Must be unique across your instance.
	// The first phone number will be set as the user's primary phone number.
	PhoneNumber []string `json:"phone_number"`

	// Metadata saved on the user, that is only visible to your Backend API
	PrivateMetadata interface{} `json:"private_metadata,omitempty"`

	// Metadata saved on the user, that is visible to both your Frontend and Backend APIs
	PublicMetadata interface{} `json:"public_metadata,omitempty"`

	// When set to `true` all password checks are skipped.
	// It is recommended to use this method only when migrating plaintext passwords to Clerk.
	// Upon migration the user base should be prompted to pick stronger password.
	SkipPasswordChecks bool `json:"skip_password_checks,omitempty"`

	// When set to `true`, `password` is not required anymore when creating the user and can be omitted.
	// This is useful when you are trying to create a user that doesn't have a password, in an instance that is using passwords.
	// Please note that you cannot use this flag if password is the only way for a user to sign into your instance.
	SkipPasswordRequirement bool `json:"skip_password_requirement,omitempty"`

	// In case TOTP is configured on the instance, you can provide the secret to enable it on the newly created user without the need to reset it.
	// Please note that currently the supported options are:
	// * Period: 30 seconds
	// * Code length: 6 digits
	// * Algorithm: SHA1
	TotpSecret *string `json:"totp_secret,omitempty"`

	// Metadata saved on the user, that can be updated from both the Frontend and Backend APIs.
	// Note: Since this data can be modified from the frontend, it is not guaranteed to be safe.
	UnsafeMetadata interface{} `json:"unsafe_metadata,omitempty"`

	// The username to give to the user.
	// It must be unique across your instance.
	Username *string `json:"username,omitempty"`

	// Web3 wallets to add to the user.
	// Must be unique across your instance.
	// The first wallet will be set as the user's primary wallet.
	Web3Wallet []string `json:"web3_wallet"`
}

// Validate validates this clerk user
func (m *ClerkUser) Validate(formats strfmt.Registry) error {
	var res []error

	if err := m.validatePasswordHasher(formats); err != nil {
		res = append(res, err)
	}

	if len(res) > 0 {
		return errors.CompositeValidationError(res...)
	}
	return nil
}

var clerkUserTypePasswordHasherPropEnum []interface{}

func init() {
	var res []string
	if err := json.Unmarshal([]byte(`["bcrypt","md5","pbkdf2_sha256","pbkdf2_sha256_django","pbkdf2_sha1","scrypt_firebase","argon2i","argon2id"]`), &res); err != nil {
		panic(err)
	}
	for _, v := range res {
		clerkUserTypePasswordHasherPropEnum = append(clerkUserTypePasswordHasherPropEnum, v)
	}
}

const (

	// ClerkUserPasswordHasherBcrypt captures enum value "bcrypt"
	ClerkUserPasswordHasherBcrypt string = "bcrypt"

	// ClerkUserPasswordHasherMd5 captures enum value "md5"
	ClerkUserPasswordHasherMd5 string = "md5"

	// ClerkUserPasswordHasherPbkdf2Sha256 captures enum value "pbkdf2_sha256"
	ClerkUserPasswordHasherPbkdf2Sha256 string = "pbkdf2_sha256"

	// ClerkUserPasswordHasherPbkdf2Sha256Django captures enum value "pbkdf2_sha256_django"
	ClerkUserPasswordHasherPbkdf2Sha256Django string = "pbkdf2_sha256_django"

	// ClerkUserPasswordHasherPbkdf2Sha1 captures enum value "pbkdf2_sha1"
	ClerkUserPasswordHasherPbkdf2Sha1 string = "pbkdf2_sha1"

	// ClerkUserPasswordHasherScryptFirebase captures enum value "scrypt_firebase"
	ClerkUserPasswordHasherScryptFirebase string = "scrypt_firebase"

	// ClerkUserPasswordHasherArgon2i captures enum value "argon2i"
	ClerkUserPasswordHasherArgon2i string = "argon2i"

	// ClerkUserPasswordHasherArgon2id captures enum value "argon2id"
	ClerkUserPasswordHasherArgon2id string = "argon2id"
)

// prop value enum
func (m *ClerkUser) validatePasswordHasherEnum(path, location string, value string) error {
	if err := validate.EnumCase(path, location, value, clerkUserTypePasswordHasherPropEnum, true); err != nil {
		return err
	}
	return nil
}

func (m *ClerkUser) validatePasswordHasher(formats strfmt.Registry) error {
	if swag.IsZero(m.PasswordHasher) { // not required
		return nil
	}

	// value enum
	if err := m.validatePasswordHasherEnum("password_hasher", "body", *m.PasswordHasher); err != nil {
		return err
	}

	return nil
}

// ContextValidate validates this clerk user based on context it is used
func (m *ClerkUser) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
	return nil
}

// MarshalBinary interface implementation
func (m *ClerkUser) MarshalBinary() ([]byte, error) {
	if m == nil {
		return nil, nil
	}
	return swag.WriteJSON(m)
}

// UnmarshalBinary interface implementation
func (m *ClerkUser) UnmarshalBinary(b []byte) error {
	var res ClerkUser
	if err := swag.ReadJSON(b, &res); err != nil {
		return err
	}
	*m = res
	return nil
}
