class ApplicationController < ActionController::Base
  include Pundit::Authorization

  rescue_from Pundit::NotAuthorizedError, with: :render_not_authorized

  before_action :check_maintenance_status
  before_action :set_paper_trail_whodunnit

  def check_maintenance_status
    if FeatureToggle.service_moved?
      unless %w[service-moved accessibility-statement privacy-notice cookies].include?(request.fullpath.split("?")[0].delete("/"))
        redirect_to service_moved_path
      end
    elsif FeatureToggle.service_unavailable?
      unless %w[service-unavailable accessibility-statement privacy-notice cookies].include?(request.fullpath.split("?")[0].delete("/"))
        redirect_to service_unavailable_path
      end
    elsif %w[service-moved service-unavailable].include?(request.fullpath.split("?")[0].delete("/"))
      redirect_back(fallback_location: root_path)
    end
  end

  def render_not_found
    render "errors/not_found", status: :not_found
  end

  def render_not_authorized
    render "errors/not_found", status: :unauthorized
  end

  def render_not_found_json(class_name, id)
    render json: { error: "#{class_name} #{id} not found" }, status: :not_found
  end

protected

  def user_for_paper_trail
    current_user
  end

  def byte_order_mark
    "\uFEFF"
  end
end