class Projects::JoinService < ApplicationService
  attr_reader :project, :user, :opts

  def initialize(project, user, **opts)
    @project = project
    @user    = user
    @opts    = opts
  end

  def call
    ActiveRecord::Base.transaction do
      member = project.members.create!(user: user)

      member.member_roles.create!(role_id: role_value)

      project.user_grades.find_or_create_by!(user: user)
    end

    ApplyJoinProjectNotifyJob.perform_later(user, project, role_value)

    project
  end

  private

  def role_value
    @_role ||=
      case opts[:role]
      when 'manager'   then 3
      when 'developer' then 4
      when 'reporter'  then 5
      else raise ArgumentError
      end
  end
end