class UserAnonymizer
  def initialize(user, actor=nil)
    @user = user
    @actor = actor
  end

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

  def make_anonymous
    User.transaction do
      prev_email = @user.email
      prev_username = @user.username

      if !UsernameChanger.change(@user, make_anon_username)
        raise "Failed to change username"
      end

      @user.reload
      @user.password = SecureRandom.hex
      @user.email = "#{@user.username}@example.com"
      @user.name = SiteSetting.full_name_required ? @user.username : nil
      @user.date_of_birth = nil
      @user.title = nil
      @user.uploaded_avatar_id = nil
      @user.save

      options = @user.user_option
      options.email_always = false
      options.mailing_list_mode = false
      options.email_digests = false
      options.email_private_messages = false
      options.email_direct = false
      options.save

      profile = @user.user_profile
      profile.destroy if profile
      @user.create_user_profile

      @user.user_avatar.try(:destroy)
      @user.twitter_user_info.try(:destroy)
      @user.google_user_info.try(:destroy)
      @user.github_user_info.try(:destroy)
      @user.facebook_user_info.try(:destroy)
      @user.single_sign_on_record.try(:destroy)
      @user.oauth2_user_info.try(:destroy)
      @user.user_open_ids.find_each { |x| x.destroy }
      @user.api_key.try(:destroy)

      UserHistory.create( action: UserHistory.actions[:anonymize_user],
                          target_user_id: @user.id,
                          acting_user_id: @actor ? @actor.id : @user.id,
                          email: prev_email,
                          details: "username: #{prev_username}" )
    end
    @user
  end

  def make_anon_username
    100.times do
      new_username = "anon#{(SecureRandom.random_number * 100000000).to_i}"
      return new_username unless User.where(username_lower: new_username).exists?
    end
    raise "Failed to generate an anon username"
  end
end