# #Eligibility
#
# Reference for developers
#
# OpenAPI spec version: v3
#
# Generated by: https://github.com/swagger-api/swagger-codegen.git
# Swagger Codegen version: 2.4.17
#

require 'date'

module ChangeHealthcare
  module Eligibility
    module SwaggerClient
      class BenefitsAdditionalInformation
        attr_accessor :agency_claim_number, :alternative_list_id, :case_number, :centers_for_medicare_and_medicaid_services_npi, :class_of_contract_code, :contract_number, :coverage_list_id, :drug_formulary_number, :electronic_device_pin, :eligibility_category, :facility_id_number, :facility_network_identification_number, :family_unit_number, :federal_taxpayers_identification_number, :group_number, :hic_number, :id_card_number, :id_card_serial_number, :insurance_policy_number, :issue_number, :medicaid_provider_number, :medicaid_recepient_id_number, :medical_assistance_category, :medical_record_identification_number, :medicare_provider_number, :member_id, :patient_account_number, :personal_identification_number, :plan_network_id_number, :plan_number, :policy_number, :prior_authorization_number, :prior_id_number, :referral_number, :social_security_number, :state_license_number, :submitter_identification_number, :user_identification

        # Attribute mapping from ruby-style variable name to JSON key.
        def self.attribute_map
          {
            'agency_claim_number': :agencyClaimNumber,
            'alternative_list_id': :alternativeListId,
            'case_number': :caseNumber,
            'centers_for_medicare_and_medicaid_services_npi': :centersForMedicareAndMedicaidServicesNPI,
            'class_of_contract_code': :classOfContractCode,
            'contract_number': :contractNumber,
            'coverage_list_id': :coverageListId,
            'drug_formulary_number': :drugFormularyNumber,
            'electronic_device_pin': :electronicDevicePin,
            'eligibility_category': :eligibilityCategory,
            'facility_id_number': :facilityIdNumber,
            'facility_network_identification_number': :facilityNetworkIdentificationNumber,
            'family_unit_number': :familyUnitNumber,
            'federal_taxpayers_identification_number': :federalTaxpayersIdentificationNumber,
            'group_number': :groupNumber,
            'hic_number': :hicNumber,
            'id_card_number': :idCardNumber,
            'id_card_serial_number': :idCardSerialNumber,
            'insurance_policy_number': :insurancePolicyNumber,
            'issue_number': :issueNumber,
            'medicaid_provider_number': :medicaidProviderNumber,
            'medicaid_recepient_id_number': :medicaidRecepientIdNumber,
            'medical_assistance_category': :medicalAssistanceCategory,
            'medical_record_identification_number': :medicalRecordIdentificationNumber,
            'medicare_provider_number': :medicareProviderNumber,
            'member_id': :memberId,
            'patient_account_number': :patientAccountNumber,
            'personal_identification_number': :personalIdentificationNumber,
            'plan_network_id_number': :planNetworkIdNumber,
            'plan_number': :planNumber,
            'policy_number': :policyNumber,
            'prior_authorization_number': :priorAuthorizationNumber,
            'prior_id_number': :priorIdNumber,
            'referral_number': :referralNumber,
            'social_security_number': :socialSecurityNumber,
            'state_license_number': :stateLicenseNumber,
            'submitter_identification_number': :submitterIdentificationNumber,
            'user_identification': :userIdentification
          }
        end

        # Attribute type mapping.
        def self.swagger_types
          {
            'agency_claim_number': :String,
            'alternative_list_id': :String,
            'case_number': :String,
            'centers_for_medicare_and_medicaid_services_npi': :String,
            'class_of_contract_code': :String,
            'contract_number': :String,
            'coverage_list_id': :String,
            'drug_formulary_number': :String,
            'electronic_device_pin': :String,
            'eligibility_category': :String,
            'facility_id_number': :String,
            'facility_network_identification_number': :String,
            'family_unit_number': :String,
            'federal_taxpayers_identification_number': :String,
            'group_number': :String,
            'hic_number': :String,
            'id_card_number': :String,
            'id_card_serial_number': :String,
            'insurance_policy_number': :String,
            'issue_number': :String,
            'medicaid_provider_number': :String,
            'medicaid_recepient_id_number': :String,
            'medical_assistance_category': :String,
            'medical_record_identification_number': :String,
            'medicare_provider_number': :String,
            'member_id': :String,
            'patient_account_number': :String,
            'personal_identification_number': :String,
            'plan_network_id_number': :String,
            'plan_number': :String,
            'policy_number': :String,
            'prior_authorization_number': :String,
            'prior_id_number': :String,
            'referral_number': :String,
            'social_security_number': :String,
            'state_license_number': :String,
            'submitter_identification_number': :String,
            'user_identification': :String
          }
        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.transform_keys(&:to_sym)

          self.agency_claim_number = attributes[:agencyClaimNumber] if attributes.key?(:agencyClaimNumber)

          self.alternative_list_id = attributes[:alternativeListId] if attributes.key?(:alternativeListId)

          self.case_number = attributes[:caseNumber] if attributes.key?(:caseNumber)

          if attributes.key?(:centersForMedicareAndMedicaidServicesNPI)
            self.centers_for_medicare_and_medicaid_services_npi = attributes[:centersForMedicareAndMedicaidServicesNPI]
          end

          self.class_of_contract_code = attributes[:classOfContractCode] if attributes.key?(:classOfContractCode)

          self.contract_number = attributes[:contractNumber] if attributes.key?(:contractNumber)

          self.coverage_list_id = attributes[:coverageListId] if attributes.key?(:coverageListId)

          self.drug_formulary_number = attributes[:drugFormularyNumber] if attributes.key?(:drugFormularyNumber)

          self.electronic_device_pin = attributes[:electronicDevicePin] if attributes.key?(:electronicDevicePin)

          self.eligibility_category = attributes[:eligibilityCategory] if attributes.key?(:eligibilityCategory)

          self.facility_id_number = attributes[:facilityIdNumber] if attributes.key?(:facilityIdNumber)

          if attributes.key?(:facilityNetworkIdentificationNumber)
            self.facility_network_identification_number = attributes[:facilityNetworkIdentificationNumber]
          end

          self.family_unit_number = attributes[:familyUnitNumber] if attributes.key?(:familyUnitNumber)

          if attributes.key?(:federalTaxpayersIdentificationNumber)
            self.federal_taxpayers_identification_number = attributes[:federalTaxpayersIdentificationNumber]
          end

          self.group_number = attributes[:groupNumber] if attributes.key?(:groupNumber)

          self.hic_number = attributes[:hicNumber] if attributes.key?(:hicNumber)

          self.id_card_number = attributes[:idCardNumber] if attributes.key?(:idCardNumber)

          self.id_card_serial_number = attributes[:idCardSerialNumber] if attributes.key?(:idCardSerialNumber)

          self.insurance_policy_number = attributes[:insurancePolicyNumber] if attributes.key?(:insurancePolicyNumber)

          self.issue_number = attributes[:issueNumber] if attributes.key?(:issueNumber)

          self.medicaid_provider_number = attributes[:medicaidProviderNumber] if attributes.key?(:medicaidProviderNumber)

          self.medicaid_recepient_id_number = attributes[:medicaidRecepientIdNumber] if attributes.key?(:medicaidRecepientIdNumber)

          self.medical_assistance_category = attributes[:medicalAssistanceCategory] if attributes.key?(:medicalAssistanceCategory)

          self.medical_record_identification_number = attributes[:medicalRecordIdentificationNumber] if attributes.key?(:medicalRecordIdentificationNumber)

          self.medicare_provider_number = attributes[:medicareProviderNumber] if attributes.key?(:medicareProviderNumber)

          self.member_id = attributes[:memberId] if attributes.key?(:memberId)

          self.patient_account_number = attributes[:patientAccountNumber] if attributes.key?(:patientAccountNumber)

          self.personal_identification_number = attributes[:personalIdentificationNumber] if attributes.key?(:personalIdentificationNumber)

          self.plan_network_id_number = attributes[:planNetworkIdNumber] if attributes.key?(:planNetworkIdNumber)

          self.plan_number = attributes[:planNumber] if attributes.key?(:planNumber)

          self.policy_number = attributes[:policyNumber] if attributes.key?(:policyNumber)

          self.prior_authorization_number = attributes[:priorAuthorizationNumber] if attributes.key?(:priorAuthorizationNumber)

          self.prior_id_number = attributes[:priorIdNumber] if attributes.key?(:priorIdNumber)

          self.referral_number = attributes[:referralNumber] if attributes.key?(:referralNumber)

          self.social_security_number = attributes[:socialSecurityNumber] if attributes.key?(:socialSecurityNumber)

          self.state_license_number = attributes[:stateLicenseNumber] if attributes.key?(:stateLicenseNumber)

          self.submitter_identification_number = attributes[:submitterIdentificationNumber] if attributes.key?(:submitterIdentificationNumber)

          self.user_identification = attributes[:userIdentification] if attributes.key?(:userIdentification)
        end

        # Show invalid properties with the reasons. Usually used together with valid?
        # @return Array for valid properties with the reasons
        def list_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?
          true
        end

        # Checks equality by comparing each attribute.
        # @param [Object] Object to be compared
        def ==(o)
          return true if equal?(o)

          self.class == o.class &&
            agency_claim_number == o.agency_claim_number &&
            alternative_list_id == o.alternative_list_id &&
            case_number == o.case_number &&
            centers_for_medicare_and_medicaid_services_npi == o.centers_for_medicare_and_medicaid_services_npi &&
            class_of_contract_code == o.class_of_contract_code &&
            contract_number == o.contract_number &&
            coverage_list_id == o.coverage_list_id &&
            drug_formulary_number == o.drug_formulary_number &&
            electronic_device_pin == o.electronic_device_pin &&
            eligibility_category == o.eligibility_category &&
            facility_id_number == o.facility_id_number &&
            facility_network_identification_number == o.facility_network_identification_number &&
            family_unit_number == o.family_unit_number &&
            federal_taxpayers_identification_number == o.federal_taxpayers_identification_number &&
            group_number == o.group_number &&
            hic_number == o.hic_number &&
            id_card_number == o.id_card_number &&
            id_card_serial_number == o.id_card_serial_number &&
            insurance_policy_number == o.insurance_policy_number &&
            issue_number == o.issue_number &&
            medicaid_provider_number == o.medicaid_provider_number &&
            medicaid_recepient_id_number == o.medicaid_recepient_id_number &&
            medical_assistance_category == o.medical_assistance_category &&
            medical_record_identification_number == o.medical_record_identification_number &&
            medicare_provider_number == o.medicare_provider_number &&
            member_id == o.member_id &&
            patient_account_number == o.patient_account_number &&
            personal_identification_number == o.personal_identification_number &&
            plan_network_id_number == o.plan_network_id_number &&
            plan_number == o.plan_number &&
            policy_number == o.policy_number &&
            prior_authorization_number == o.prior_authorization_number &&
            prior_id_number == o.prior_id_number &&
            referral_number == o.referral_number &&
            social_security_number == o.social_security_number &&
            state_license_number == o.state_license_number &&
            submitter_identification_number == o.submitter_identification_number &&
            user_identification == o.user_identification
        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
          [agency_claim_number, alternative_list_id, case_number, centers_for_medicare_and_medicaid_services_npi, class_of_contract_code, contract_number, coverage_list_id, drug_formulary_number, electronic_device_pin, eligibility_category, facility_id_number, facility_network_identification_number, family_unit_number, federal_taxpayers_identification_number, group_number, hic_number, id_card_number, id_card_serial_number, insurance_policy_number, issue_number, medicaid_provider_number, medicaid_recepient_id_number, medical_assistance_category, medical_record_identification_number, medicare_provider_number, member_id, patient_account_number, personal_identification_number, plan_network_id_number, plan_number, policy_number, prior_authorization_number, prior_id_number, referral_number, social_security_number, state_license_number, submitter_identification_number, user_identification].hash
        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.swagger_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)
                send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize(Regexp.last_match(1), v) })
              end
            elsif !attributes[self.class.attribute_map[key]].nil?
              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
            temp_model = SwaggerClient.const_get(type).new
            temp_model.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 = send(attr)
            next if value.nil?

            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
  end
end