=begin
{{> api_info}}
=end

require 'date'

module {{moduleName}}{{#models}}{{#model}}{{#description}}
  # {{{description}}}{{/description}}
  class {{classname}}{{#vars}}{{#description}}
    # {{{description}}}{{/description}}
    attr_accessor :{{{name}}}
{{/vars}}

    # Attribute mapping from ruby-style variable name to JSON key.
    def self.attribute_map
      {
        {{#vars}}
        :'{{{name}}}' => :'{{{baseName}}}'{{#hasMore}},{{/hasMore}}
        {{/vars}}
      }
    end

    # Attribute type mapping.
    def self.swagger_types
      {
        {{#vars}}
        :'{{{name}}}' => :'{{{datatype}}}'{{#hasMore}},{{/hasMore}}
        {{/vars}}
      }
    end

    # Initializes the object
    # @param [Hash] attributes Model attributes in the form of hash
    def initialize(attributes = {})
      return unless attributes.is_a?(Hash)

      # convert string to symbol for hash key
      attributes = attributes.each_with_object({}){|(k,v), h| h[k.to_sym] = v}

      {{#vars}}
      if attributes.has_key?(:'{{{baseName}}}')
        {{#isContainer}}
        if (value = attributes[:'{{{baseName}}}']).is_a?(Array)
          self.{{{name}}} = value
        end
        {{/isContainer}}
        {{^isContainer}}
        self.{{{name}}} = attributes[:'{{{baseName}}}']
        {{/isContainer}}
      {{#defaultValue}}
      else
        self.{{{name}}} = {{{defaultValue}}}
      {{/defaultValue}}
      end

      {{/vars}}
    end

    # Show invalid properties with the reasons. Usually used together with valid?
    # @return Array for valid properies with the reasons
    def list_invalid_properties
      invalid_properties = Array.new
      {{#isEnum}}
      allowed_values = [{{#allowableValues}}{{#values}}"{{{this}}}"{{^-last}}, {{/-last}}{{/values}}{{/allowableValues}}]
      if @{{{name}}} && !allowed_values.include?({{{name}}})
        invalid_properties.push("invalid value for '{{{name}}}', must be one of #{allowed_values}.")
      end

      {{/isEnum}}
      {{#hasValidation}}
      if @{{{name}}}.nil?
        fail ArgumentError, "{{{name}}} cannot be nil"
      end

      {{#minLength}}
      if @{{{name}}}.to_s.length > {{{maxLength}}}
        invalid_properties.push("invalid value for '{{{name}}}', the character length must be smaller than or equal to {{{maxLength}}}.")
      end

      {{/minLength}}
      {{#maxLength}}
      if @{{{name}}}.to_s.length < {{{minLength}}}
        invalid_properties.push("invalid value for '{{{name}}}', the character length must be great than or equal to {{{minLength}}}.")
      end

      {{/maxLength}}
      {{#maximum}}
      if @{{{name}}} > {{{maximum}}}
        invalid_properties.push("invalid value for '{{{name}}}', must be smaller than or equal to {{{maximum}}}.")
      end

      {{/maximum}}
      {{#minimum}}
      if @{{{name}}} < {{{minimum}}}
        invalid_properties.push("invalid value for '{{{name}}}', must be greater than or equal to {{{minimum}}}.")
      end

      {{/minimum}}
      {{#pattern}}
      if @{{{name}}} !~ Regexp.new({{{pattern}}})
        invalid_properties.push("invalid value for '{{{name}}}', must conform to the pattern {{{pattern}}}.")
      end

      {{/pattern}}
      {{/hasValidation}}
      return 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?
      {{#vars}}
      {{#required}}
      if @{{{name}}}.nil?
        return false
      end

      {{/required}}
      {{#isEnum}}
      allowed_values = [{{#allowableValues}}{{#values}}"{{{this}}}"{{^-last}}, {{/-last}}{{/values}}{{/allowableValues}}]
      if @{{{name}}} && !allowed_values.include?(@{{{name}}})
        return false
      end
      {{/isEnum}}
      {{#hasValidation}}
      {{#minLength}}
      if @{{{name}}}.to_s.length > {{{maxLength}}}
        return false
      end

      {{/minLength}}
      {{#maxLength}}
      if @{{{name}}}.to_s.length < {{{minLength}}}
        return false
      end

      {{/maxLength}}
      {{#maximum}}
      if @{{{name}}} > {{{maximum}}}
        return false
      end

      {{/maximum}}
      {{#minimum}}
      if @{{{name}}} < {{{minimum}}}
        return false
      end

      {{/minimum}}
      {{#pattern}}
      if @{{{name}}} !~ Regexp.new({{{pattern}}})
        return false
      end

      {{/pattern}}
      {{/hasValidation}}
      {{/vars}}
    end

    {{#vars}}
    {{#isEnum}}
    # Custom attribute writer method checking allowed values (enum).
    # @param [Object] {{{name}}} Object to be assigned
    def {{{name}}}=({{{name}}})
      allowed_values = [{{#allowableValues}}{{#values}}"{{{this}}}"{{^-last}}, {{/-last}}{{/values}}{{/allowableValues}}]
      if {{{name}}} && !allowed_values.include?({{{name}}})
        fail ArgumentError, "invalid value for '{{{name}}}', must be one of #{allowed_values}."
      end
      @{{{name}}} = {{{name}}}
    end

    {{/isEnum}}
    {{^isEnum}}
    {{#hasValidation}}
    # Custom attribute writer method with validation
    # @param [Object] {{{name}}} Value to be assigned
    def {{{name}}}=({{{name}}})
      if {{{name}}}.nil?
        fail ArgumentError, "{{{name}}} cannot be nil"
      end

      {{#minLength}}
      if {{{name}}}.to_s.length > {{{maxLength}}}
        fail ArgumentError, "invalid value for '{{{name}}}', the character length must be smaller than or equal to {{{maxLength}}}."
      end

      {{/minLength}}
      {{#maxLength}}
      if {{{name}}}.to_s.length < {{{minLength}}}
        fail ArgumentError, "invalid value for '{{{name}}}', the character length must be great than or equal to {{{minLength}}}."
      end

      {{/maxLength}}
      {{#maximum}}
      if {{{name}}} > {{{maximum}}}
        fail ArgumentError, "invalid value for '{{{name}}}', must be smaller than or equal to {{{maximum}}}."
      end

      {{/maximum}}
      {{#minimum}}
      if {{{name}}} < {{{minimum}}}
        fail ArgumentError, "invalid value for '{{{name}}}', must be greater than or equal to {{{minimum}}}."
      end

      {{/minimum}}
      {{#pattern}}
      if @{{{name}}} !~ Regexp.new({{{pattern}}})
        fail ArgumentError, "invalid value for '{{{name}}}', must conform to the pattern {{{pattern}}}."
      end

      {{/pattern}}
      @{{{name}}} = {{{name}}}
    end

    {{/hasValidation}}
    {{/isEnum}}
    {{/vars}}
    # Checks equality by comparing each attribute.
    # @param [Object] Object to be compared 
    def ==(o)
      return true if self.equal?(o)
      self.class == o.class{{#vars}} &&
          {{name}} == o.{{name}}{{/vars}}
    end

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

    # Calculates hash code according to all attributes.
    # @return [Fixnum] Hash code
    def hash
      [{{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}].hash
    end

{{> base_object}}
  end
{{/model}}
{{/models}}
end
