module Authorizable
  extend ActiveSupport::Concern

  included do
    before_action :require_registered_user
  end

  class_methods do
    def allow_unregistered_user(**args)
      skip_before_action :require_registered_user, **args
    end

    def require_unregistered_user(**args)
      skip_before_action :require_registered_user, **args
      before_action :require_unregistered_user, **args
    end
  end

  private

  def require_registered_user
    Current.user.registered? || redirect_to_sign_in
  end

  def require_unregistered_user
    Current.user.unregistered? || redirect_to_dashboard
  end

  def redirect_to_sign_in
    session[:return_url] = request.url
    redirect_to new_session_url, alert: "You must be logged in to continue."
  end

  def redirect_to_dashboard
    redirect_to root_url, alert: "You are already logged in."
  end
end