##
#    This code was generated by
#    ___ _ _ _ _ _    _ ____    ____ ____ _    ____ ____ _  _ ____ ____ ____ ___ __   __
#     |  | | | | |    | |  | __ |  | |__| | __ | __ |___ |\ | |___ |__/ |__|  | |  | |__/
#     |  |_|_| | |___ | |__|    |__| |  | |    |__] |___ | \| |___ |  \ |  |  | |__| |  \
#
#    Twilio - Verify
#    This is the public Twilio REST API.
#
#    NOTE: This class is auto generated by OpenAPI Generator.
#    https://openapi-generator.tech
#    Do not edit the class manually.
#


module Twilio
    module REST
        class Verify < VerifyBase
            class V2 < Version
                class ServiceContext < InstanceContext
                class EntityContext < InstanceContext

                     class NewFactorList < ListResource
                
                    ##
                    # Initialize the NewFactorList
                    # @param [Version] version Version that contains the resource
                    # @return [NewFactorList] NewFactorList
                    def initialize(version, service_sid: nil, identity: nil)
                        super(version)
                        # Path Solution
                        @solution = { service_sid: service_sid, identity: identity }
                        @uri = "/Services/#{@solution[:service_sid]}/Entities/#{@solution[:identity]}/Factors"
                        
                    end
                    ##
                    # Create the NewFactorInstance
                    # @param [String] friendly_name The friendly name of this Factor. This can be any string up to 64 characters, meant for humans to distinguish between Factors. For `factor_type` `push`, this could be a device name. For `factor_type` `totp`, this value is used as the “account name” in constructing the `binding.uri` property. At the same time, we recommend avoiding providing PII.
                    # @param [FactorTypes] factor_type 
                    # @param [String] binding_alg The algorithm used when `factor_type` is `push`. Algorithm supported: `ES256`
                    # @param [String] binding_public_key The Ecdsa public key in PKIX, ASN.1 DER format encoded in Base64.  Required when `factor_type` is `push`
                    # @param [String] config_app_id The ID that uniquely identifies your app in the Google or Apple store, such as `com.example.myapp`. It can be up to 100 characters long.  Required when `factor_type` is `push`.
                    # @param [NotificationPlatforms] config_notification_platform 
                    # @param [String] config_notification_token For APN, the device token. For FCM, the registration token. It is used to send the push notifications. Must be between 32 and 255 characters long.  Required when `factor_type` is `push`.
                    # @param [String] config_sdk_version The Verify Push SDK version used to configure the factor  Required when `factor_type` is `push`
                    # @param [String] binding_secret The shared secret for TOTP factors encoded in Base32. This can be provided when creating the Factor, otherwise it will be generated.  Used when `factor_type` is `totp`
                    # @param [String] config_time_step Defines how often, in seconds, are TOTP codes generated. i.e, a new TOTP code is generated every time_step seconds. Must be between 20 and 60 seconds, inclusive. The default value is defined at the service level in the property `totp.time_step`. Defaults to 30 seconds if not configured.  Used when `factor_type` is `totp`
                    # @param [String] config_skew The number of time-steps, past and future, that are valid for validation of TOTP codes. Must be between 0 and 2, inclusive. The default value is defined at the service level in the property `totp.skew`. If not configured defaults to 1.  Used when `factor_type` is `totp`
                    # @param [String] config_code_length Number of digits for generated TOTP codes. Must be between 3 and 8, inclusive. The default value is defined at the service level in the property `totp.code_length`. If not configured defaults to 6.  Used when `factor_type` is `totp`
                    # @param [TotpAlgorithms] config_alg 
                    # @param [Object] metadata Custom metadata associated with the factor. This is added by the Device/SDK directly to allow for the inclusion of device information. It must be a stringified JSON with only strings values eg. `{\\\"os\\\": \\\"Android\\\"}`. Can be up to 1024 characters in length.
                    # @return [NewFactorInstance] Created NewFactorInstance
                    def create(
                        friendly_name: nil, 
                        factor_type: nil, 
                        binding_alg: :unset, 
                        binding_public_key: :unset, 
                        config_app_id: :unset, 
                        config_notification_platform: :unset, 
                        config_notification_token: :unset, 
                        config_sdk_version: :unset, 
                        binding_secret: :unset, 
                        config_time_step: :unset, 
                        config_skew: :unset, 
                        config_code_length: :unset, 
                        config_alg: :unset, 
                        metadata: :unset
                    )

                        data = Twilio::Values.of({
                            'FriendlyName' => friendly_name,
                            'FactorType' => factor_type,
                            'Binding.Alg' => binding_alg,
                            'Binding.PublicKey' => binding_public_key,
                            'Config.AppId' => config_app_id,
                            'Config.NotificationPlatform' => config_notification_platform,
                            'Config.NotificationToken' => config_notification_token,
                            'Config.SdkVersion' => config_sdk_version,
                            'Binding.Secret' => binding_secret,
                            'Config.TimeStep' => config_time_step,
                            'Config.Skew' => config_skew,
                            'Config.CodeLength' => config_code_length,
                            'Config.Alg' => config_alg,
                            'Metadata' => Twilio.serialize_object(metadata),
                        })

                        headers = Twilio::Values.of({'Content-Type' => 'application/x-www-form-urlencoded', })
                        
                        
                        
                        
                        
                        payload = @version.create('POST', @uri, data: data, headers: headers)
                        NewFactorInstance.new(
                            @version,
                            payload,
                            service_sid: @solution[:service_sid],
                            identity: @solution[:identity],
                        )
                    end

                


                    # Provide a user friendly representation
                    def to_s
                        '#<Twilio.Verify.V2.NewFactorList>'
                    end
                end

                class NewFactorPage < Page
                    ##
                    # Initialize the NewFactorPage
                    # @param [Version] version Version that contains the resource
                    # @param [Response] response Response from the API
                    # @param [Hash] solution Path solution for the resource
                    # @return [NewFactorPage] NewFactorPage
                    def initialize(version, response, solution)
                        super(version, response)

                        # Path Solution
                        @solution = solution
                    end

                    ##
                    # Build an instance of NewFactorInstance
                    # @param [Hash] payload Payload response from the API
                    # @return [NewFactorInstance] NewFactorInstance
                    def get_instance(payload)
                        NewFactorInstance.new(@version, payload, service_sid: @solution[:service_sid], identity: @solution[:identity])
                    end

                    ##
                    # Provide a user friendly representation
                    def to_s
                        '<Twilio.Verify.V2.NewFactorPage>'
                    end
                end
                class NewFactorInstance < InstanceResource
                    ##
                    # Initialize the NewFactorInstance
                    # @param [Version] version Version that contains the resource
                    # @param [Hash] payload payload that contains response from Twilio
                    # @param [String] account_sid The SID of the
                    #   {Account}[https://www.twilio.com/docs/iam/api/account] that created this NewFactor
                    #   resource.
                    # @param [String] sid The SID of the Call resource to fetch.
                    # @return [NewFactorInstance] NewFactorInstance
                    def initialize(version, payload , service_sid: nil, identity: nil)
                        super(version)
                        
                        # Marshaled Properties
                        @properties = { 
                            'sid' => payload['sid'],
                            'account_sid' => payload['account_sid'],
                            'service_sid' => payload['service_sid'],
                            'entity_sid' => payload['entity_sid'],
                            'identity' => payload['identity'],
                            'binding' => payload['binding'],
                            'options' => payload['options'],
                            'date_created' => Twilio.deserialize_iso8601_datetime(payload['date_created']),
                            'date_updated' => Twilio.deserialize_iso8601_datetime(payload['date_updated']),
                            'friendly_name' => payload['friendly_name'],
                            'status' => payload['status'],
                            'factor_type' => payload['factor_type'],
                            'config' => payload['config'],
                            'metadata' => payload['metadata'],
                            'url' => payload['url'],
                        }
                    end

                    
                    ##
                    # @return [String] A 34 character string that uniquely identifies this Factor.
                    def sid
                        @properties['sid']
                    end
                    
                    ##
                    # @return [String] The unique SID identifier of the Account.
                    def account_sid
                        @properties['account_sid']
                    end
                    
                    ##
                    # @return [String] The unique SID identifier of the Service.
                    def service_sid
                        @properties['service_sid']
                    end
                    
                    ##
                    # @return [String] The unique SID identifier of the Entity.
                    def entity_sid
                        @properties['entity_sid']
                    end
                    
                    ##
                    # @return [String] Customer unique identity for the Entity owner of the Factor. This identifier should be immutable, not PII, length between 8 and 64 characters, and generated by your external system, such as your user's UUID, GUID, or SID. It can only contain dash (-) separated alphanumeric characters.
                    def identity
                        @properties['identity']
                    end
                    
                    ##
                    # @return [Hash] Contains the `factor_type` specific secret and metadata. For push, this is `binding.public_key` and `binding.alg`. For totp, this is `binding.secret` and `binding.uri`. The `binding.uri` property is generated following the [google authenticator key URI format](https://github.com/google/google-authenticator/wiki/Key-Uri-Format), and `Factor.friendly_name` is used for the “accountname” value and `Service.friendly_name` or `Service.totp.issuer` is used for the `issuer` value.   The Binding property is ONLY returned upon Factor creation.
                    def binding
                        @properties['binding']
                    end
                    
                    ##
                    # @return [Hash] 
                    def options
                        @properties['options']
                    end
                    
                    ##
                    # @return [Time] The date that this Factor was created, given in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.
                    def date_created
                        @properties['date_created']
                    end
                    
                    ##
                    # @return [Time] The date that this Factor was updated, given in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.
                    def date_updated
                        @properties['date_updated']
                    end
                    
                    ##
                    # @return [String] The friendly name of this Factor. This can be any string up to 64 characters, meant for humans to distinguish between Factors. For `factor_type` `push`, this could be a device name. For `factor_type` `totp`, this value is used as the “account name” in constructing the `binding.uri` property. At the same time, we recommend avoiding providing PII.
                    def friendly_name
                        @properties['friendly_name']
                    end
                    
                    ##
                    # @return [FactorStatuses] 
                    def status
                        @properties['status']
                    end
                    
                    ##
                    # @return [FactorTypes] 
                    def factor_type
                        @properties['factor_type']
                    end
                    
                    ##
                    # @return [Hash] An object that contains configurations specific to a `factor_type`.
                    def config
                        @properties['config']
                    end
                    
                    ##
                    # @return [Hash] Custom metadata associated with the factor. This is added by the Device/SDK directly to allow for the inclusion of device information. It must be a stringified JSON with only strings values eg. `{\"os\": \"Android\"}`. Can be up to 1024 characters in length.
                    def metadata
                        @properties['metadata']
                    end
                    
                    ##
                    # @return [String] The URL of this resource.
                    def url
                        @properties['url']
                    end
                    
                    ##
                    # Provide a user friendly representation
                    def to_s
                        "<Twilio.Verify.V2.NewFactorInstance>"
                    end

                    ##
                    # Provide a detailed, user friendly representation
                    def inspect
                        "<Twilio.Verify.V2.NewFactorInstance>"
                    end
                end

             end
             end
            end
        end
    end
end


