const {expect} = require('@playwright/test');
const test = require('../fixtures/ghost-test');

test.describe('Announcement Bar Settings', () => {
    test('Bar hidden by default', async ({sharedPage}) => {
        await sharedPage.goto('/ghost');
        await goToAnnouncementBarSettings(sharedPage);

        await test.step('Bar should be hidden', async () => {
            const htmlFrame = getPreviewFrame(sharedPage);
            await expect(await htmlFrame.locator('#announcement-bar-root')).toHaveCount(0);
        });
    });

    test('Show/hide bar if visibility checked/unchecked and text filled', async ({sharedPage}) => {
        await sharedPage.goto('/ghost');
        const modal = await goToAnnouncementBarSettings(sharedPage);

        await test.step('Check free members', async () => {
            const freeMembersCheckbox = modal.getByLabel('Free members');
            await expect(freeMembersCheckbox).not.toBeChecked();
            await freeMembersCheckbox.check();
        });

        await test.step('Fill announcement text', async () => {
            await modal.locator('.koenig-react-editor').click();
            await expect(await modal.locator('[contenteditable="true"]')).toBeVisible({timeout: 30000}); // add timeout as lexical module loading can take time
            await sharedPage.keyboard.type('Announcement text');
            await modal.getByText('Announcement').first().click(); // defocus the editor
        });

        const htmlFrame = getPreviewFrame(sharedPage);
        await test.step('Announcement bar should be visible', async () => {
            await expect(await htmlFrame.getByText('Announcement text')).toBeVisible();
        });

        await test.step('Disable free members', async () => {
            const freeMembersCheckbox = modal.getByLabel('Free members');
            await expect(freeMembersCheckbox).toBeChecked();
            await freeMembersCheckbox.uncheck();
            await modal.locator('.koenig-react-editor').click();
        });

        await test.step('Announcement bar should be hidden', async () => {
            await expect(await htmlFrame.getByText('Announcement text')).toBeHidden();
        });
    });
});

async function goToAnnouncementBarSettings(sharedPage) {
    await test.step('Navigate to the announcement bar settings', async () => {
        await sharedPage.getByRole('navigation').getByRole('link', {name: 'Settings'}).click();
        await sharedPage.getByTestId('announcement-bar').getByRole('button', {name: 'Customize'}).click();
        // Wait for the preview to load
        await getPreviewFrame(sharedPage).locator('body *:visible').first().waitFor();
    });
    return sharedPage.getByTestId('announcement-bar-modal');
}

function getPreviewFrame(sharedPage) {
    return sharedPage.frameLocator('[data-testid="announcement-bar-preview-iframe"] > iframe[data-visible=true]');
}
