class PagesController < ApplicationController
  before_action -> { require_plugin_enabled FoodsoftWiki }
  before_action :catch_special_pages, only: %i[show new]

  skip_before_action :authenticate, only: :all
  before_action only: :all do
    authenticate_or_token(%w[wiki all])
  end
  before_action do
    content_for :head, view_context.rss_meta_tag
  end

  def index
    @page = Page.find_by_permalink 'Home'

    if @page
      render action: 'show'
    else
      redirect_to all_pages_path
    end
  end

  def show
    if params[:permalink]
      @page = Page.find_by_permalink(params[:permalink])
    elsif params[:id]
      page = Page.find_by_id(params[:id])
      if page.nil?
        flash[:error] = I18n.t('pages.cshow.error_noexist')
        redirect_to all_pages_path and return
      else
        redirect_to wiki_page_path(page.permalink) and return
      end
    end

    if @page.nil?
      redirect_to new_page_path(title: params[:permalink])
    elsif @page.redirect?
      page = Page.find_by_id(@page.redirect)
      unless page.nil?
        flash[:notice] = I18n.t('pages.cshow.redirect_notice', page: @page.title)
        redirect_to wiki_page_path(page.permalink)
      end
    end
  end

  def new
    @page = Page.new
    @page.title = params[:title].gsub('_', ' ') if params[:title]
    @page.parent = Page.find_by_permalink(params[:parent]) if params[:parent]

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

  def edit
    @page = Page.find(params[:id])
  end

  def create
    @page = Page.new(params[:page].merge({ user: current_user }))

    if params[:preview]
      render action: 'new'
    elsif @page.save
      flash[:notice] = I18n.t('pages.create.notice')
      redirect_to(wiki_page_path(@page.permalink))
    else
      render action: 'new'
    end
  end

  def update
    @page = Page.find(params[:id])
    @page.attributes = params[:page].merge({ user: current_user })

    if params[:preview]
      @page.attributes = params[:page]
      render action: 'edit'
    elsif @page.save
      @page.parent_id = parent_id if params[:parent_id].present? \
            && params[:parent_id] != @page_id
      flash[:notice] = I18n.t('pages.update.notice')
      redirect_to wiki_page_path(@page.permalink)
    else
      render action: 'edit'
    end
  rescue ActiveRecord::StaleObjectError
    flash[:error] = I18n.t('pages.error_stale_object')
    redirect_to wiki_page_path(@page.permalink)
  end

  def destroy
    @page = Page.find(params[:id])
    @page.destroy

    flash[:notice] = I18n.t('pages.destroy.notice', page: @page.title)
    redirect_to wiki_path
  end

  def all
    @pages = Page.non_redirected
    @partial = params[:view] || 'site_map'

    if params[:name]
      @pages = @pages.where('title LIKE ?', "%#{params[:name]}%").limit(20)
      @partial = 'title_list'
    end
    sort = if params[:sort]
             case params[:sort]
             when 'title'                then 'title'
             when 'title_reverse'        then 'title DESC'
             when 'last_updated'         then 'updated_at DESC'
             when 'last_updated_reverse' then 'updated_at'
             end
           else
             'title'
           end
    @pages = @pages.order(sort)
    respond_to do |format|
      format.html
      format.rss { render layout: false }
    end
  end

  def diff
    @page = Page.find(params[:id])
    @old_version = Page::Version.find_by_page_id_and_lock_version params[:id], params[:old]
    @new_version = Page::Version.find_by_page_id_and_lock_version params[:id], params[:new]
    @diff = Diffy::Diff.new(@old_version.body, @new_version.body).to_s(:html)
  end

  def version
    @page = Page.find(params[:id])
    @version = Page::Version.find_by_page_id_and_lock_version params[:id], params[:version]
  end

  def revert
    @page = Page.find(params[:id])
    @page.revert_to!(params[:version].to_i)

    redirect_to wiki_page_path(@page.permalink)
  end

  def variables
    keys = Foodsoft::ExpansionVariables.variables.keys
    @variables = keys.index_with { |k| Foodsoft::ExpansionVariables.get(k) }
    render 'variables'
  end

  private

  def catch_special_pages
    return unless params[:id] == 'Help:Foodsoft_variables'

    variables
  end
end
