import { execFileSync } from "node:child_process";
import { writeFileSync, symlinkSync } from "node:fs";
import { dirname, join } from "node:path";
import { expect } from "e2e";
import { test, WEB, makeState, runPromise } from "./t3.ts";
import { T3_HOME } from "../e2e.config.ts";

test("Selected-file commit through a symlinked subdirectory", WEB, async ({ t3, app, screen }) => {
  const repo = await t3.project("selected-files", { "README.md": "Original\n", "sub/dir/.keep": "" });
  const git = (...args: string[]) => execFileSync("git", ["-C", repo, ...args], { encoding: "utf8" }).trim();
  git("config", "user.name", "Scenario");
  git("config", "user.email", "scenario@example.invalid");
  const alias = join(dirname(repo), "linked-subdirectory");
  symlinkSync(join(repo, "sub/dir"), alias);
  const state = makeState(T3_HOME);
  await runPromise(state.cli(["project", "add", alias, "--title", "Symlink selected files"]));
  await t3.thread({ project: alias, title: "Commit selected nested file", messages: ["Ready"] });
  writeFileSync(join(repo, "README.md"), "Root change stays uncommitted\n");
  writeFileSync(join(repo, "sub/dir/nested.txt"), "Selected nested change\n");
  await t3.open();
  await screen.getByRole("button", "Commit selected nested file, Done, Symlink selected files", { exact: true }).tap();
  await screen.getByRole("button", "Git action options").tap();
  await screen.getByRole("menuitem", "Commit", { exact: true }).tap();
  await screen.getByRole("button", "Edit", { exact: true }).tap();
  await screen.getByRole("checkbox").nth(1).tap();
  await screen.getByPlaceholder("Leave empty to auto-generate").fill("Commit selected nested file");
  await app.screenshot("selected-files");
  await screen.getByRole("button", "Commit", { exact: true }).tap();
  await screen.getByText(/^Committed [0-9a-f]+$/).first().or(screen.getByRole("heading", "Action failed")).waitFor({ state: "visible" });
  await app.screenshot("commit-result");
  await expect(screen.getByText(/^Committed [0-9a-f]+$/).first()).toBeVisible();
  await expect(git("show", "--pretty=", "--name-only", "HEAD")).toBe("sub/dir/nested.txt");
  await expect(git("status", "--porcelain")).toBe("M README.md");
  await screen.getByRole("button", "Git action options").tap();
  await screen.getByRole("menuitem", "Commit", { exact: true }).tap();
  await app.screenshot("remaining-root-change");
});
