module DrNicMagicModels
  module Validations

    def generate_validations

      logger = DrNicMagicModels::Logger

      # Ensure that the connection to db is established, else validations don't get created.
      ActiveRecord::Base.connection
      
      # Code reworked from http://www.redhillconsulting.com.au/rails_plugins.html
      # Thanks Red Hill Consulting for using an MIT licence :o)

      # NOT NULL constraints
      self.columns.reject { |column| column.name =~ /(?i)^(((created|updated)_(at|on))|position|type|id)$/ }.each do |column|
        
        if column.type == :integer   
          logger.debug "validates_numericality_of #{column.name}, :allow_nil => #{column.null.inspect}, :only_integer => true"       
          self.validates_numericality_of column.name, :allow_nil => column.null, :only_integer => true
        elsif column.number?
          logger.debug "validates_numericality_of #{column.name}, :allow_nil => #{column.null.inspect}"
          self.validates_numericality_of column.name, :allow_nil => column.null
        elsif column.text? && column.limit
          logger.debug "validates_length_of #{column.name}, :allow_nil => #{column.null.inspect}, :maximum => #{column.limit}"
          self.validates_length_of column.name, :allow_nil => column.null, :maximum => column.limit
        end
        
        # Active record seems to interpolate booleans anyway to either true, false or nil...
        if column.type == :boolean
          logger.debug "validates_inclusion_of #{column.name}, :in => [true, false], :allow_nil => #{column.null}, :message => ActiveRecord::Errors.default_error_messages[:blank]"
          self.validates_inclusion_of column.name, :in => [true, false], :allow_nil => column.null, :message => ActiveRecord::Errors.default_error_messages[:blank]
        elsif !column.null
          logger.debug "validates_presence_of #{column.name}"
          self.validates_presence_of column.name
        end
      end
      
      # Single-column UNIQUE indexes
      get_unique_index_columns.each do |col|
        logger.debug "validates_uniqueness_of #{col}"
        self.validates_uniqueness_of col
      end                  

    end    
  end
end
