##
#    This code was generated by
#    ___ _ _ _ _ _    _ ____    ____ ____ _    ____ ____ _  _ ____ ____ ____ ___ __   __
#     |  | | | | |    | |  | __ |  | |__| | __ | __ |___ |\ | |___ |__/ |__|  | |  | |__/
#     |  |_|_| | |___ | |__|    |__| |  | |    |__] |___ | \| |___ |  \ |  |  | |__| |  \
#
#    Twilio - Bulkexports
#    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 Bulkexports < BulkexportsBase
            class V1 < Version
                class ExportContext < InstanceContext

                     class ExportCustomJobList < ListResource
                
                    ##
                    # Initialize the ExportCustomJobList
                    # @param [Version] version Version that contains the resource
                    # @return [ExportCustomJobList] ExportCustomJobList
                    def initialize(version, resource_type: nil)
                        super(version)
                        # Path Solution
                        @solution = { resource_type: resource_type }
                        @uri = "/Exports/#{@solution[:resource_type]}/Jobs"
                        
                    end
                    ##
                    # Create the ExportCustomJobInstance
                    # @param [String] start_day The start day for the custom export specified as a string in the format of yyyy-mm-dd
                    # @param [String] end_day The end day for the custom export specified as a string in the format of yyyy-mm-dd. End day is inclusive and must be 2 days earlier than the current UTC day.
                    # @param [String] friendly_name The friendly name specified when creating the job
                    # @param [String] webhook_url The optional webhook url called on completion of the job. If this is supplied, `WebhookMethod` must also be supplied. If you set neither webhook nor email, you will have to check your job's status manually.
                    # @param [String] webhook_method This is the method used to call the webhook on completion of the job. If this is supplied, `WebhookUrl` must also be supplied.
                    # @param [String] email The optional email to send the completion notification to. You can set both webhook, and email, or one or the other. If you set neither, the job will run but you will have to query to determine your job's status.
                    # @return [ExportCustomJobInstance] Created ExportCustomJobInstance
                    def create(
                        start_day: nil, 
                        end_day: nil, 
                        friendly_name: nil, 
                        webhook_url: :unset, 
                        webhook_method: :unset, 
                        email: :unset
                    )

                        data = Twilio::Values.of({
                            'StartDay' => start_day,
                            'EndDay' => end_day,
                            'FriendlyName' => friendly_name,
                            'WebhookUrl' => webhook_url,
                            'WebhookMethod' => webhook_method,
                            'Email' => email,
                        })

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

                
                    ##
                    # Lists ExportCustomJobInstance 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 ExportCustomJobInstance 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 ExportCustomJobInstance 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 ExportCustomJobInstance
                    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)

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

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


                    # Provide a user friendly representation
                    def to_s
                        '#<Twilio.Bulkexports.V1.ExportCustomJobList>'
                    end
                end

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

                        # Path Solution
                        @solution = solution
                    end

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

                    ##
                    # Provide a user friendly representation
                    def to_s
                        '<Twilio.Bulkexports.V1.ExportCustomJobPage>'
                    end
                end
                class ExportCustomJobInstance < InstanceResource
                    ##
                    # Initialize the ExportCustomJobInstance
                    # @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 ExportCustomJob
                    #   resource.
                    # @param [String] sid The SID of the Call resource to fetch.
                    # @return [ExportCustomJobInstance] ExportCustomJobInstance
                    def initialize(version, payload , resource_type: nil)
                        super(version)
                        
                        # Marshaled Properties
                        @properties = { 
                            'friendly_name' => payload['friendly_name'],
                            'resource_type' => payload['resource_type'],
                            'start_day' => payload['start_day'],
                            'end_day' => payload['end_day'],
                            'webhook_url' => payload['webhook_url'],
                            'webhook_method' => payload['webhook_method'],
                            'email' => payload['email'],
                            'job_sid' => payload['job_sid'],
                            'details' => payload['details'],
                            'job_queue_position' => payload['job_queue_position'],
                            'estimated_completion_time' => payload['estimated_completion_time'],
                        }
                    end

                    
                    ##
                    # @return [String] The friendly name specified when creating the job
                    def friendly_name
                        @properties['friendly_name']
                    end
                    
                    ##
                    # @return [String] The type of communication – Messages, Calls, Conferences, and Participants
                    def resource_type
                        @properties['resource_type']
                    end
                    
                    ##
                    # @return [String] The start day for the custom export specified when creating the job
                    def start_day
                        @properties['start_day']
                    end
                    
                    ##
                    # @return [String] The end day for the export specified when creating the job
                    def end_day
                        @properties['end_day']
                    end
                    
                    ##
                    # @return [String] The optional webhook url called on completion of the job. If this is supplied, `WebhookMethod` must also be supplied.
                    def webhook_url
                        @properties['webhook_url']
                    end
                    
                    ##
                    # @return [String] This is the method used to call the webhook on completion of the job. If this is supplied, `WebhookUrl` must also be supplied.
                    def webhook_method
                        @properties['webhook_method']
                    end
                    
                    ##
                    # @return [String] The optional email to send the completion notification to
                    def email
                        @properties['email']
                    end
                    
                    ##
                    # @return [String] The unique job_sid returned when the custom export was created
                    def job_sid
                        @properties['job_sid']
                    end
                    
                    ##
                    # @return [Array<Hash>] The details of a job which is an object that contains an array of status grouped by `status` state.  Each `status` object has a `status` string, a count which is the number of days in that `status`, and list of days in that `status`. The day strings are in the format yyyy-MM-dd. As an example, a currently running job may have a status object for COMPLETED and a `status` object for SUBMITTED each with its own count and list of days.
                    def details
                        @properties['details']
                    end
                    
                    ##
                    # @return [String] This is the job position from the 1st in line. Your queue position will never increase. As jobs ahead of yours in the queue are processed, the queue position number will decrease
                    def job_queue_position
                        @properties['job_queue_position']
                    end
                    
                    ##
                    # @return [String] this is the time estimated until your job is complete. This is calculated each time you request the job list. The time is calculated based on the current rate of job completion (which may vary) and your job queue position
                    def estimated_completion_time
                        @properties['estimated_completion_time']
                    end
                    
                    ##
                    # Provide a user friendly representation
                    def to_s
                        "<Twilio.Bulkexports.V1.ExportCustomJobInstance>"
                    end

                    ##
                    # Provide a detailed, user friendly representation
                    def inspect
                        "<Twilio.Bulkexports.V1.ExportCustomJobInstance>"
                    end
                end

             end
            end
        end
    end
end


