# frozen_string_literal: true

class BookmarksBulkAction
  def initialize(user, bookmark_ids, operation, options = {})
    @user = user
    @bookmark_ids = bookmark_ids
    @operation = operation
    @changed_ids = []
    @options = options
  end

  def self.operations
    @operations ||= %w[clear_reminder delete]
  end

  def perform!
    if BookmarksBulkAction.operations.exclude?(@operation[:type])
      raise Discourse::InvalidParameters.new(:operation)
    end
    # careful these are private methods, we need send
    send(@operation[:type])
    @changed_ids.sort
  end

  private

  def delete
    @bookmark_ids.each do |b_id|
      if guardian.can_delete?(b_id)
        BookmarkManager.new(@user).destroy(b_id)
        @changed_ids << b_id
      end
    end
  end

  def clear_reminder
    bookmarks.each do |b|
      if guardian.can_edit?(b)
        BookmarkReminderNotificationHandler.new(b).clear_reminder
        @changed_ids << b.id
      else
        raise Discourse::InvalidAccess.new
      end
    end
  end

  def guardian
    @guardian ||= Guardian.new(@user)
  end

  def bookmarks
    @bookmarks ||= Bookmark.where(id: @bookmark_ids)
  end
end