##
#    This code was generated by
#    ___ _ _ _ _ _    _ ____    ____ ____ _    ____ ____ _  _ ____ ____ ____ ___ __   __
#     |  | | | | |    | |  | __ |  | |__| | __ | __ |___ |\ | |___ |__/ |__|  | |  | |__/
#     |  |_|_| | |___ | |__|    |__| |  | |    |__] |___ | \| |___ |  \ |  |  | |__| |  \
#
#    Twilio - Supersim
#    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 Supersim < SupersimBase
            class V1 < Version
                class IpCommandList < ListResource
                
                    ##
                    # Initialize the IpCommandList
                    # @param [Version] version Version that contains the resource
                    # @return [IpCommandList] IpCommandList
                    def initialize(version)
                        super(version)
                        # Path Solution
                        @solution = {  }
                        @uri = "/IpCommands"
                        
                    end
                    ##
                    # Create the IpCommandInstance
                    # @param [String] sim The `sid` or `unique_name` of the [Super SIM](https://www.twilio.com/docs/iot/supersim/api/sim-resource) to send the IP Command to.
                    # @param [String] payload The data that will be sent to the device. The payload cannot exceed 1300 bytes. If the PayloadType is set to text, the payload is encoded in UTF-8. If PayloadType is set to binary, the payload is encoded in Base64.
                    # @param [String] device_port The device port to which the IP Command will be sent.
                    # @param [PayloadType] payload_type 
                    # @param [String] callback_url The URL we should call using the `callback_method` after we have sent the IP Command.
                    # @param [String] callback_method The HTTP method we should use to call `callback_url`. Can be `GET` or `POST`, and the default is `POST`.
                    # @return [IpCommandInstance] Created IpCommandInstance
                    def create(
                        sim: nil, 
                        payload: nil, 
                        device_port: nil, 
                        payload_type: :unset, 
                        callback_url: :unset, 
                        callback_method: :unset
                    )

                        data = Twilio::Values.of({
                            'Sim' => sim,
                            'Payload' => payload,
                            'DevicePort' => device_port,
                            'PayloadType' => payload_type,
                            'CallbackUrl' => callback_url,
                            'CallbackMethod' => callback_method,
                        })

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

                
                    ##
                    # Lists IpCommandInstance records from the API as a list.
                    # Unlike stream(), this operation is eager and will load `limit` records into
                    # memory before returning.
                    # @param [String] sim The SID or unique name of the Sim resource that IP Command was sent to or from.
                    # @param [String] sim_iccid The ICCID of the Sim resource that IP Command was sent to or from.
                    # @param [Status] status The status of the IP Command. Can be: `queued`, `sent`, `received` or `failed`. See the [IP Command Status Values](https://www.twilio.com/docs/iot/supersim/api/ipcommand-resource#status-values) for a description of each.
                    # @param [Direction] direction The direction of the IP Command. Can be `to_sim` or `from_sim`. The value of `to_sim` is synonymous with the term `mobile terminated`, and `from_sim` is synonymous with the term `mobile originated`.
                    # @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(sim: :unset, sim_iccid: :unset, status: :unset, direction: :unset, limit: nil, page_size: nil)
                        self.stream(
                            sim: sim,
                            sim_iccid: sim_iccid,
                            status: status,
                            direction: direction,
                            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 [String] sim The SID or unique name of the Sim resource that IP Command was sent to or from.
                    # @param [String] sim_iccid The ICCID of the Sim resource that IP Command was sent to or from.
                    # @param [Status] status The status of the IP Command. Can be: `queued`, `sent`, `received` or `failed`. See the [IP Command Status Values](https://www.twilio.com/docs/iot/supersim/api/ipcommand-resource#status-values) for a description of each.
                    # @param [Direction] direction The direction of the IP Command. Can be `to_sim` or `from_sim`. The value of `to_sim` is synonymous with the term `mobile terminated`, and `from_sim` is synonymous with the term `mobile originated`.
                    # @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(sim: :unset, sim_iccid: :unset, status: :unset, direction: :unset, limit: nil, page_size: nil)
                        limits = @version.read_limits(limit, page_size)

                        page = self.page(
                            sim: sim,
                            sim_iccid: sim_iccid,
                            status: status,
                            direction: direction,
                            page_size: limits[:page_size], )

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

                    ##
                    # When passed a block, yields IpCommandInstance 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 IpCommandInstance records from the API.
                    # Request is executed immediately.
                    # @param [String] sim The SID or unique name of the Sim resource that IP Command was sent to or from.
                    # @param [String] sim_iccid The ICCID of the Sim resource that IP Command was sent to or from.
                    # @param [Status] status The status of the IP Command. Can be: `queued`, `sent`, `received` or `failed`. See the [IP Command Status Values](https://www.twilio.com/docs/iot/supersim/api/ipcommand-resource#status-values) for a description of each.
                    # @param [Direction] direction The direction of the IP Command. Can be `to_sim` or `from_sim`. The value of `to_sim` is synonymous with the term `mobile terminated`, and `from_sim` is synonymous with the term `mobile originated`.
                    # @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 IpCommandInstance
                    def page(sim: :unset, sim_iccid: :unset, status: :unset, direction: :unset, page_token: :unset, page_number: :unset, page_size: :unset)
                        params = Twilio::Values.of({
                            'Sim' => sim,
                            'SimIccid' => sim_iccid,
                            'Status' => status,
                            'Direction' => direction,
                            'PageToken' => page_token,
                            'Page' => page_number,
                            'PageSize' => page_size,
                        })
                        headers = Twilio::Values.of({})
                        
                        

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

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

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


                    # Provide a user friendly representation
                    def to_s
                        '#<Twilio.Supersim.V1.IpCommandList>'
                    end
                end


                class IpCommandContext < InstanceContext
                    ##
                    # Initialize the IpCommandContext
                    # @param [Version] version Version that contains the resource
                    # @param [String] sid The SID of the IP Command resource to fetch.
                    # @return [IpCommandContext] IpCommandContext
                    def initialize(version, sid)
                        super(version)

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

                        
                    end
                    ##
                    # Fetch the IpCommandInstance
                    # @return [IpCommandInstance] Fetched IpCommandInstance
                    def fetch

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


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

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

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

                        # Path Solution
                        @solution = solution
                    end

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

                    ##
                    # Provide a user friendly representation
                    def to_s
                        '<Twilio.Supersim.V1.IpCommandPage>'
                    end
                end
                class IpCommandInstance < InstanceResource
                    ##
                    # Initialize the IpCommandInstance
                    # @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 IpCommand
                    #   resource.
                    # @param [String] sid The SID of the Call resource to fetch.
                    # @return [IpCommandInstance] IpCommandInstance
                    def initialize(version, payload , sid: nil)
                        super(version)
                        
                        # Marshaled Properties
                        @properties = { 
                            'sid' => payload['sid'],
                            'account_sid' => payload['account_sid'],
                            'sim_sid' => payload['sim_sid'],
                            'sim_iccid' => payload['sim_iccid'],
                            'status' => payload['status'],
                            'direction' => payload['direction'],
                            'device_ip' => payload['device_ip'],
                            'device_port' => payload['device_port'] == nil ? payload['device_port'] : payload['device_port'].to_i,
                            'payload_type' => payload['payload_type'],
                            'payload' => payload['payload'],
                            'date_created' => Twilio.deserialize_iso8601_datetime(payload['date_created']),
                            'date_updated' => Twilio.deserialize_iso8601_datetime(payload['date_updated']),
                            'url' => payload['url'],
                        }

                        # 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 [IpCommandContext] CallContext for this CallInstance
                    def context
                        unless @instance_context
                            @instance_context = IpCommandContext.new(@version , @params['sid'])
                        end
                        @instance_context
                    end
                    
                    ##
                    # @return [String] The unique string that we created to identify the IP Command resource.
                    def sid
                        @properties['sid']
                    end
                    
                    ##
                    # @return [String] The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IP Command resource.
                    def account_sid
                        @properties['account_sid']
                    end
                    
                    ##
                    # @return [String] The SID of the [Super SIM](https://www.twilio.com/docs/iot/supersim/api/sim-resource) that this IP Command was sent to or from.
                    def sim_sid
                        @properties['sim_sid']
                    end
                    
                    ##
                    # @return [String] The [ICCID](https://en.wikipedia.org/wiki/Subscriber_identity_module#ICCID) of the [Super SIM](https://www.twilio.com/docs/iot/supersim/api/sim-resource) that this IP Command was sent to or from.
                    def sim_iccid
                        @properties['sim_iccid']
                    end
                    
                    ##
                    # @return [Status] 
                    def status
                        @properties['status']
                    end
                    
                    ##
                    # @return [Direction] 
                    def direction
                        @properties['direction']
                    end
                    
                    ##
                    # @return [String] The IP address of the device that the IP Command was sent to or received from. For an IP Command sent to a Super SIM, `device_ip` starts out as `null`, and once the IP Command is “sent”, the `device_ip` will be filled out. An IP Command sent from a Super SIM have its `device_ip` always set.
                    def device_ip
                        @properties['device_ip']
                    end
                    
                    ##
                    # @return [String] For an IP Command sent to a Super SIM, it would be the destination port of the IP message. For an IP Command sent from a Super SIM, it would be the source port of the IP message.
                    def device_port
                        @properties['device_port']
                    end
                    
                    ##
                    # @return [PayloadType] 
                    def payload_type
                        @properties['payload_type']
                    end
                    
                    ##
                    # @return [String] The payload that is carried in the IP/UDP message. The payload can be encoded in either text or binary format. For text payload, UTF-8 encoding must be used.  For an IP Command sent to a Super SIM, the payload is appended to the IP/UDP message “as is”. The payload should not exceed 1300 bytes.  For an IP Command sent from a Super SIM, the payload from the received IP/UDP message is extracted and sent in binary encoding. For an IP Command sent from a Super SIM, the payload should not exceed 1300 bytes. If it is larger than 1300 bytes, there might be fragmentation on the upstream and the message may appear truncated.
                    def payload
                        @properties['payload']
                    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] The absolute URL of the IP Command resource.
                    def url
                        @properties['url']
                    end
                    
                    ##
                    # Fetch the IpCommandInstance
                    # @return [IpCommandInstance] Fetched IpCommandInstance
                    def fetch

                        context.fetch
                    end

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

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

            end
        end
    end
end
