module AuditedSpecHelpers
  def create_user(attrs = {})
    Models::ActiveRecord::User.create({name: "Brandon", username: "brandon", password: "password", favourite_device: "Android Phone"}.merge(attrs))
  end

  def create_user_with_readonly_attrs(attrs = {})
    Models::ActiveRecord::UserWithReadOnlyAttrs.create({name: "Brandon", username: "brandon", password: "password", favourite_device: "Android Phone"}.merge(attrs))
  end

  def build_user(attrs = {})
    Models::ActiveRecord::User.new({name: "darth", username: "darth", password: "noooooooo"}.merge(attrs))
  end

  def create_versions(n = 2, attrs = {})
    Models::ActiveRecord::User.create(name: "Foobar 1", **attrs).tap do |u|
      (n - 1).times do |i|
        u.update_attribute :name, "Foobar #{i + 2}"
      end
      u.reload
    end
  end

  def run_migrations(direction, migrations_paths, target_version = nil)
    if rails_below?("5.2.0.rc1")
      ActiveRecord::Migrator.send(direction, migrations_paths, target_version)
    elsif rails_below?("6.0.0.rc1") || rails_at_least?("7.2.0")
      ActiveRecord::MigrationContext.new(migrations_paths).send(direction, target_version)
    else
      ActiveRecord::MigrationContext.new(migrations_paths, ActiveRecord::SchemaMigration).send(direction, target_version)
    end
  end

  def rails_below?(rails_version)
    Gem::Version.new(Rails::VERSION::STRING) < Gem::Version.new(rails_version)
  end

  def rails_at_least?(rails_version)
    Gem::Version.new(Rails::VERSION::STRING) >= Gem::Version.new(rails_version)
  end
end
