##
#    This code was generated by
#    ___ _ _ _ _ _    _ ____    ____ ____ _    ____ ____ _  _ ____ ____ ____ ___ __   __
#     |  | | | | |    | |  | __ |  | |__| | __ | __ |___ |\ | |___ |__/ |__|  | |  | |__/
#     |  |_|_| | |___ | |__|    |__| |  | |    |__] |___ | \| |___ |  \ |  |  | |__| |  \
#
#    Twilio - Messaging
#    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 Messaging < MessagingBase
            class V1 < Version
                class BrandRegistrationList < ListResource
                
                    ##
                    # Initialize the BrandRegistrationList
                    # @param [Version] version Version that contains the resource
                    # @return [BrandRegistrationList] BrandRegistrationList
                    def initialize(version)
                        super(version)
                        # Path Solution
                        @solution = {  }
                        @uri = "/a2p/BrandRegistrations"
                        
                    end
                    ##
                    # Create the BrandRegistrationInstance
                    # @param [String] customer_profile_bundle_sid Customer Profile Bundle Sid.
                    # @param [String] a2p_profile_bundle_sid A2P Messaging Profile Bundle Sid.
                    # @param [String] brand_type Type of brand being created. One of: \\\"STANDARD\\\", \\\"SOLE_PROPRIETOR\\\". SOLE_PROPRIETOR is for low volume, SOLE_PROPRIETOR use cases. STANDARD is for all other use cases.
                    # @param [Boolean] mock A boolean that specifies whether brand should be a mock or not. If true, brand will be registered as a mock brand. Defaults to false if no value is provided.
                    # @param [Boolean] skip_automatic_sec_vet A flag to disable automatic secondary vetting for brands which it would otherwise be done.
                    # @return [BrandRegistrationInstance] Created BrandRegistrationInstance
                    def create(
                        customer_profile_bundle_sid: nil, 
                        a2p_profile_bundle_sid: nil, 
                        brand_type: :unset, 
                        mock: :unset, 
                        skip_automatic_sec_vet: :unset
                    )

                        data = Twilio::Values.of({
                            'CustomerProfileBundleSid' => customer_profile_bundle_sid,
                            'A2PProfileBundleSid' => a2p_profile_bundle_sid,
                            'BrandType' => brand_type,
                            'Mock' => mock,
                            'SkipAutomaticSecVet' => skip_automatic_sec_vet,
                        })

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

                
                    ##
                    # Lists BrandRegistrationInstance records from the API as a list.
                    # Unlike stream(), this operation is eager and will load `limit` records into
                    # memory before returning.
                    # @param [Integer] limit Upper limit for the number of records to return. stream()
                    #    guarantees to never return more than limit.  Default is no limit
                    # @param [Integer] page_size Number of records to fetch per request, when
                    #    not set will use the default value of 50 records.  If no page_size is defined
                    #    but a limit is defined, stream() will attempt to read the limit with the most
                    #    efficient page size, i.e. min(limit, 1000)
                    # @return [Array] Array of up to limit results
                    def list(limit: nil, page_size: nil)
                        self.stream(
                            limit: limit,
                            page_size: page_size
                        ).entries
                    end

                    ##
                    # Streams Instance records from the API as an Enumerable.
                    # This operation lazily loads records as efficiently as possible until the limit
                    # is reached.
                    # @param [Integer] limit Upper limit for the number of records to return. stream()
                    #    guarantees to never return more than limit.  Default is no limit
                    # @param [Integer] page_size Number of records to fetch per request, when
                    #    not set will use the default value of 50 records.  If no page_size is defined
                    #    but a limit is defined, stream() will attempt to read the limit with the most
                    #    efficient page size, i.e. min(limit, 1000)
                    # @return [Enumerable] Enumerable that will yield up to limit results
                    def stream(limit: nil, page_size: nil)
                        limits = @version.read_limits(limit, page_size)

                        page = self.page(
                            page_size: limits[:page_size], )

                        @version.stream(page, limit: limits[:limit], page_limit: limits[:page_limit])
                    end

                    ##
                    # When passed a block, yields BrandRegistrationInstance records from the API.
                    # This operation lazily loads records as efficiently as possible until the limit
                    # is reached.
                    def each
                        limits = @version.read_limits

                        page = self.page(page_size: limits[:page_size], )

                        @version.stream(page,
                            limit: limits[:limit],
                            page_limit: limits[:page_limit]).each {|x| yield x}
                    end

                    ##
                    # Retrieve a single page of BrandRegistrationInstance records from the API.
                    # Request is executed immediately.
                    # @param [String] page_token PageToken provided by the API
                    # @param [Integer] page_number Page Number, this value is simply for client state
                    # @param [Integer] page_size Number of records to return, defaults to 50
                    # @return [Page] Page of BrandRegistrationInstance
                    def page(page_token: :unset, page_number: :unset, page_size: :unset)
                        params = Twilio::Values.of({
                            'PageToken' => page_token,
                            'Page' => page_number,
                            'PageSize' => page_size,
                        })
                        headers = Twilio::Values.of({})
                        
                        

                        response = @version.page('GET', @uri, params: params, headers: headers)

                        BrandRegistrationPage.new(@version, response, @solution)
                    end

                    ##
                    # Retrieve a single page of BrandRegistrationInstance records from the API.
                    # Request is executed immediately.
                    # @param [String] target_url API-generated URL for the requested results page
                    # @return [Page] Page of BrandRegistrationInstance
                    def get_page(target_url)
                        response = @version.domain.request(
                            'GET',
                            target_url
                        )
                    BrandRegistrationPage.new(@version, response, @solution)
                    end
                    


                    # Provide a user friendly representation
                    def to_s
                        '#<Twilio.Messaging.V1.BrandRegistrationList>'
                    end
                end


                class BrandRegistrationContext < InstanceContext
                    ##
                    # Initialize the BrandRegistrationContext
                    # @param [Version] version Version that contains the resource
                    # @param [String] sid The SID of the Brand Registration resource to update.
                    # @return [BrandRegistrationContext] BrandRegistrationContext
                    def initialize(version, sid)
                        super(version)

                        # Path Solution
                        @solution = { sid: sid,  }
                        @uri = "/a2p/BrandRegistrations/#{@solution[:sid]}"

                        # Dependents
                        @brand_registration_otps = nil
                        @brand_vettings = nil
                        @brand_registration2_fa = nil
                    end
                    ##
                    # Fetch the BrandRegistrationInstance
                    # @return [BrandRegistrationInstance] Fetched BrandRegistrationInstance
                    def fetch

                        headers = Twilio::Values.of({'Content-Type' => 'application/x-www-form-urlencoded', })
                        
                        
                        
                        
                        
                        payload = @version.fetch('GET', @uri, headers: headers)
                        BrandRegistrationInstance.new(
                            @version,
                            payload,
                            sid: @solution[:sid],
                        )
                    end

                    ##
                    # Update the BrandRegistrationInstance
                    # @return [BrandRegistrationInstance] Updated BrandRegistrationInstance
                    def update

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

                    ##
                    # Access the brand_registration_otps
                    # @return [BrandRegistrationOtpList]
                    # @return [BrandRegistrationOtpContext]
                    def brand_registration_otps
                      unless @brand_registration_otps
                        @brand_registration_otps = BrandRegistrationOtpList.new(
                                @version, brand_registration_sid: @solution[:sid], )
                      end
                      @brand_registration_otps
                    end
                    ##
                    # Access the brand_vettings
                    # @return [BrandVettingList]
                    # @return [BrandVettingContext] if sid was passed.
                    def brand_vettings(brand_vetting_sid=:unset)

                        raise ArgumentError, 'brand_vetting_sid cannot be nil' if brand_vetting_sid.nil?

                        if brand_vetting_sid != :unset
                            return BrandVettingContext.new(@version, @solution[:sid],brand_vetting_sid )
                        end

                        unless @brand_vettings
                            @brand_vettings = BrandVettingList.new(
                                @version, brand_sid: @solution[:sid], )
                        end

                     @brand_vettings
                    end
                    ##
                    # Access the brand_registration2_fa
                    # @return [BrandRegistration2FaList]
                    # @return [BrandRegistration2FaContext]
                    def brand_registration2_fa
                        BrandRegistration2FaContext.new(
                                @version,
                                @solution[:sid]
                                )
                    end

                    ##
                    # Provide a user friendly representation
                    def to_s
                        context = @solution.map{|k, v| "#{k}: #{v}"}.join(',')
                        "#<Twilio.Messaging.V1.BrandRegistrationContext #{context}>"
                    end

                    ##
                    # Provide a detailed, user friendly representation
                    def inspect
                        context = @solution.map{|k, v| "#{k}: #{v}"}.join(',')
                        "#<Twilio.Messaging.V1.BrandRegistrationContext #{context}>"
                    end
                end

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

                        # Path Solution
                        @solution = solution
                    end

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

                    ##
                    # Provide a user friendly representation
                    def to_s
                        '<Twilio.Messaging.V1.BrandRegistrationPage>'
                    end
                end
                class BrandRegistrationInstance < InstanceResource
                    ##
                    # Initialize the BrandRegistrationInstance
                    # @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 BrandRegistration
                    #   resource.
                    # @param [String] sid The SID of the Call resource to fetch.
                    # @return [BrandRegistrationInstance] BrandRegistrationInstance
                    def initialize(version, payload , sid: nil)
                        super(version)
                        
                        # Marshaled Properties
                        @properties = { 
                            'sid' => payload['sid'],
                            'account_sid' => payload['account_sid'],
                            'customer_profile_bundle_sid' => payload['customer_profile_bundle_sid'],
                            'a2p_profile_bundle_sid' => payload['a2p_profile_bundle_sid'],
                            'date_created' => Twilio.deserialize_iso8601_datetime(payload['date_created']),
                            'date_updated' => Twilio.deserialize_iso8601_datetime(payload['date_updated']),
                            'brand_type' => payload['brand_type'],
                            'status' => payload['status'],
                            'tcr_id' => payload['tcr_id'],
                            'failure_reason' => payload['failure_reason'],
                            'errors' => payload['errors'],
                            'url' => payload['url'],
                            'brand_score' => payload['brand_score'] == nil ? payload['brand_score'] : payload['brand_score'].to_i,
                            'brand_feedback' => payload['brand_feedback'],
                            'identity_status' => payload['identity_status'],
                            'russell_3000' => payload['russell_3000'],
                            'government_entity' => payload['government_entity'],
                            'tax_exempt_status' => payload['tax_exempt_status'],
                            'skip_automatic_sec_vet' => payload['skip_automatic_sec_vet'],
                            'mock' => payload['mock'],
                            'links' => payload['links'],
                        }

                        # Context
                        @instance_context = nil
                        @params = { 'sid' => sid  || @properties['sid']  , }
                    end

                    ##
                    # Generate an instance context for the instance, the context is capable of
                    # performing various actions.  All instance actions are proxied to the context
                    # @return [BrandRegistrationContext] CallContext for this CallInstance
                    def context
                        unless @instance_context
                            @instance_context = BrandRegistrationContext.new(@version , @params['sid'])
                        end
                        @instance_context
                    end
                    
                    ##
                    # @return [String] The unique string to identify Brand Registration.
                    def sid
                        @properties['sid']
                    end
                    
                    ##
                    # @return [String] The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Brand Registration resource.
                    def account_sid
                        @properties['account_sid']
                    end
                    
                    ##
                    # @return [String] A2P Messaging Profile Bundle BundleSid.
                    def customer_profile_bundle_sid
                        @properties['customer_profile_bundle_sid']
                    end
                    
                    ##
                    # @return [String] A2P Messaging Profile Bundle BundleSid.
                    def a2p_profile_bundle_sid
                        @properties['a2p_profile_bundle_sid']
                    end
                    
                    ##
                    # @return [Time] The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.
                    def date_created
                        @properties['date_created']
                    end
                    
                    ##
                    # @return [Time] The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.
                    def date_updated
                        @properties['date_updated']
                    end
                    
                    ##
                    # @return [String] Type of brand. One of: \"STANDARD\", \"SOLE_PROPRIETOR\". SOLE_PROPRIETOR is for the low volume, SOLE_PROPRIETOR campaign use case. There can only be one SOLE_PROPRIETOR campaign created per SOLE_PROPRIETOR brand. STANDARD is for all other campaign use cases. Multiple campaign use cases can be created per STANDARD brand.
                    def brand_type
                        @properties['brand_type']
                    end
                    
                    ##
                    # @return [Status] 
                    def status
                        @properties['status']
                    end
                    
                    ##
                    # @return [String] Campaign Registry (TCR) Brand ID. Assigned only after successful brand registration.
                    def tcr_id
                        @properties['tcr_id']
                    end
                    
                    ##
                    # @return [String] DEPRECATED. A reason why brand registration has failed. Only applicable when status is FAILED.
                    def failure_reason
                        @properties['failure_reason']
                    end
                    
                    ##
                    # @return [Array<Hash>] A list of errors that occurred during the brand registration process.
                    def errors
                        @properties['errors']
                    end
                    
                    ##
                    # @return [String] The absolute URL of the Brand Registration resource.
                    def url
                        @properties['url']
                    end
                    
                    ##
                    # @return [String] The secondary vetting score if it was done. Otherwise, it will be the brand score if it's returned from TCR. It may be null if no score is available.
                    def brand_score
                        @properties['brand_score']
                    end
                    
                    ##
                    # @return [Array<BrandFeedback>] DEPRECATED. Feedback on how to improve brand score
                    def brand_feedback
                        @properties['brand_feedback']
                    end
                    
                    ##
                    # @return [IdentityStatus] 
                    def identity_status
                        @properties['identity_status']
                    end
                    
                    ##
                    # @return [Boolean] Publicly traded company identified in the Russell 3000 Index
                    def russell_3000
                        @properties['russell_3000']
                    end
                    
                    ##
                    # @return [Boolean] Identified as a government entity
                    def government_entity
                        @properties['government_entity']
                    end
                    
                    ##
                    # @return [String] Nonprofit organization tax-exempt status per section 501 of the U.S. tax code.
                    def tax_exempt_status
                        @properties['tax_exempt_status']
                    end
                    
                    ##
                    # @return [Boolean] A flag to disable automatic secondary vetting for brands which it would otherwise be done.
                    def skip_automatic_sec_vet
                        @properties['skip_automatic_sec_vet']
                    end
                    
                    ##
                    # @return [Boolean] A boolean that specifies whether brand should be a mock or not. If true, brand will be registered as a mock brand. Defaults to false if no value is provided.
                    def mock
                        @properties['mock']
                    end
                    
                    ##
                    # @return [Hash] 
                    def links
                        @properties['links']
                    end
                    
                    ##
                    # Fetch the BrandRegistrationInstance
                    # @return [BrandRegistrationInstance] Fetched BrandRegistrationInstance
                    def fetch

                        context.fetch
                    end

                    ##
                    # Update the BrandRegistrationInstance
                    # @return [BrandRegistrationInstance] Updated BrandRegistrationInstance
                    def update

                        context.update
                    end

                    ##
                    # Access the brand_registration_otps
                    # @return [brand_registration_otps] brand_registration_otps
                    def brand_registration_otps
                        context.brand_registration_otps
                    end

                    ##
                    # Access the brand_vettings
                    # @return [brand_vettings] brand_vettings
                    def brand_vettings
                        context.brand_vettings
                    end

                    ##
                    # Access the brand_registration2_fa
                    # @return [brand_registration2_fa] brand_registration2_fa
                    def brand_registration2_fa
                        context.brand_registration2_fa
                    end

                    ##
                    # Provide a user friendly representation
                    def to_s
                        values = @params.map{|k, v| "#{k}: #{v}"}.join(" ")
                        "<Twilio.Messaging.V1.BrandRegistrationInstance #{values}>"
                    end

                    ##
                    # Provide a detailed, user friendly representation
                    def inspect
                        values = @properties.map{|k, v| "#{k}: #{v}"}.join(" ")
                        "<Twilio.Messaging.V1.BrandRegistrationInstance #{values}>"
                    end
                end

            end
        end
    end
end
