import { PageObject, testSkipIfWindows, Timeout } from "./helpers/test_helper";
import { expect } from "@playwright/test";
import * as eph from "electron-playwright-helpers";
import path from "node:path";

const runVersionIntegrityTest = async (po: PageObject, nativeGit: boolean) => {
  await po.setUp({ autoApprove: true, disableNativeGit: !nativeGit });

  // Importing a simple app with a few files.
  await po.page.getByRole("button", { name: "Import App" }).click();
  await eph.stubDialog(po.electronApp, "showOpenDialog", {
    filePaths: [
      path.join(__dirname, "fixtures", "import-app", "version-integrity"),
    ],
  });

  await po.page.getByRole("button", { name: "Select Folder" }).click();
  await po.page.getByRole("textbox", { name: "Enter new app name" }).click();
  await po.page
    .getByRole("textbox", { name: "Enter new app name" })
    .fill("version-integrity-app");
  await po.page.getByRole("button", { name: "Import" }).click();

  // Initial snapshot
  await po.snapshotAppFiles({ name: "v1" });

  // Add a file and delete a file
  await po.sendPrompt("tc=version-integrity-add-edit-delete");
  await po.snapshotAppFiles({ name: "v2" });

  // Move a file
  await po.sendPrompt("tc=version-integrity-move-file");
  await po.snapshotAppFiles({ name: "v3" });

  // Open version pane
  await po.page.getByRole("button", { name: "Version 3" }).click();
  await po.page.getByText("Init Dyad app Restore").click();
  await po.snapshotAppFiles({ name: "v1" });

  const restoreButton = po.page.getByRole("button", {
    name: "Restore to this version",
  });
  await restoreButton.click();
  await expect(restoreButton).not.toBeVisible({ timeout: Timeout.LONG });
  // Should be same as the previous snapshot, but just to be sure.
  await po.snapshotAppFiles({ name: "v1" });
};

testSkipIfWindows("version integrity (git isomorphic)", async ({ po }) => {
  await runVersionIntegrityTest(po, false);
});

testSkipIfWindows("version integrity (git native)", async ({ po }) => {
  await runVersionIntegrityTest(po, true);
});
