import { Users } from './fixtures/userStates';
import { HomeChannel } from './page-objects';
import { createTargetChannel, createTargetPrivateChannel, createDirectMessage } from './utils';
import { setSettingValueById } from './utils/setSettingValueById';
import { test, expect } from './utils/test';

test.use({ storageState: Users.admin.state });

const testAvatars = (homeChannel: HomeChannel, channel: string, url: string) => {
	test('expect sidebar avatar to have provider prefix', async () => {
		expect(homeChannel.sidenav.getSidebarItemByName(channel).locator('img').getAttribute('src')).toBe(url);
	});

	test('expect channel header avatar to have provider prefix', async () => {
		await homeChannel.sidenav.openChat(channel);
		expect(homeChannel.content.channelHeader.locator('img').getAttribute('src')).toBe(url);
	});

	test('expect channel info avatar to have provider prefix', async () => {
		await homeChannel.sidenav.openChat(channel);
		expect(homeChannel.content.channelHeader.locator('img').getAttribute('src')).toBe(url);
	});
};

test.describe('avatar-settings', () => {
	let poHomeChannel: HomeChannel;

	test.beforeEach(async ({ page }) => {
		poHomeChannel = new HomeChannel(page);

		await page.goto('/home');
	});

	test.describe('external avatar provider', () => {
		const providerUrlPrefix = 'https://example.com/avatar/';

		test.beforeAll(async ({ api }) => {
			await setSettingValueById(api, 'Accounts_RoomAvatarExternalUrl', `${providerUrlPrefix}{username}`);
			await setSettingValueById(api, 'Accounts_AvatarExternalUrl', `${providerUrlPrefix}{username}`);
		});

		test.afterAll(async ({ api }) => {
			await setSettingValueById(api, 'Accounts_RoomAvatarExternalUrl', '');
			await setSettingValueById(api, 'Accounts_AvatarExternalUrl', '');
		});

		test.describe('public channels', () => {
			let channelName = '';
			let avatarUrl = '';

			test.beforeAll(async ({ api }) => {
				channelName = await createTargetChannel(api);
				avatarUrl = `${providerUrlPrefix}${channelName}`;
			});

			testAvatars(poHomeChannel, channelName, avatarUrl);
		});

		test.describe('private channels', () => {
			let channelName = '';
			let avatarUrl = '';

			test.beforeAll(async ({ api }) => {
				channelName = await createTargetPrivateChannel(api);
				avatarUrl = `${providerUrlPrefix}${channelName}`;
			});

			testAvatars(poHomeChannel, channelName, avatarUrl);
		});

		test.describe('direct messages', () => {
			const channelName = Users.user2.data.username;
			const avatarUrl = `${providerUrlPrefix}${channelName}`;

			test.beforeAll(async ({ api }) => {
				await createDirectMessage(api);

				// send a message as user 2
				test.use({ storageState: Users.user2.state });
				await poHomeChannel.sidenav.openChat(Users.user1.data.username);
				await poHomeChannel.content.sendMessage('hello world');

				test.use({ storageState: Users.user1.state });
			});

			testAvatars(poHomeChannel, channelName, avatarUrl);

			test('expect message avatar to have provider prefix', async () => {
				expect(poHomeChannel.content.lastUserMessage.locator('img').getAttribute('src')).toBe(avatarUrl);
			});

			test('expect user card avatar to have provider prefix', async () => {
				await poHomeChannel.content.lastUserMessage.locator('.rcx-message-header__name-container').click();
				expect(poHomeChannel.content.userCard.locator('img').getAttribute('src')).toBe(avatarUrl);
			});
		});
	});
});