class RewardGradeService < ApplicationService
  attr_reader :user, :attrs, :not_unique

  def initialize(user, **attrs)
    @user  = user
    @not_unique = attrs.delete(:not_unique) || false
    @attrs = attrs.slice(*%i[container_id container_type score])
  end

  def call
    return if user.grades.exists?(attrs) && !not_unique

    ActiveRecord::Base.transaction do
      grade = user.grades.create!(attrs)

      user.increment!(:grade, grade.score)
    end
  end
end