// These tests sign in as user #1

const SeleniumHelper = require('./selenium-helpers.js');

const {
    buildDriver,
    clickText,
    clickXpath,
    findByXpath,
    navigate,
    signIn,
    urlMatches,
    waitUntilDocumentReady
} = new SeleniumHelper();

const username = `${process.env.SMOKE_USERNAME}1`;
const password = process.env.SMOKE_PASSWORD;

const rootUrl = process.env.ROOT_URL || 'https://scratch.ly';
const myStuffURL = `${rootUrl}/mystuff`;
const rateLimitCheck = process.env.RATE_LIMIT_CHECK || rootUrl;

jest.setTimeout(60000);

let driver;

describe('www-integration my_stuff', () => {
    beforeAll(async () => {
        driver = await buildDriver('www-integration my_stuff');
        await navigate(rootUrl);
        await signIn(username, password);
        await findByXpath('//span[contains(@class, "profile-name")]');
    });

    afterAll(() => driver.quit());

    test('verify My Stuff structure (tabs, title)', async () => {
        await navigate(myStuffURL);
        const header = await findByXpath('//div[@class="box-head"]/h2');
        const headerVisible = await header.isDisplayed();
        expect(headerVisible).toBe(true);
        const allTab = await findByXpath('//li[@data-tab="projects"]/a');
        const allTabVisible = await allTab.isDisplayed();
        expect(allTabVisible).toBe(true);
        const sharedTab = await findByXpath('//li[@data-tab="shared"]/a');
        const sharedTabVisible = await sharedTab.isDisplayed();
        expect(sharedTabVisible).toBe(true);
        const unsharedTab = await findByXpath('//li[@data-tab="unshared"]/a');
        const unsharedTabVisible = await unsharedTab.isDisplayed();
        expect(unsharedTabVisible).toBe(true);
        const studios = await findByXpath('//li[@data-tab="galleries"]/a');
        const studiosVisible = await studios.isDisplayed();
        expect(studiosVisible).toBe(true);
        const trash = await findByXpath('//li[@data-tab="trash"]/a');
        const trashVisible = await trash.isDisplayed();
        expect(trashVisible).toBe(true);
    });

    test('clicking a project title should take you to the project page', async () => {
        await navigate(myStuffURL);
        await clickXpath('//span[@class="media-info-item title"]');
        await waitUntilDocumentReady();
        const gui = await findByXpath('//div[@class="guiPlayer"]');
        const guiVisible = await gui.isDisplayed();
        expect(guiVisible).toBe(true);
    });

    test('clicking "see inside" should take you to the editor', async () => {
        await navigate(myStuffURL);
        await clickXpath('//a[@data-control="edit"]');
        await waitUntilDocumentReady();
        const gf = await findByXpath('//img[@class="green-flag_green-flag_1kiAo"]');
        const gfVisible = await gf.isDisplayed();
        expect(gfVisible).toBe(true);
    });

    test('Add To button should bring up a list of studios', async () => {
        await navigate(myStuffURL);
        await clickXpath('//div[@id="sidebar"]/ul/li[@data-tab="shared"]');
        await clickXpath('//div[@data-control="add-to"]');
        const dropDown = await findByXpath('//div[@class="dropdown-menu"]/ul/li');
        const dropDownVisible = await dropDown.isDisplayed();
        expect(dropDownVisible).toBe(true);
    });

    test('+ New Project button should open the editor', async () => {
        await navigate(myStuffURL);
        await clickText('+ New Project');
        await waitUntilDocumentReady();
        const gf = await findByXpath('//img[@class="green-flag_green-flag_1kiAo"]');
        const gfVisible = await gf.isDisplayed();
        expect(gfVisible).toBe(true);
    });

    test('+ New Studio button should take you to the studio page', async () => {
        await navigate(rateLimitCheck);
        await navigate(myStuffURL);
        await clickXpath('//form[@id="new_studio"]/button[@type="submit"]');
        await waitUntilDocumentReady();
        const tabs = await findByXpath('//div[@class="studio-tabs"]');
        const tabsVisible = await tabs.isDisplayed();
        expect(tabsVisible).toBe(true);
    });

    test('New studio rate limited to five', async () => {
        await navigate(rateLimitCheck);
        // 1st studio
        await navigate(myStuffURL);
        await clickXpath('//form[@id="new_studio"]/button[@type="submit"]');
        await urlMatches(/\/studios\//);
        // 2nd studio
        await navigate(myStuffURL);
        await clickXpath('//form[@id="new_studio"]/button[@type="submit"]');
        await urlMatches(/\/studios\//);
        // 3rd studio
        await navigate(myStuffURL);
        await clickXpath('//form[@id="new_studio"]/button[@type="submit"]');
        await urlMatches(/\/studios\//);
        // 4th studio
        await navigate(myStuffURL);
        await clickXpath('//form[@id="new_studio"]/button[@type="submit"]');
        await urlMatches(/\/studios\//);
        // 5th studio
        await navigate(myStuffURL);
        await clickXpath('//form[@id="new_studio"]/button[@type="submit"]');
        await urlMatches(/\/studios\//);
        // 6th studio should fail
        await navigate(myStuffURL);
        await clickXpath('//form[@id="new_studio"]/button[@type="submit"]');
        // findByXpath checks for both presence and visibility
        const alertMessage = await findByXpath('//div[contains(@class, "alert-error")]');
        expect(alertMessage).toBeTruthy();

        await navigate(rateLimitCheck);
    });
});