import path from 'node:path';

import { expect } from '@playwright/test';
import fs from 'fs-extra';

import { test } from './fixture';

test.skip('check workspace has a DB file', async ({ appInfo, workspace }) => {
  const w = await workspace.current();
  const dbPath = path.join(
    appInfo.sessionData,
    'workspaces',
    w.id,
    'storage.db'
  );
  // check if db file exists
  expect(await fs.exists(dbPath)).toBe(true);
});

test.skip('move workspace db file', async ({ page, appInfo, workspace }) => {
  const w = await workspace.current();
  const settingButton = page.getByTestId('slider-bar-workspace-setting-button');
  // goto settings
  await settingButton.click();

  const tmpPath = path.join(appInfo.sessionData, w.id + '-tmp-dir');

  // move db file to tmp folder
  await page.evaluate(tmpPath => {
    // @ts-expect-error
    window.apis?.dialog.setFakeDialogResult({
      filePath: tmpPath,
    });
  }, tmpPath);

  await page.getByTestId('move-folder').click();
  // check if db file exists
  await page.waitForSelector('text="Move folder success"');
  expect(await fs.exists(tmpPath)).toBe(true);
  // check if db file exists under tmpPath (a file ends with .affine)
  const files = await fs.readdir(tmpPath);
  expect(files.some(f => f.endsWith('.affine'))).toBe(true);
});

test.skip('export then add', async ({ page, appInfo, workspace }) => {
  const w = await workspace.current();
  const settingButton = page.getByTestId('slider-bar-workspace-setting-button');
  // goto settings
  await settingButton.click();

  const originalId = w.id;

  const newWorkspaceName = 'new-test-name';

  // change workspace name
  await page.getByTestId('workspace-name-input').fill(newWorkspaceName);
  await page.getByTestId('save-workspace-name').click();
  await page.waitForSelector('text="Update workspace name success"');
  await page.click('[data-tab-key="export"]');

  const tmpPath = path.join(appInfo.sessionData, w.id + '-tmp.db');

  // export db file to tmp folder
  await page.evaluate(tmpPath => {
    // @ts-expect-error
    window.apis?.dialog.setFakeDialogResult({
      filePath: tmpPath,
    });
  }, tmpPath);

  await page.getByTestId('export-affine-backup').click();
  await page.waitForSelector('text="Export success"');

  expect(await fs.exists(tmpPath)).toBe(true);

  // add workspace
  // we are reusing the same db file so that we don't need to maintain one
  // in the codebase

  await page.getByTestId('current-workspace').click();
  await page.getByTestId('add-or-new-workspace').click();

  await page.evaluate(tmpPath => {
    // @ts-expect-error
    window.apis?.dialog.setFakeDialogResult({
      filePath: tmpPath,
    });
  }, tmpPath);

  // load the db file
  await page.getByTestId('add-workspace').click();

  // should show "Added Successfully" dialog
  await page.waitForSelector('text="Added Successfully"');
  await page.getByTestId('create-workspace-continue-button').click();

  // sleep for a while to wait for the workspace to be added :D
  await page.waitForTimeout(2000);
  const newWorkspace = await workspace.current();
  expect(newWorkspace.id).not.toBe(originalId);
  // check its name is correct
  await expect(page.getByTestId('workspace-name')).toHaveText(newWorkspaceName);
});
