# frozen_string_literal: true

RSpec.describe Jobs::TruncateUserFlagStats do
  fab!(:user) { Fabricate(:user, refresh_auto_groups: true) }
  fab!(:other_user) { Fabricate(:user, refresh_auto_groups: true) }

  before do
    # We might make this a site setting eventually
    Jobs::TruncateUserFlagStats.stubs(:truncate_to).returns(2)
  end

  def perform(*users)
    described_class.new.execute(user_ids: users.map(&:id))
    users.each { |u| u.reload }
  end

  it "raises an error without user ids" do
    expect { described_class.new.execute({}) }.to raise_error(Discourse::InvalidParameters)
  end

  it "does nothing if the user doesn't have enough flags" do
    user.user_stat.update_columns(flags_agreed: 1)
    perform(user)

    expect(user.user_stat.flags_agreed).to eq(1)
    expect(user.user_stat.flags_disagreed).to eq(0)
    expect(user.user_stat.flags_ignored).to eq(0)
  end

  it "removes the statuses of old flags (integration test)" do
    p0 = Fabricate(:post)
    p1 = Fabricate(:post)
    p2 = Fabricate(:post, user: user)
    p3 = Fabricate(:post)

    freeze_time 10.minutes.ago
    r0 = PostActionCreator.spam(user, p0).reviewable
    freeze_time 1.minute.from_now
    r1 = PostActionCreator.spam(user, p1).reviewable
    freeze_time 1.minute.from_now
    r2 = PostActionCreator.spam(user, p2).reviewable
    freeze_time 1.minute.from_now
    r3 = PostActionCreator.spam(user, p3).reviewable

    freeze_time 1.minute.from_now
    PostActionCreator.spam(other_user, p3).reviewable
    freeze_time 1.minute.from_now
    PostActionCreator.spam(other_user, p2).reviewable
    freeze_time 1.minute.from_now
    PostActionCreator.spam(other_user, p1).reviewable

    unfreeze_time

    r0.perform(Discourse.system_user, :agree_and_keep)
    r1.perform(Discourse.system_user, :disagree)
    r2.perform(Discourse.system_user, :ignore_and_do_nothing)
    r3.perform(Discourse.system_user, :agree_and_keep)

    user.user_stat.reload
    other_user.user_stat.reload

    expect(user.user_stat.flags_agreed).to eq(2)
    expect(user.user_stat.flags_disagreed).to eq(1)
    expect(user.user_stat.flags_ignored).to eq(0)

    expect(other_user.user_stat.flags_agreed).to eq(1)
    expect(other_user.user_stat.flags_disagreed).to eq(1)
    expect(other_user.user_stat.flags_ignored).to eq(1)

    perform(user, other_user)

    expect(user.user_stat.flags_agreed).to eq(1)
    expect(user.user_stat.flags_disagreed).to eq(1)
    expect(user.user_stat.flags_ignored).to eq(0)

    expect(other_user.user_stat.flags_agreed).to eq(0)
    expect(other_user.user_stat.flags_disagreed).to eq(1)
    expect(other_user.user_stat.flags_ignored).to eq(1)
  end
end