module BlogBasic
  class BlogPostsController < AppController
    unloadable

    helper :all #blog, shared

    layout :choose_layout

    before_filter :require_full_url, :only => [:show]
    before_filter :require_user, :except => [:index, :show]
    before_filter :require_admin, :except => [:index, :show]
    before_filter :setup_image_template, :only => [:new, :edit, :create, :update]

    def index
      @blog_posts = BlogPost.published.paginate(:page => params[:page], :per_page => 5)
      @index_title = BlogConf.data['blog_name'] || 'Blog'
      @ads = false

      respond_to do |format|
        format.html # index.html.erb
        format.xml  { render :xml => @blog_posts }
        format.atom 
      end
    end

    def drafts
      @blog_posts = BlogPost.drafts.paginate(:page => params[:page], :order => 'updated_at DESC')

      respond_to do |format|
        format.html # index.html.erb
        format.xml  { render :xml => @blog_posts }
      end
    end

    def show
      logger.debug "(Show)ing blog post id: " + params[:id].to_s
      @blog_post = BlogPost.find(params[:id])

      unless @blog_post.published == 1
        return unless require_admin
      end
      @blog_comment = @blog_post.blog_comments.new
      @blog_comments = @blog_post.blog_comments.paginate(:page => params[:page], :order => 'created_at DESC')
      @ads = true
      respond_to do |format|
        format.html # show.html.erb
        format.xml  { render :xml => @blog_post }
      end
    end

    def new
      @blog_post = BlogPost.new

      respond_to do |format|
        format.html # new.html.erb
        format.xml  { render :xml => @blog_post }
      end
    end

    def edit
      @blog_post = BlogPost.find(params[:id])
    end

    def create
      @blog_post = BlogPost.new(params[:blog_post])

      logger.debug "blog_post controller (create) - FIXME"
      @blog_post.user_id = 1 #current_user.id
      logger.debug "value: #{params[:blog_post][:published]}"
      @blog_post.published_at = Time.now if params[:blog_post][:published].to_i > 0 && @blog_post.published_at.nil?

      respond_to do |format|
        if @blog_post.save
          flash[:notice] = 'BlogPost was successfully created.'
          format.html { redirect_to(@blog_post) }
          format.xml  { render :xml => @blog_post, :status => :created, :location => @blog_post }
        else
          format.html { render :action => "new" }
          format.xml  { render :xml => @blog_post.errors, :status => :unprocessable_entity }
        end
      end
    end

    def update
      @blog_post = BlogPost.find(params[:id])

      blog_log = BlogContent.create()
      blog_log.title = @blog_post.title
      blog_log.content = @blog_post.body
      blog_log.blog_post_id = params[:id]
      blog_log.save

      respond_to do |format|
        @blog_post.published_at = Time.now if params[:blog_post][:published].to_i > 0 && @blog_post.published_at.nil?
        if @blog_post.update_attributes(params[:blog_post])
          flash[:notice] = 'BlogPost was successfully updated.'
          format.html { redirect_to(@blog_post) }
          format.xml  { head :ok }
        else
          format.html { render :action => "edit" }
          format.xml  { render :xml => @blog_post.errors, :status => :unprocessable_entity }
        end
      end
    end

    def destroy
      @blog_post = BlogPost.find(params[:id])
      #@blog_post.destroy

      flash[:notice] = 'The blog post has been deleted'

      respond_to do |format|
        format.html { redirect_to(blog_posts_url) }
        format.xml  { head :ok }
      end
    end

    private
    def require_full_url
      if params[:id].to_i.to_s == params[:id]
        redirect_to BlogPost.find(params[:id]), :status => 301
        return true
      end

      return false
    end

    def require_admin
      if !signed_in?
        flash[:notice] = 'You must be an admin to view this page'
        redirect_to blog_posts_path
        return false
      end

      return true
    end

    def choose_layout
      if ['new', 'edit', 'create', 'update'].include?(params[:action])
        BlogConf.data['admin_layout'] || 'application'
      else
        BlogConf.data['layout'] || 'application'
      end
    end

    def setup_image_template
      @empty_blog_post = BlogPost.new
      @empty_blog_post.blog_images.build
    end
  end
end