class ActiveRecord::Base

before_save :before_save

@@auditable_properties = {}
@@parent_models = {}
@@current_user_id = nil

def self.auditable_properties
        return @@auditable_properties[self.to_s] if !@@auditable_properties.blank?
        return nil
end

def self.parent_model
        return @@parent_models[self.to_s] if !@@parent_models.blank?
        return nil
end

def self.audits(*properties)
        @@auditable_properties[self.to_s] = properties
        # puts "Calling audits from class #{self.to_s}"
end

def self.audit_parent(parent_model)
        @@parent_models[self.to_s] = parent_model
end

def log_changes(parent_model_class_name = nil, parent_model_id = nil)
        auditable_properties_list = self.class.auditable_properties
        return if self.id.blank? or auditable_properties_list.blank?
        auditable_properties_list.each do |property|
                # Create Change object
                original_value = self.send "#{property.to_s}_was"
                new_value = self.send property.to_s
                next if original_value.eql? new_value

                c = Change.new
                c.model_class_name = self.class.name.demodulize
                c.model_id = self.id
                c.property_name = property.to_s
                c.parent_model_class_name = parent_model_class_name
                c.parent_model_id = parent_model_id
                c.original_value = original_value.to_s if !original_value.blank?
                c.new_value = new_value.to_s if !new_value.blank?
                c.created_at = DateTime.now
                c.created_by_id = Thread.current[:user].id if !Thread.current[:user].blank?
                c.save!

        end
end

def before_save
        return if self.class.auditable_properties.blank?

        parent = self.class.parent_model.blank? ? nil : self.send(self.class.parent_model.to_s)
        parent_model_id = parent.blank? ? nil : parent.id
        parent_model_class_name = parent.blank? ? nil : parent.class.name.demodulize

        self.log_changes(parent_model_class_name, parent_model_id)
end

def get_changes
        return nil if self.class.auditable_properties.blank? or self.id.blank?

        return Change.get_model_changes(self.class.name.demodulize, self.id)
end

end

class ActionController::Base

before_filter :set_audit_user

def set_audit_user
        Thread.current[:user] = current_<%= @user_class %> if defined? current_<%= @user_class %> and !current_<%= @user_class %>.blank?
end

end