import { expect } from '@playwright/test';

import { test } from './fixtures';

import { runAndAdvance } from './utils';

test.use({ autoGoto: false });

test.describe('Smoke', () => {
  test('Tour', async ({ page, tmpPath }) => {
    // Open the tree page
    await page.goto(`tree/${tmpPath}`);
    await page.click('text="Running"');
    await page.click('text="Files"');

    // Create a new console
    await page.menu.clickMenuItem('New>Console');
    // Choose the kernel
    const [console] = await Promise.all([
      page.waitForEvent('popup'),
      page.click('text="Select"'),
    ]);
    await console.waitForLoadState();
    await console.waitForSelector('.jp-CodeConsole');

    // Create a new notebook
    const [notebook] = await Promise.all([
      page.waitForEvent('popup'),
      page.click('text="New"'),
      page.click('text="Notebook"'),
    ]);

    try {
      // we may have to select the kernel first
      await notebook.click('text="Select"', { timeout: 5000 });
    } catch (e) {
      // The kernel is already selected
    }

    // Enter code in the first cell
    await notebook.locator(
      '.jp-Cell-inputArea >> .cm-editor >> .cm-content[contenteditable="true"]'
    ).type(`import math

math.pi`);

    // Run the cell
    runAndAdvance(notebook);

    // Enter code in the next cell
    await notebook
      .locator(
        '.jp-Cell-inputArea >> .cm-editor >> .cm-content[contenteditable="true"]'
      )
      .nth(1)
      .type('import this');

    // Run the cell
    runAndAdvance(notebook);

    // Save the notebook
    // TODO: re-enable after fixing the name on save dialog?
    // await notebook.click('//span/*[local-name()="svg"]');

    // Click on the Jupyter logo to open the tree page
    const [tree2] = await Promise.all([
      notebook.waitForEvent('popup'),
      notebook.click(
        '//*[local-name()="svg" and normalize-space(.)=\'Jupyter\']'
      ),
    ]);

    // Shut down the kernels
    await tree2.click('text="Running"');
    await tree2.click('#main-panel button :text("Shut Down All")');
    await tree2.press('.jp-Dialog', 'Enter');

    // Close the pages
    await tree2.close();
    await notebook.close();
    await console.close();
    await page.close();

    expect(true).toBe(true);
  });

  test('JupyterLab', async ({ page, tmpPath }) => {
    // Open the tree page
    await page.goto(`tree/${tmpPath}`);

    // Open JupyterLab
    const [lab] = await Promise.all([
      page.waitForEvent('popup'),
      page.menu.clickMenuItem('View>Open JupyterLab'),
    ]);
    await lab.waitForSelector('.jp-Launcher');
    await lab.close();

    expect(true).toBe(true);
  });
});
