# == Schema Information
#
# Table name: forums
#
#  id          :integer          not null, primary key
#  title       :string(255)
#  description :string(255)
#  category_id :integer
#  created_at  :datetime
#  updated_at  :datetime
#  position    :integer
#

class Forum < ActiveRecord::Base
  include Extra
  BANS = 8
  TRASH = 12

  attr_protected :id, :updated_at, :created_at

  scope :available_to,
    lambda { |user, level| {
    :select => "forums.*, groupers.user_id AS access, COUNT(f2.id) AS acl, g2.user_id",
    :joins => "LEFT JOIN forumers ON forumers.forum_id = forums.id AND forumers.access = #{level}
    LEFT JOIN forumers AS f2 ON forumers.forum_id = forums.id AND f2.access = #{level}
    LEFT JOIN groups ON forumers.group_id = groups.id
  LEFT JOIN groupers ON groupers.group_id = groups.id AND groupers.user_id = #{user.id}
    LEFT JOIN groupers g2 ON g2.group_id = #{Group::ADMINS} AND g2.user_id = #{user.id}",
    :group => "forums.id",
    :having => ["access IS NOT NULL OR acl = 0 OR g2.user_id IS NOT NULL", level]} }
  scope :public,
    :select => "forums.*",
    :joins => "LEFT JOIN forumers ON forumers.forum_id = forums.id AND forumers.access = #{Forumer::ACCESS_READ}",
    :conditions => "forumers.id IS NULL"
  scope :of_forum,
    lambda { |forum| {:conditions => {"forums.id" => forum.id}} }
  scope :ordered, :order => "position"

  has_many :topics
  has_many :posts, :through => :topics
  has_many :forumers
  has_many :groups, :through => :forumers
  has_one :forumer
  belongs_to :category

  after_create :update_position

  acts_as_readable

  def to_s
    self.title
  end

  def update_position
    update_attribute :position, self.id
  end

  def can_show? cuser
    if cuser
      Forum.available_to(cuser, Forumer::ACCESS_READ).of_forum(self).first
    else
      Forum.public.of_forum(self).first
    end
  end

  def can_create? cuser
    cuser and cuser.admin?
  end

  def can_update? cuser
    cuser and cuser.admin?
  end

  def can_destroy? cuser
    cuser and cuser.admin?
  end
end
