begin
  require "panda_pal"
  require "panda_pal/concerns/ability_helper"
rescue LoadError
end

module CanvasSync::Concerns
  module AbilityHelper
    extend ActiveSupport::Concern

    if defined?(PandaPal::Concerns::AbilityHelper)
      include PandaPal::Concerns::AbilityHelper
    else
      def panda_pal_session
        raise "This feature was moved to PandaPal as of CanvasSync 0.20.0/PandaPal 5.9.9. You should update to PandaPal >= 5.9.9."
      end
    end

    # Middle Domain

    def launch_context
      @launch_context ||= begin
        if panda_pal_session.lti_launch_placement == "global_navigation"
          :global
        elsif panda_pal_session.get_lti_cust_param('custom_canvas_course_id').present?
          ::Course.find_by(canvas_id: panda_pal_session.get_lti_cust_param('custom_canvas_course_id'))
        else
          ::Account.find_by(canvas_id: panda_pal_session.get_lti_cust_param('custom_canvas_account_id'))
        end
      end
    end

    def launch_account
      @launch_account ||= launch_context.respond_to?(:account) ?
                            launch_context.account :
                            ::Account.find_by(canvas_id: panda_pal_session.get_lti_cust_param('custom_canvas_account_id'))
    end

    # CanvasSync Domain

    def canvas_permissions
      panda_pal_session[:canvas_permissions] ||= ::Role.joined_permissions(canvas_roles)
    end

    def canvas_roles
      @canvas_roles ||= Role.for_labels(panda_pal_session.canvas_role_labels, launch_account)
    end

    def canvas_root_account_roles
      role_labels = panda_pal_session.canvas_account_role_labels('self')
      ::Role.for_labels(role_labels, ::Account.find_by(canvas_parent_account_id: nil))
    end

    def canvas_account_roles
      canvas_roles.where(base_role_type: 'AccountMembership')
    end

    def canvas_course_roles
      canvas_roles.where.not(base_role_type: 'AccountMembership')
    end

    def canvas_super_user?
      panda_pal_session.cache(:canvas_super_user?) do
        panda_pal_session.canvas_site_admin? || (panda_pal_session.canvas_account_role_labels(:root) & ["AccountAdmin", "Account Admin"]).present?
      end
    end

    def canvas_user_id
      user&.canvas_id || panda_pal_session.get_lti_cust_param('canvas_user_id')
    end
  end
end