require_dependency 'jobs/regular/update_username'

class UsernameChanger

  def initialize(user, new_username, actor = nil)
    @user = user
    @old_username = user.username
    @new_username = new_username
    @actor = actor
  end

  def self.change(user, new_username, actor = nil)
    self.new(user, new_username, actor).change
  end

  def change(asynchronous: true, run_update_job: true)
    if @actor && @old_username != @new_username
      StaffActionLogger.new(@actor).log_username_change(@user, @old_username, @new_username)
    end

    @user.username = @new_username

    if @user.save
      UsernameChanger.update_username(user_id: @user.id,
                                      old_username: @old_username,
                                      new_username: @new_username,
                                      avatar_template: @user.avatar_template,
                                      asynchronous: asynchronous) if run_update_job
      return true
    end

    false
  end

  def self.update_username(user_id:, old_username:, new_username:, avatar_template:, asynchronous: true)
    args = {
      user_id: user_id,
      old_username: old_username,
      new_username: new_username,
      avatar_template: avatar_template
    }

    if asynchronous
      Jobs.enqueue(:update_username, args)
    else
      Jobs::UpdateUsername.new.execute(args)
    end
  end
end