##
# This code was generated by
# \ / _    _  _|   _  _
#  | (_)\/(_)(_|\/| |(/_  v1.0.0
#       /       /       

module Twilio
  module REST
    class Preview < Domain
      class Wireless < Version
        class DeviceList < ListResource
          ##
          # Initialize the DeviceList
          # @param [Version] version Version that contains the resource
          
          # @return [DeviceList] DeviceList
          def initialize(version)
            super(version)
            
            # Path Solution
            @solution = {}
            @uri = "/Devices"
          end
          
          ##
          # Lists DeviceInstance records from the API as a list.
          # Unlike stream(), this operation is eager and will load `limit` records into
          # memory before returning.
          # @param [String] status The status
          # @param [String] sim_identifier The sim_identifier
          # @param [String] rate_plan The rate_plan
          # @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(status: nil, sim_identifier: nil, rate_plan: nil, limit: nil, page_size: nil)
            self.stream(
                status: status,
                sim_identifier: sim_identifier,
                rate_plan: rate_plan,
                limit: limit,
                page_size: page_size
            ).entries
          end
          
          ##
          # Streams DeviceInstance records from the API as an Enumerable.
          # This operation lazily loads records as efficiently as possible until the limit
          # is reached.
          # @param [String] status The status
          # @param [String] sim_identifier The sim_identifier
          # @param [String] rate_plan The rate_plan
          # @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(status: nil, sim_identifier: nil, rate_plan: nil, limit: nil, page_size: nil)
            limits = @version.read_limits(limit, page_size)
            
            page = self.page(
                status: status,
                sim_identifier: sim_identifier,
                rate_plan: rate_plan,
                page_size: limits['page_size'],
            )
            
            @version.stream(page, limit: limits['limit'], page_limit: limits['page_limit'])
          end
          
          ##
          # When passed a block, yields DeviceInstance records from the API.
          # This operation lazily loads records as efficiently as possible until the limit
          # is reached.
          # @param [String] status The status
          # @param [String] sim_identifier The sim_identifier
          # @param [String] rate_plan The rate_plan
          # @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)
          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 DeviceInstance records from the API.
          # Request is executed immediately.
          # @param [String] status The status
          # @param [String] sim_identifier The sim_identifier
          # @param [String] rate_plan The rate_plan
          # @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 DeviceInstance
          def page(status: nil, sim_identifier: nil, rate_plan: nil, page_token: nil, page_number: nil, page_size: nil)
            params = {
                'Status' => status,
                'SimIdentifier' => sim_identifier,
                'RatePlan' => rate_plan,
                'PageToken' => page_token,
                'Page' => page_number,
                'PageSize' => page_size,
            }
            response = @version.page(
                'GET',
                @uri,
                params
            )
            return DevicePage.new(@version, response, @solution)
          end
          
          ##
          # Retrieve a single page of DeviceInstance records from the API.
          # Request is executed immediately.
          # @param [String] rate_plan The rate_plan
          # @param [String] alias_ The alias
          # @param [String] callback_method The callback_method
          # @param [String] callback_url The callback_url
          # @param [String] friendly_name The friendly_name
          # @param [String] sim_identifier The sim_identifier
          # @param [String] status The status
          # @param [String] commands_callback_method The commands_callback_method
          # @param [String] commands_callback_url The commands_callback_url
          
          # @return [DeviceInstance] Newly created DeviceInstance
          def create(rate_plan: nil, alias_: nil, callback_method: nil, callback_url: nil, friendly_name: nil, sim_identifier: nil, status: nil, commands_callback_method: nil, commands_callback_url: nil)
            data = {
                'RatePlan' => rate_plan,
                'Alias' => alias_,
                'CallbackMethod' => callback_method,
                'CallbackUrl' => callback_url,
                'FriendlyName' => friendly_name,
                'SimIdentifier' => sim_identifier,
                'Status' => status,
                'CommandsCallbackMethod' => commands_callback_method,
                'CommandsCallbackUrl' => commands_callback_url,
            }
            
            payload = @version.create(
                'POST',
                @uri,
                data: data
            )
            
            return DeviceInstance.new(
                @version,
                payload,
            )
          end
          
          ##
          # Provide a user friendly representation
          def to_s
            '#<Twilio.Preview.Wireless.DeviceList>'
          end
        end
      
        class DevicePage < Page
          ##
          # Initialize the DevicePage
          # @param [Version] version Version that contains the resource
          # @param [Response] response Response from the API
          # @param [Hash] solution Path solution for the resource
          
          # @return [DevicePage] DevicePage
          def initialize(version, response, solution)
            super(version, response)
            
            # Path Solution
            @solution = solution
          end
          
          ##
          # Build an instance of DeviceInstance
          # @param [Hash] payload Payload response from the API
          
          # @return [DeviceInstance] DeviceInstance
          def get_instance(payload)
            return DeviceInstance.new(
                @version,
                payload,
            )
          end
          
          ##
          # Provide a user friendly representation
          def to_s
            '<Twilio.Preview.Wireless.DevicePage>'
          end
        end
      
        class DeviceContext < InstanceContext
          ##
          # Initialize the DeviceContext
          # @param [Version] version Version that contains the resource
          # @param [String] sid The sid
          
          # @return [DeviceContext] DeviceContext
          def initialize(version, sid)
            super(version)
            
            # Path Solution
            @solution = {
                sid: sid,
            }
            @uri = "/Devices/#{@solution[:sid]}"
            
            # Dependents
            @usage = nil
          end
          
          ##
          # Fetch a DeviceInstance
          # @return [DeviceInstance] Fetched DeviceInstance
          def fetch
            params = {}
            
            payload = @version.fetch(
                'GET',
                @uri,
                params,
            )
            
            return DeviceInstance.new(
                @version,
                payload,
                sid: @solution['sid'],
            )
          end
          
          ##
          # Update the DeviceInstance
          # @param [String] alias_ The alias
          # @param [String] callback_method The callback_method
          # @param [String] callback_url The callback_url
          # @param [String] friendly_name The friendly_name
          # @param [String] sim_identifier The sim_identifier
          # @param [String] status The status
          # @param [String] commands_callback_method The commands_callback_method
          # @param [String] commands_callback_url The commands_callback_url
          
          # @return [DeviceInstance] Updated DeviceInstance
          def update(alias_: nil, callback_method: nil, callback_url: nil, friendly_name: nil, sim_identifier: nil, status: nil, commands_callback_method: nil, commands_callback_url: nil)
            data = {
                'Alias' => alias_,
                'CallbackMethod' => callback_method,
                'CallbackUrl' => callback_url,
                'FriendlyName' => friendly_name,
                'SimIdentifier' => sim_identifier,
                'Status' => status,
                'CommandsCallbackMethod' => commands_callback_method,
                'CommandsCallbackUrl' => commands_callback_url,
            }
            
            payload = @version.update(
                'POST',
                @uri,
                data: data,
            )
            
            return DeviceInstance.new(
                @version,
                payload,
                sid: @solution['sid'],
            )
          end
          
          ##
          # Access the usage
          # @return [UsageList] UsageList
          def usage
            return UsageContext.new(
                @version,
                @solution[:sid],
            )
          end
          
          ##
          # Provide a user friendly representation
          def to_s
            context = @solution.map {|k, v| "#{k}: #{v}"}.join(',')
            "#<Twilio.Preview.Wireless.DeviceContext #{context}>"
          end
        end
      
        class DeviceInstance < InstanceResource
          ##
          # Initialize the DeviceInstance
          # @param [Version] version Version that contains the resource
          # @param [Hash] payload payload that contains response from Twilio
          # @param [String] sid The sid
          
          # @return [DeviceInstance] DeviceInstance
          def initialize(version, payload, sid: nil)
            super(version)
            
            # Marshaled Properties
            @properties = {
                'sid' => payload['sid'],
                'alias_' => payload['alias'],
                'account_sid' => payload['account_sid'],
                'rate_plan_sid' => payload['rate_plan_sid'],
                'friendly_name' => payload['friendly_name'],
                'sim_identifier' => payload['sim_identifier'],
                'status' => payload['status'],
                'commands_callback_url' => payload['commands_callback_url'],
                'commands_callback_method' => payload['commands_callback_method'],
                'date_created' => Twilio.deserialize_iso8601(payload['date_created']),
                'date_updated' => Twilio.deserialize_iso8601(payload['date_updated']),
                'url' => payload['url'],
                '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
          # @param [Version] version Version that contains the resource
          
          # @return [DeviceContext] DeviceContext for this DeviceInstance
          def context
            unless @instance_context
              @instance_context = DeviceContext.new(
                  @version,
                  @params['sid'],
              )
            end
            @instance_context
          end
          
          def sid
            @properties['sid']
          end
          
          def alias_
            @properties['alias_']
          end
          
          def account_sid
            @properties['account_sid']
          end
          
          def rate_plan_sid
            @properties['rate_plan_sid']
          end
          
          def friendly_name
            @properties['friendly_name']
          end
          
          def sim_identifier
            @properties['sim_identifier']
          end
          
          def status
            @properties['status']
          end
          
          def commands_callback_url
            @properties['commands_callback_url']
          end
          
          def commands_callback_method
            @properties['commands_callback_method']
          end
          
          def date_created
            @properties['date_created']
          end
          
          def date_updated
            @properties['date_updated']
          end
          
          def url
            @properties['url']
          end
          
          def links
            @properties['links']
          end
          
          ##
          # Fetch a DeviceInstance
          # @return [DeviceInstance] Fetched DeviceInstance
          def fetch
            @context.fetch()
          end
          
          ##
          # Update the DeviceInstance
          # @param [String] alias_ The alias
          # @param [String] callback_method The callback_method
          # @param [String] callback_url The callback_url
          # @param [String] friendly_name The friendly_name
          # @param [String] sim_identifier The sim_identifier
          # @param [String] status The status
          # @param [String] commands_callback_method The commands_callback_method
          # @param [String] commands_callback_url The commands_callback_url
          
          # @return [DeviceInstance] Updated DeviceInstance
          def update(alias_: nil, callback_method: nil, callback_url: nil, friendly_name: nil, sim_identifier: nil, status: nil, commands_callback_method: nil, commands_callback_url: nil)
            @context.update(
                callback_method: callback_method,
                callback_url: callback_url,
                friendly_name: friendly_name,
                sim_identifier: sim_identifier,
                status: status,
                commands_callback_method: commands_callback_method,
                commands_callback_url: commands_callback_url,
            )
          end
          
          ##
          # Access the usage
          # @return [usage] usage
          def usage
            @context.usage
          end
          
          ##
          # Provide a user friendly representation
          def to_s
            context = @params.map{|k, v| "#{k}: #{v}"}.join(" ")
            "<Twilio.Preview.Wireless.DeviceInstance #{context}>"
          end
        end
      end
    end
  end
end