# frozen_string_literal: true

require "rails"
require "paper_trail"

begin
  require "will_paginate"
rescue LoadError
  begin
    require "kaminari"
  rescue LoadError
    raise LoadError, "will_paginate or kaminari must be in Gemfile or load_path"
  end
end

class PaperTrailManager < Rails::Engine
  initializer "paper_trail_manager.pagination" do
    ::ActionView::Base.send(:alias_method, :paginate, :will_paginate) if defined?(WillPaginate)
  end

  @@whodunnit_name_method = :name
  cattr_accessor :whodunnit_class, :whodunnit_name_method, :route_helpers,
    :layout, :base_controller, :user_path_method, :item_name_method

  self.base_controller = "ApplicationController"
  self.user_path_method = :user_path

  (Pathname(__FILE__).dirname + "..").tap do |base|
    paths["app/controller"] = base + "app/controllers"
    paths["app/view"] = base + "app/views"
  end

  cattr_accessor :allow_index_block, :allow_show_block, :allow_revert_block

  block = proc { true }
  self.allow_index_block = block
  self.allow_show_block = block
  self.allow_revert_block = block

  def self.allow_index_when(&block)
    self.allow_index_block = block
  end

  def self.allow_index?(controller)
    allow_index_block.call controller
  end

  def self.allow_show_when(&block)
    self.allow_show_block = block
  end

  def self.allow_show?(controller, version)
    allow_index_block.call controller, version
  end

  # Describe when to allow reverts. Call this with a block that accepts
  # arguments for +controller+ and +version+.
  def self.allow_revert_when(&block)
    self.allow_revert_block = block
  end

  # Allow revert given the +controller+ and +version+? If no
  # ::allow_revert_when was specified, always return +true+.
  def self.allow_revert?(controller, version)
    allow_revert_block.call controller, version
  end
end
