require 'test_helper'

class TradeActivityTest < ActiveSupport::TestCase
	test "New user's last trade activity is nil" do
		user = create_user
		assert_nil user.last_trade_activity_at
	end

	test "Adding or removing items in a Trading list updates last trade activity" do
		user = create_user

		list = create_closet_list(
			user: user, visibility: ClosetVisibility[:trading].id)
		hanger = create_closet_hanger(user: user, list: list)
		created_at = Time.now

		assert_equal created_at, user.last_trade_activity_at

		travel 1.day
		hanger.destroy!

		assert_equal created_at + 1.day, user.last_trade_activity_at
	end

	test "Adding or removing items in a Public list does not update last trade activity" do
		user = create_user

		list = create_closet_list(
			user: user, visibility: ClosetVisibility[:public].id)
		hanger = create_closet_hanger(user: user, list: list)

		assert_nil user.last_trade_activity_at

		travel 1.day
		hanger.destroy!

		assert_nil user.last_trade_activity_at
	end

	test "Adding or removing items in a Private list does not update last trade activity" do
		user = create_user

		list = create_closet_list(
			user: user, visibility: ClosetVisibility[:private].id)
		hanger = create_closet_hanger(user: user, list: list)

		assert_nil user.last_trade_activity_at

		travel 1.day
		hanger.destroy!

		assert_nil user.last_trade_activity_at
	end

	test "Adding or removing items in a Trading default-list updates last trade activity" do
		user = create_user(
			owned_closet_hangers_visibility: ClosetVisibility[:trading].id,
			wanted_closet_hangers_visibility: ClosetVisibility[:private].id,
		)

		hanger = create_closet_hanger(user: user, owned: true)
		created_at = Time.now

		assert_equal created_at, user.last_trade_activity_at

		travel 1.day
		hanger.destroy!

		assert_equal created_at + 1.day, user.last_trade_activity_at
	end

	test "Adding or removing items in a Public default-list does not update last trade activity" do
		user = create_user(
			owned_closet_hangers_visibility: ClosetVisibility[:public].id,
			wanted_closet_hangers_visibility: ClosetVisibility[:private].id,
		)

		hanger = create_closet_hanger(user: user, owned: true)

		assert_nil user.last_trade_activity_at

		travel 1.day
		hanger.destroy!

		assert_nil user.last_trade_activity_at
	end

	test "Adding or removing items in a Private default-list does not update last trade activity" do
		user = create_user(
			owned_closet_hangers_visibility: ClosetVisibility[:private].id,
			wanted_closet_hangers_visibility: ClosetVisibility[:private].id,
		)

		hanger = create_closet_hanger(user: user, owned: true)

		assert_nil user.last_trade_activity_at

		travel 1.day
		hanger.destroy!

		assert_nil user.last_trade_activity_at
	end

	test "Creating, editing, or deleting a Trading list updates last trade activity" do
		user = create_user
		list = create_closet_list(
			user: user, visibility: ClosetVisibility[:trading].id
		)
		created_at = Time.now

		assert_equal created_at, user.last_trade_activity_at

		travel 1.day
		list.update!(description: "Hello, world!")

		assert_equal created_at + 1.day, user.last_trade_activity_at

		travel 1.day
		list.destroy!

		assert_equal created_at + 2.day, user.last_trade_activity_at
	end

	test "Creating, editing, or deleting a Public list does not update last trade activity" do
		user = create_user
		list = create_closet_list(
			user: user, visibility: ClosetVisibility[:public].id
		)

		assert_nil user.last_trade_activity_at

		travel 1.day
		list.update!(description: "Hello, world!")

		assert_nil user.last_trade_activity_at

		travel 1.day
		list.destroy!

		assert_nil user.last_trade_activity_at
	end

	test "Creating, editing, or deleting a Private list does not update last trade activity" do
		user = create_user
		list = create_closet_list(
			user: user, visibility: ClosetVisibility[:private].id
		)

		assert_nil user.last_trade_activity_at

		travel 1.day
		list.update!(description: "Hello, world!")

		assert_nil user.last_trade_activity_at

		travel 1.day
		list.destroy!

		assert_nil user.last_trade_activity_at
	end

	test "Updating default-list visibility to Trading updates last trade activity" do
		user = create_user(
			owned_closet_hangers_visibility: ClosetVisibility[:private].id,
		)

		assert_nil user.last_trade_activity_at

		user.update!(
			owned_closet_hangers_visibility: ClosetVisibility[:trading].id,
		)

		assert_equal Time.now, user.last_trade_activity_at
	end

	test "Updating default-list visibility to Public does not update last trade activity" do
		user = create_user(
			owned_closet_hangers_visibility: ClosetVisibility[:private].id,
		)

		assert_nil user.last_trade_activity_at

		user.update!(
			owned_closet_hangers_visibility: ClosetVisibility[:public].id,
		)

		assert_nil user.last_trade_activity_at
	end

	test "Updating default-list visibility to Private does not update last trade activity" do
		user = create_user(
			owned_closet_hangers_visibility: ClosetVisibility[:public].id,
		)

		assert_nil user.last_trade_activity_at

		user.update!(
			owned_closet_hangers_visibility: ClosetVisibility[:private].id,
		)

		assert_nil user.last_trade_activity_at
	end

	setup do
		freeze_time # to compare timestamps accurately

		Item.create!(
			thumbnail_url: "https://images.neopets.com/foo.png",
			zones_restrict: "",
			price: 123,
		)
	end

	private

	def create_user(**args)
		auth_user = AuthUser.create!(
			name: 'test', email: 'test@example.com', password: 'test123!'
		)
		auth_user.user.update!(**args) unless args.empty?
		auth_user.user
	end

	def create_closet_list(**args)
		num = ClosetList.count + 1
		ClosetList.create!(name: "Test List #{num}", hangers_owned: true, **args)
	end

	def create_closet_hanger(**args)
		ClosetHanger.create!(item: Item.first, quantity: 1, **args)
	end
end