import { expect } from "e2e";
import { test, WEB } from "./t3.ts";

// POSIX ustar: an eleven-byte regular file followed by a type-1 hard link.
function archive() {
  const header = (name: string, size: number, type: string, target = "") => {
    const b = Buffer.alloc(512);
    b.write(name, 0); b.write("0000644\0", 100); b.write("0000000\0", 108);
    b.write("0000000\0", 116); b.write(size.toString(8).padStart(11, "0") + "\0", 124);
    b.write("00000000000\0", 136); b.fill(32, 148, 156); b.write(type, 156);
    b.write(target, 157); b.write("ustar\0", 257); b.write("00", 263);
    const sum = b.reduce((a, n) => a + n, 0);
    b.write(sum.toString(8).padStart(6, "0") + "\0 ", 148);
    return b;
  };
  const data = Buffer.alloc(512); data.write("hello world");
  return Buffer.concat([header("original.txt", 11, "0"), data,
    header("alias.txt", 0, "1", "original.txt"), Buffer.alloc(8704)]);
}

test("TAR hard links appear with target size and open the target contents", WEB,
  async ({ t3, app, screen }) => {
    const project = await t3.project("archive-demo", { "archive.tar": archive() });
    const thread = await t3.thread({ project, title: "Archive preview", messages: ["Start"] });
    await t3.open(thread);
    await screen.getByRole("button", "Toggle right panel").tap();
    await screen.getByRole("button", "Files F").tap();
    await screen.getByRole("treeitem", "archive.tar").tap();
    await screen.getByRole("button", "Maximize panel").tap();
    await screen.getByRole("table", "Archive entries").waitFor({ state: "visible" });
    await app.screenshot("archive-members");
    await expect(screen.getByText("alias.txt", { exact: true })).toBeVisible();
    await expect(screen.getByRole("row", /alias.txt.*1 KB/)).toBeVisible();
    await screen.getByText("alias.txt", { exact: true }).tap();
    await expect(screen.getByText("hello world", { exact: true })).toBeVisible();
    await app.screenshot("hard-link-contents");
    await screen.getByRole("button", "Back to archive").tap();
    await screen.getByText("original.txt", { exact: true }).tap();
    await expect(screen.getByText("hello world", { exact: true })).toBeVisible();
    await app.screenshot("original-contents");
  });
