# frozen_string_literal: true

class MapPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      visible = %w[public commons]
      return scope.where(permission: visible) unless user

      scope.where(permission: visible)
           .or(scope.where(id: user.shared_maps.map(&:id)))
           .or(scope.where(user_id: user.id))
    end
  end

  def index?
    true
  end

  def show?
    record.permission.in?(%w[commons public]) ||
      record.collaborators.include?(user) ||
      record.user == user
  end

  def conversation?
    show? && is_tester(user)
  end

  def create?
    user.present?
  end

  def update?
    return false if user.blank?
    record.permission == 'commons' ||
      record.collaborators.include?(user) ||
      record.user == user
  end

  def destroy?
    record.user == user || admin_override
  end

  def access?
    # this is for the map creator to bulk change who can access the map
    user.present? && record.user == user
  end

  def request_access?
    # this is to access the page where you can request access to a map
    user.present?
  end

  def access_request?
    # this is to actually request access
    user.present?
  end

  def approve_access?
    record.user == user
  end

  def deny_access?
    approve_access?
  end

  def approve_access_post?
    approve_access?
  end

  def deny_access_post?
    approve_access?
  end

  def contains?
    show?
  end

  def events?
    show?
  end

  def export?
    show?
  end

  def star?
    unstar?
  end

  def unstar?
    user.present?
  end

  def follow?
    show? && user.present?
  end

  def unfollow?
    user.present?
  end

  def unfollow_from_email?
    user.present?
  end
end
