FactoryBot.define do
  factory :user do
    sequence(:email) { |n| "user#{n}@example.com" }
    sequence(:display_name) { |n| "User #{n}" }
    pass_crypt { Digest::MD5.hexdigest("test") }

    # These attributes are not the defaults, but in most tests we want
    # a 'normal' user who can log in without being redirected etc.
    status { "active" }
    terms_seen { true }
    terms_agreed { Time.now.getutc }
    data_public { true }

    trait :with_home_location do
      home_lat { rand(-90.0...90.0) }
      home_lon { rand(-180.0...180.0) }
    end

    trait :pending do
      status { "pending" }
    end

    trait :active do
      status { "active" }
    end

    trait :confirmed do
      status { "confirmed" }
    end

    trait :suspended do
      status { "suspended" }
    end

    trait :deleted do
      status { "deleted" }
    end

    factory :moderator_user do
      after(:create) do |user, _evaluator|
        create(:user_role, :role => "moderator", :user => user)
      end
    end

    factory :administrator_user do
      after(:create) do |user, _evaluator|
        create(:user_role, :role => "administrator", :user => user)
      end
    end

    factory :super_user do
      after(:create) do |user, _evaluator|
        UserRole::ALL_ROLES.each do |role|
          create(:user_role, :role => role, :user => user)
        end
      end
    end
  end
end
