class ForumBaseController < ReaderActionController

  include Radiant::Pagination::Controller
  radiant_layout { |c| Radiant::Config['forum.layout'] || Radiant::Config['reader.layout'] }
  before_filter :require_login_unless_public
  before_filter :establish_context
  before_filter :require_visibility_to_reader
  helper :forum, :reader

protected

  def set_cache_header
    if Radiant.config['forum.cached?']
      expires_in (Radiant.config['forum.cache_duration'] || 60).to_i.minutes, :public => true
    else
      expires_now
    end
  end
  
  def require_login_unless_public
    return false unless Radiant::Config['forum.public?'] || require_reader && require_activated_reader
  end
  
  def require_visibility_to_reader
    if @page && !@page.visible_to?(current_reader)
      flash[:error] = t("page_not_public")
      redirect_to reader_permission_denied_url
      return false
    end
    
    if @forum && !@forum.visible_to?(current_reader)
      flash[:error] = "forum_not_public"
      redirect_to reader_permission_denied_url
      return false
    end
  end
  
  def establish_context
    @reader = Reader.find(params[:reader_id]) unless params[:reader_id].blank?
    @topic = Topic.visible_to(current_reader).find(params[:topic_id]) unless params[:topic_id].blank?
    @forum = Forum.visible_to(current_reader).find(params[:forum_id]) unless params[:forum_id].blank?
    @page = Page.visible_to(current_reader).find(params[:page_id]) unless params[:page_id].blank?
  end
  
  def redirect_to_post
    if (@post.page)
      redirect_to "#{@post.page.url}?#{WillPaginate::ViewHelpers.pagination_options[:param_name]}=#{@post.page_when_paginated}##{@post.dom_id}"
    elsif @post.first?
      redirect_to topic_path(@post.topic)
    else
      post_location = {WillPaginate::ViewHelpers.pagination_options[:param_name] => @post.page_when_paginated, :anchor => @post.dom_id}
      redirect_to topic_path(@post.topic, post_location)
    end
  end

  def redirect_to_topic
    redirect_to topic_path(@topic)
  end
  
  def redirect_to_page_or_topic
    if @page
      redirect_to @page.url
    elsif @topic
      redirect_to topic_path(@topic)
    end
  end

  def redirect_to_forum
    respond_to do |format|
      format.html { redirect_to forum_path(@forum) }
    end
  end

  def render_page_or_feed(template_name = action_name)
    respond_to do |format|
      format.html { 
        set_cache_header
        render :action => template_name 
      }
      format.rss { 
        render :action => template_name, :layout => 'feed'
      }
      format.js { 
        render :action => template_name, :layout => false
      }
    end
  end
  
  def redirect_to_admin
    redirect_to admin_forums_url
  end

  def render_locked
    respond_to do |format|
      format.html { 
        expires_now
        flash[:error] = t('forum_extension.topic_locked')
        redirect_to_page_or_topic 
      }
      format.js { render :partial => 'topics/locked' }
    end
    false
  end

end