# == Schema Information
#
# Table name: shoutmsgs
#
#  id             :integer          not null, primary key
#  user_id        :integer
#  text           :string(255)
#  created_at     :datetime
#  updated_at     :datetime
#  shoutable_type :string(255)
#  shoutable_id   :integer
#

class Shoutmsg < ActiveRecord::Base
  include Extra

  attr_protected :id, :created_at, :updated_at, :user_id

  validates_length_of :text, :in => 1..100
  validates_presence_of :user

  scope :recent,
    :include => :user,
    :order => "id DESC",
    :limit => 8
  scope :box,
    :conditions => "shoutable_type IS NULL AND shoutable_id IS NULL",
    :limit => 8
  scope :typebox,
    :conditions => "shoutable_type IS NULL AND shoutable_id IS NULL"
  scope :lastXXX,
    :include => :user,
    :order => "id DESC",
    :limit => 500
  scope :of_object,
    lambda { |object, id| {:conditions => {:shoutable_type => object, :shoutable_id => id}} }
  scope :ordered, :order => "id"

  belongs_to :user
  belongs_to :shoutable, :polymorphic => true

  def domain
    self[:shoutable_type] ? "shout_#{shoutable_type}_#{shoutable_id}" : "shoutbox"
  end

  def can_create? cuser
    cuser and !user.banned?(Ban::TYPE_MUTE) and cuser.verified?
  end

  def can_destroy? cuser
    cuser and cuser.admin?
  end

  def self.flood? cuser, type = nil, id = nil
    return false if self.of_object(type, id).count < 3
    self.of_object(type, id).all(:order => "created_at DESC", :limit => 10).each do |msg|
      return false if cuser != msg.user
    end
    return true
  end
end