# frozen_string_literal: true

RSpec.describe "Channel - Info - Members page", type: :system do
  let(:chat_page) { PageObjects::Pages::Chat.new }

  fab!(:current_user) { Fabricate(:user) }
  fab!(:channel_1) { Fabricate(:category_channel) }

  before do
    SiteSetting.chat_allowed_groups = Group::AUTO_GROUPS[:everyone]
    SiteSetting.direct_message_enabled_groups = Group::AUTO_GROUPS[:everyone]
    chat_system_bootstrap
    sign_in(current_user)
  end

  context "as unauthorized user" do
    before { SiteSetting.chat_allowed_groups = Fabricate(:group).id }

    it "can't see channel members" do
      chat_page.visit_channel_members(channel_1)

      expect(page).to have_current_path("/latest")
    end
  end

  context "as authorized user" do
    context "with no members" do
      it "redirects to settings page" do
        chat_page.visit_channel_members(channel_1)

        expect(page).to have_current_path("/chat/c/#{channel_1.slug}/#{channel_1.id}/info/members")
      end
    end

    context "with members" do
      before do
        channel_1.add(current_user)
        channel_1.add(Fabricate(:user, username: "cat"))
        98.times { channel_1.add(Fabricate(:user)) }
        Jobs.run_immediately!
        channel_1.update!(user_count_stale: true)
        Jobs::Chat::UpdateChannelUserCount.new.execute(chat_channel_id: channel_1.id)
      end

      xit "shows all members" do
        chat_page.visit_channel_members(channel_1)

        expect(page).to have_selector(".c-channel-members__list-item", count: 60)

        scroll_to(find(".c-channel-members__list-item:nth-child(60)"))

        expect(page).to have_selector(".c-channel-members__list-item", count: 100)

        scroll_to(find(".c-channel-members__list-item:nth-child(100)"))

        expect(page).to have_selector(".c-channel-members__list-item", count: 100)
      end

      context "with filter" do
        it "filters members" do
          chat_page.visit_channel_members(channel_1)
          find(".c-channel-members__filter").fill_in(with: "cat")

          expect(page).to have_selector(".c-channel-members__list-item", count: 1, text: "cat")
        end
      end

      context "with user status" do
        xit "renders status next to name" do
          SiteSetting.enable_user_status = true
          current_user.set_status!("walking the dog", "dog")

          chat_page.visit_channel_members(channel_1)

          expect(page).to have_selector(
            ".-member .user-status-message img[alt='#{current_user.user_status.emoji}']",
          )
        end
      end
    end
  end

  context "when category channel" do
    it "doesn’t allow to add members" do
      chat_page.visit_channel_members(channel_1)

      expect(chat_page).to have_no_css(".c-channel-members__list-item.-add-member")
    end
  end

  context "when category channel" do
    fab!(:channel_1) do
      Fabricate(
        :direct_message_channel,
        slug: "test-channel",
        users: [current_user, Fabricate(:user), Fabricate(:user)],
        group: true,
      )
    end

    it "allows to add members" do
      new_user = Fabricate(:user)
      chat_page.visit_channel_members(channel_1)
      chat_page.find(".c-channel-members__list-item.-add-member").click
      chat_page.find(".chat-message-creator__members-input").fill_in(with: new_user.username)
      chat_page.find(".chat-message-creator__list-item").click
      chat_page.find(".add-to-channel").click

      expect(chat_page).to have_current_path("/chat/c/#{channel_1.slug}/#{channel_1.id}")
      expect(chat_page).to have_content(
        I18n.t(
          "chat.channel.users_invited_to_channel",
          invited_users: "@#{new_user.username}",
          inviting_user: "@#{current_user.username}",
          count: 1,
        ),
      )
    end
  end

  context "when on mobile", mobile: true do
    it "has a link to the settings" do
      chat_page.visit_channel_members(channel_1)

      expect(page).to have_css(
        ".c-back-button[href='/chat/c/#{channel_1.slug}/#{channel_1.id}/info/settings']",
      )
    end
  end
end