module PrivateExtension #:nodoc:
  module PrivateMessages #:nodoc:
    module HasPrivateMessagesExtensions #:nodoc:
      def self.included(base) #:nodoc:
        base.extend ActMethods
      end

      module ActMethods
        # Sets up a model have private messages, defining the child class as specified in :class_name (typically "Messages").
        # Provided the following instance messages:
        # *  <tt>sent_messages</tt> - returns a collection of messages for which this object is the sender.
        # *  <tt>received_messages</tt> - returns a collection of messages for which this object is the recipient.
        def has_private_messages(options = {})
          options[:class_name] ||= 'Message'

          unless included_modules.include? InstanceMethods
            class_attribute :options
            table_name = options[:class_name].constantize.table_name

            has_many :sent_messages, -> { where("#{table_name}.sender_deleted = ?", false).order("#{table_name}.created_at DESC") },
                     :class_name => options[:class_name],
                     :foreign_key => 'sender_id'

            has_many :received_messages, -> { where("#{table_name}.recipient_deleted = ?", false).order("#{table_name}.created_at DESC") },
                     :class_name => options[:class_name],
                     :foreign_key => 'recipient_id'


            extend ClassMethods
            include InstanceMethods
          end
          self.options = options
        end
      end

      module ClassMethods #:nodoc:
        # None yet...
      end

      module InstanceMethods
        # Returns true or false based on if this user has any unread messages
        def unread_messages?
          unread_message_count > 0 ? true : false
        end

        # Returns the number of unread messages for this user
        def unread_message_count
          options[:class_name].constantize.where("recipient_id = ? AND read_at IS NULL and recipient_deleted = ?", self, false).count
        end
      end
    end
  end
end

if defined? ActiveRecord
  ActiveRecord::Base.class_eval do
    include PrivateExtension::PrivateMessages::HasPrivateMessagesExtensions
  end
end