=begin
#Pulp 3 API

#Fetch, Upload, Organize, and Distribute Software Packages

The version of the OpenAPI document: v3
Contact: pulp-list@redhat.com
Generated by: https://openapi-generator.tech
OpenAPI Generator version: 4.3.1

=end

require 'date'

module PulpFileClient
  # Serializer for File Remotes.
  class PatchedfileFileRemote
    # A unique name for this remote.
    attr_accessor :name

    # The URL of an external content source.
    attr_accessor :url

    # A PEM encoded CA certificate used to validate the server certificate presented by the remote server.
    attr_accessor :ca_cert

    # A PEM encoded client certificate used for authentication.
    attr_accessor :client_cert

    # A PEM encoded private key used for authentication.
    attr_accessor :client_key

    # If True, TLS peer validation must be performed.
    attr_accessor :tls_validation

    # The proxy URL. Format: scheme://host:port
    attr_accessor :proxy_url

    # The username to authenticte to the proxy.
    attr_accessor :proxy_username

    # The password to authenticate to the proxy. Extra leading and trailing whitespace characters are not trimmed.
    attr_accessor :proxy_password

    # The username to be used for authentication when syncing.
    attr_accessor :username

    # The password to be used for authentication when syncing. Extra leading and trailing whitespace characters are not trimmed.
    attr_accessor :password

    attr_accessor :pulp_labels

    # Total number of simultaneous connections. If not set then the default value will be used.
    attr_accessor :download_concurrency

    # Maximum number of retry attempts after a download failure. If not set then the default value (3) will be used.
    attr_accessor :max_retries

    # The policy to use when downloading content. The possible values include: 'immediate', 'on_demand', and 'streamed'. 'immediate' is the default.  * `immediate` - When syncing, download all metadata and content now. * `on_demand` - When syncing, download metadata, but do not download content now. Instead, download content as clients request it, and save it in Pulp to be served for future client requests. * `streamed` - When syncing, download metadata, but do not download content now. Instead,download content as clients request it, but never save it in Pulp. This causes future requests for that same content to have to be downloaded again.
    attr_accessor :policy

    # aiohttp.ClientTimeout.total (q.v.) for download-connections. The default is null, which will cause the default from the aiohttp library to be used.
    attr_accessor :total_timeout

    # aiohttp.ClientTimeout.connect (q.v.) for download-connections. The default is null, which will cause the default from the aiohttp library to be used.
    attr_accessor :connect_timeout

    # aiohttp.ClientTimeout.sock_connect (q.v.) for download-connections. The default is null, which will cause the default from the aiohttp library to be used.
    attr_accessor :sock_connect_timeout

    # aiohttp.ClientTimeout.sock_read (q.v.) for download-connections. The default is null, which will cause the default from the aiohttp library to be used.
    attr_accessor :sock_read_timeout

    # Headers for aiohttp.Clientsession
    attr_accessor :headers

    # Limits requests per second for each concurrent downloader
    attr_accessor :rate_limit

    # Attribute mapping from ruby-style variable name to JSON key.
    def self.attribute_map
      {
        :'name' => :'name',
        :'url' => :'url',
        :'ca_cert' => :'ca_cert',
        :'client_cert' => :'client_cert',
        :'client_key' => :'client_key',
        :'tls_validation' => :'tls_validation',
        :'proxy_url' => :'proxy_url',
        :'proxy_username' => :'proxy_username',
        :'proxy_password' => :'proxy_password',
        :'username' => :'username',
        :'password' => :'password',
        :'pulp_labels' => :'pulp_labels',
        :'download_concurrency' => :'download_concurrency',
        :'max_retries' => :'max_retries',
        :'policy' => :'policy',
        :'total_timeout' => :'total_timeout',
        :'connect_timeout' => :'connect_timeout',
        :'sock_connect_timeout' => :'sock_connect_timeout',
        :'sock_read_timeout' => :'sock_read_timeout',
        :'headers' => :'headers',
        :'rate_limit' => :'rate_limit'
      }
    end

    # Attribute type mapping.
    def self.openapi_types
      {
        :'name' => :'String',
        :'url' => :'String',
        :'ca_cert' => :'String',
        :'client_cert' => :'String',
        :'client_key' => :'String',
        :'tls_validation' => :'Boolean',
        :'proxy_url' => :'String',
        :'proxy_username' => :'String',
        :'proxy_password' => :'String',
        :'username' => :'String',
        :'password' => :'String',
        :'pulp_labels' => :'Hash<String, String>',
        :'download_concurrency' => :'Integer',
        :'max_retries' => :'Integer',
        :'policy' => :'PolicyEnum',
        :'total_timeout' => :'Float',
        :'connect_timeout' => :'Float',
        :'sock_connect_timeout' => :'Float',
        :'sock_read_timeout' => :'Float',
        :'headers' => :'Array<Object>',
        :'rate_limit' => :'Integer'
      }
    end

    # List of attributes with nullable: true
    def self.openapi_nullable
      Set.new([
        :'ca_cert',
        :'client_cert',
        :'client_key',
        :'proxy_url',
        :'proxy_username',
        :'proxy_password',
        :'username',
        :'password',
        :'download_concurrency',
        :'max_retries',
        :'total_timeout',
        :'connect_timeout',
        :'sock_connect_timeout',
        :'sock_read_timeout',
        :'rate_limit'
      ])
    end

    # Initializes the object
    # @param [Hash] attributes Model attributes in the form of hash
    def initialize(attributes = {})
      if (!attributes.is_a?(Hash))
        fail ArgumentError, "The input argument (attributes) must be a hash in `PulpFileClient::PatchedfileFileRemote` initialize method"
      end

      # check to see if the attribute exists and convert string to symbol for hash key
      attributes = attributes.each_with_object({}) { |(k, v), h|
        if (!self.class.attribute_map.key?(k.to_sym))
          fail ArgumentError, "`#{k}` is not a valid attribute in `PulpFileClient::PatchedfileFileRemote`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
        end
        h[k.to_sym] = v
      }

      if attributes.key?(:'name')
        self.name = attributes[:'name']
      end

      if attributes.key?(:'url')
        self.url = attributes[:'url']
      end

      if attributes.key?(:'ca_cert')
        self.ca_cert = attributes[:'ca_cert']
      end

      if attributes.key?(:'client_cert')
        self.client_cert = attributes[:'client_cert']
      end

      if attributes.key?(:'client_key')
        self.client_key = attributes[:'client_key']
      end

      if attributes.key?(:'tls_validation')
        self.tls_validation = attributes[:'tls_validation']
      end

      if attributes.key?(:'proxy_url')
        self.proxy_url = attributes[:'proxy_url']
      end

      if attributes.key?(:'proxy_username')
        self.proxy_username = attributes[:'proxy_username']
      end

      if attributes.key?(:'proxy_password')
        self.proxy_password = attributes[:'proxy_password']
      end

      if attributes.key?(:'username')
        self.username = attributes[:'username']
      end

      if attributes.key?(:'password')
        self.password = attributes[:'password']
      end

      if attributes.key?(:'pulp_labels')
        if (value = attributes[:'pulp_labels']).is_a?(Hash)
          self.pulp_labels = value
        end
      end

      if attributes.key?(:'download_concurrency')
        self.download_concurrency = attributes[:'download_concurrency']
      end

      if attributes.key?(:'max_retries')
        self.max_retries = attributes[:'max_retries']
      end

      if attributes.key?(:'policy')
        self.policy = attributes[:'policy']
      end

      if attributes.key?(:'total_timeout')
        self.total_timeout = attributes[:'total_timeout']
      end

      if attributes.key?(:'connect_timeout')
        self.connect_timeout = attributes[:'connect_timeout']
      end

      if attributes.key?(:'sock_connect_timeout')
        self.sock_connect_timeout = attributes[:'sock_connect_timeout']
      end

      if attributes.key?(:'sock_read_timeout')
        self.sock_read_timeout = attributes[:'sock_read_timeout']
      end

      if attributes.key?(:'headers')
        if (value = attributes[:'headers']).is_a?(Array)
          self.headers = value
        end
      end

      if attributes.key?(:'rate_limit')
        self.rate_limit = attributes[:'rate_limit']
      end
    end

    # Show invalid properties with the reasons. Usually used together with valid?
    # @return Array for valid properties with the reasons
    def list_invalid_properties
      invalid_properties = Array.new
      if !@name.nil? && @name.to_s.length < 1
        invalid_properties.push('invalid value for "name", the character length must be great than or equal to 1.')
      end

      if !@url.nil? && @url.to_s.length < 1
        invalid_properties.push('invalid value for "url", the character length must be great than or equal to 1.')
      end

      if !@ca_cert.nil? && @ca_cert.to_s.length < 1
        invalid_properties.push('invalid value for "ca_cert", the character length must be great than or equal to 1.')
      end

      if !@client_cert.nil? && @client_cert.to_s.length < 1
        invalid_properties.push('invalid value for "client_cert", the character length must be great than or equal to 1.')
      end

      if !@client_key.nil? && @client_key.to_s.length < 1
        invalid_properties.push('invalid value for "client_key", the character length must be great than or equal to 1.')
      end

      if !@proxy_url.nil? && @proxy_url.to_s.length < 1
        invalid_properties.push('invalid value for "proxy_url", the character length must be great than or equal to 1.')
      end

      if !@proxy_username.nil? && @proxy_username.to_s.length < 1
        invalid_properties.push('invalid value for "proxy_username", the character length must be great than or equal to 1.')
      end

      if !@proxy_password.nil? && @proxy_password.to_s.length < 1
        invalid_properties.push('invalid value for "proxy_password", the character length must be great than or equal to 1.')
      end

      if !@username.nil? && @username.to_s.length < 1
        invalid_properties.push('invalid value for "username", the character length must be great than or equal to 1.')
      end

      if !@password.nil? && @password.to_s.length < 1
        invalid_properties.push('invalid value for "password", the character length must be great than or equal to 1.')
      end

      if !@download_concurrency.nil? && @download_concurrency < 1
        invalid_properties.push('invalid value for "download_concurrency", must be greater than or equal to 1.')
      end

      if !@total_timeout.nil? && @total_timeout < 0.0
        invalid_properties.push('invalid value for "total_timeout", must be greater than or equal to 0.0.')
      end

      if !@connect_timeout.nil? && @connect_timeout < 0.0
        invalid_properties.push('invalid value for "connect_timeout", must be greater than or equal to 0.0.')
      end

      if !@sock_connect_timeout.nil? && @sock_connect_timeout < 0.0
        invalid_properties.push('invalid value for "sock_connect_timeout", must be greater than or equal to 0.0.')
      end

      if !@sock_read_timeout.nil? && @sock_read_timeout < 0.0
        invalid_properties.push('invalid value for "sock_read_timeout", must be greater than or equal to 0.0.')
      end

      invalid_properties
    end

    # Check to see if the all the properties in the model are valid
    # @return true if the model is valid
    def valid?
      return false if !@name.nil? && @name.to_s.length < 1
      return false if !@url.nil? && @url.to_s.length < 1
      return false if !@ca_cert.nil? && @ca_cert.to_s.length < 1
      return false if !@client_cert.nil? && @client_cert.to_s.length < 1
      return false if !@client_key.nil? && @client_key.to_s.length < 1
      return false if !@proxy_url.nil? && @proxy_url.to_s.length < 1
      return false if !@proxy_username.nil? && @proxy_username.to_s.length < 1
      return false if !@proxy_password.nil? && @proxy_password.to_s.length < 1
      return false if !@username.nil? && @username.to_s.length < 1
      return false if !@password.nil? && @password.to_s.length < 1
      return false if !@download_concurrency.nil? && @download_concurrency < 1
      return false if !@total_timeout.nil? && @total_timeout < 0.0
      return false if !@connect_timeout.nil? && @connect_timeout < 0.0
      return false if !@sock_connect_timeout.nil? && @sock_connect_timeout < 0.0
      return false if !@sock_read_timeout.nil? && @sock_read_timeout < 0.0
      true
    end

    # Custom attribute writer method with validation
    # @param [Object] name Value to be assigned
    def name=(name)
      if !name.nil? && name.to_s.length < 1
        fail ArgumentError, 'invalid value for "name", the character length must be great than or equal to 1.'
      end

      @name = name
    end

    # Custom attribute writer method with validation
    # @param [Object] url Value to be assigned
    def url=(url)
      if !url.nil? && url.to_s.length < 1
        fail ArgumentError, 'invalid value for "url", the character length must be great than or equal to 1.'
      end

      @url = url
    end

    # Custom attribute writer method with validation
    # @param [Object] ca_cert Value to be assigned
    def ca_cert=(ca_cert)
      if !ca_cert.nil? && ca_cert.to_s.length < 1
        fail ArgumentError, 'invalid value for "ca_cert", the character length must be great than or equal to 1.'
      end

      @ca_cert = ca_cert
    end

    # Custom attribute writer method with validation
    # @param [Object] client_cert Value to be assigned
    def client_cert=(client_cert)
      if !client_cert.nil? && client_cert.to_s.length < 1
        fail ArgumentError, 'invalid value for "client_cert", the character length must be great than or equal to 1.'
      end

      @client_cert = client_cert
    end

    # Custom attribute writer method with validation
    # @param [Object] client_key Value to be assigned
    def client_key=(client_key)
      if !client_key.nil? && client_key.to_s.length < 1
        fail ArgumentError, 'invalid value for "client_key", the character length must be great than or equal to 1.'
      end

      @client_key = client_key
    end

    # Custom attribute writer method with validation
    # @param [Object] proxy_url Value to be assigned
    def proxy_url=(proxy_url)
      if !proxy_url.nil? && proxy_url.to_s.length < 1
        fail ArgumentError, 'invalid value for "proxy_url", the character length must be great than or equal to 1.'
      end

      @proxy_url = proxy_url
    end

    # Custom attribute writer method with validation
    # @param [Object] proxy_username Value to be assigned
    def proxy_username=(proxy_username)
      if !proxy_username.nil? && proxy_username.to_s.length < 1
        fail ArgumentError, 'invalid value for "proxy_username", the character length must be great than or equal to 1.'
      end

      @proxy_username = proxy_username
    end

    # Custom attribute writer method with validation
    # @param [Object] proxy_password Value to be assigned
    def proxy_password=(proxy_password)
      if !proxy_password.nil? && proxy_password.to_s.length < 1
        fail ArgumentError, 'invalid value for "proxy_password", the character length must be great than or equal to 1.'
      end

      @proxy_password = proxy_password
    end

    # Custom attribute writer method with validation
    # @param [Object] username Value to be assigned
    def username=(username)
      if !username.nil? && username.to_s.length < 1
        fail ArgumentError, 'invalid value for "username", the character length must be great than or equal to 1.'
      end

      @username = username
    end

    # Custom attribute writer method with validation
    # @param [Object] password Value to be assigned
    def password=(password)
      if !password.nil? && password.to_s.length < 1
        fail ArgumentError, 'invalid value for "password", the character length must be great than or equal to 1.'
      end

      @password = password
    end

    # Custom attribute writer method with validation
    # @param [Object] download_concurrency Value to be assigned
    def download_concurrency=(download_concurrency)
      if !download_concurrency.nil? && download_concurrency < 1
        fail ArgumentError, 'invalid value for "download_concurrency", must be greater than or equal to 1.'
      end

      @download_concurrency = download_concurrency
    end

    # Custom attribute writer method with validation
    # @param [Object] total_timeout Value to be assigned
    def total_timeout=(total_timeout)
      if !total_timeout.nil? && total_timeout < 0.0
        fail ArgumentError, 'invalid value for "total_timeout", must be greater than or equal to 0.0.'
      end

      @total_timeout = total_timeout
    end

    # Custom attribute writer method with validation
    # @param [Object] connect_timeout Value to be assigned
    def connect_timeout=(connect_timeout)
      if !connect_timeout.nil? && connect_timeout < 0.0
        fail ArgumentError, 'invalid value for "connect_timeout", must be greater than or equal to 0.0.'
      end

      @connect_timeout = connect_timeout
    end

    # Custom attribute writer method with validation
    # @param [Object] sock_connect_timeout Value to be assigned
    def sock_connect_timeout=(sock_connect_timeout)
      if !sock_connect_timeout.nil? && sock_connect_timeout < 0.0
        fail ArgumentError, 'invalid value for "sock_connect_timeout", must be greater than or equal to 0.0.'
      end

      @sock_connect_timeout = sock_connect_timeout
    end

    # Custom attribute writer method with validation
    # @param [Object] sock_read_timeout Value to be assigned
    def sock_read_timeout=(sock_read_timeout)
      if !sock_read_timeout.nil? && sock_read_timeout < 0.0
        fail ArgumentError, 'invalid value for "sock_read_timeout", must be greater than or equal to 0.0.'
      end

      @sock_read_timeout = sock_read_timeout
    end

    # Checks equality by comparing each attribute.
    # @param [Object] Object to be compared
    def ==(o)
      return true if self.equal?(o)
      self.class == o.class &&
          name == o.name &&
          url == o.url &&
          ca_cert == o.ca_cert &&
          client_cert == o.client_cert &&
          client_key == o.client_key &&
          tls_validation == o.tls_validation &&
          proxy_url == o.proxy_url &&
          proxy_username == o.proxy_username &&
          proxy_password == o.proxy_password &&
          username == o.username &&
          password == o.password &&
          pulp_labels == o.pulp_labels &&
          download_concurrency == o.download_concurrency &&
          max_retries == o.max_retries &&
          policy == o.policy &&
          total_timeout == o.total_timeout &&
          connect_timeout == o.connect_timeout &&
          sock_connect_timeout == o.sock_connect_timeout &&
          sock_read_timeout == o.sock_read_timeout &&
          headers == o.headers &&
          rate_limit == o.rate_limit
    end

    # @see the `==` method
    # @param [Object] Object to be compared
    def eql?(o)
      self == o
    end

    # Calculates hash code according to all attributes.
    # @return [Integer] Hash code
    def hash
      [name, url, ca_cert, client_cert, client_key, tls_validation, proxy_url, proxy_username, proxy_password, username, password, pulp_labels, download_concurrency, max_retries, policy, total_timeout, connect_timeout, sock_connect_timeout, sock_read_timeout, headers, rate_limit].hash
    end

    # Builds the object from hash
    # @param [Hash] attributes Model attributes in the form of hash
    # @return [Object] Returns the model itself
    def self.build_from_hash(attributes)
      new.build_from_hash(attributes)
    end

    # Builds the object from hash
    # @param [Hash] attributes Model attributes in the form of hash
    # @return [Object] Returns the model itself
    def build_from_hash(attributes)
      return nil unless attributes.is_a?(Hash)
      self.class.openapi_types.each_pair do |key, type|
        if type =~ /\AArray<(.*)>/i
          # check to ensure the input is an array given that the attribute
          # is documented as an array but the input is not
          if attributes[self.class.attribute_map[key]].is_a?(Array)
            self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
          end
        elsif !attributes[self.class.attribute_map[key]].nil?
          self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
        end # or else data not found in attributes(hash), not an issue as the data can be optional
      end

      self
    end

    # Deserializes the data based on type
    # @param string type Data type
    # @param string value Value to be deserialized
    # @return [Object] Deserialized data
    def _deserialize(type, value)
      case type.to_sym
      when :DateTime
        DateTime.parse(value)
      when :Date
        Date.parse(value)
      when :String
        value.to_s
      when :Integer
        value.to_i
      when :Float
        value.to_f
      when :Boolean
        if value.to_s =~ /\A(true|t|yes|y|1)\z/i
          true
        else
          false
        end
      when :Object
        # generic object (usually a Hash), return directly
        value
      when /\AArray<(?<inner_type>.+)>\z/
        inner_type = Regexp.last_match[:inner_type]
        value.map { |v| _deserialize(inner_type, v) }
      when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
        k_type = Regexp.last_match[:k_type]
        v_type = Regexp.last_match[:v_type]
        {}.tap do |hash|
          value.each do |k, v|
            hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
          end
        end
      else # model
        PulpFileClient.const_get(type).build_from_hash(value)
      end
    end

    # Returns the string representation of the object
    # @return [String] String presentation of the object
    def to_s
      to_hash.to_s
    end

    # to_body is an alias to to_hash (backward compatibility)
    # @return [Hash] Returns the object in the form of hash
    def to_body
      to_hash
    end

    # Returns the object in the form of hash
    # @return [Hash] Returns the object in the form of hash
    def to_hash
      hash = {}
      self.class.attribute_map.each_pair do |attr, param|
        value = self.send(attr)
        if value.nil?
          is_nullable = self.class.openapi_nullable.include?(attr)
          next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
        end
        
        hash[param] = _to_hash(value)
      end
      hash
    end

    # Outputs non-array value in the form of hash
    # For object, use to_hash. Otherwise, just return the value
    # @param [Object] value Any valid value
    # @return [Hash] Returns the value in the form of hash
    def _to_hash(value)
      if value.is_a?(Array)
        value.compact.map { |v| _to_hash(v) }
      elsif value.is_a?(Hash)
        {}.tap do |hash|
          value.each { |k, v| hash[k] = _to_hash(v) }
        end
      elsif value.respond_to? :to_hash
        value.to_hash
      else
        value
      end
    end
  end
end