import { describe, expect, it } from "vitest";

import { buildIssueUrl, HYPERFRAMES_REPO_URL } from "./feedbackIssue.js";

function decoded(url: string, key: "title" | "body"): string {
  const value = new URL(url).searchParams.get(key);
  return value ?? "";
}

describe("buildIssueUrl", () => {
  const base = {
    repoUrl: HYPERFRAMES_REPO_URL,
    rating: 2,
    comment: "GSAP timeline froze on seek",
    repoPublicUrl: "https://hyperframes.dev/p/abc123",
    environment: "os=darwin/arm64 node=v22.11.0 ffmpeg=yes",
    cliVersion: "1.2.3",
  };

  it("points at the repo /issues/new with the bug label", () => {
    const url = buildIssueUrl(base);
    expect(url.startsWith(`${HYPERFRAMES_REPO_URL}/issues/new?`)).toBe(true);
    expect(new URL(url).searchParams.get("labels")).toBe("bug");
  });

  it("encodes the title and includes rating + repro URL in the body", () => {
    const url = buildIssueUrl(base);
    expect(decoded(url, "title")).toBe("[feedback] GSAP timeline froze on seek");
    const body = decoded(url, "body");
    expect(body).toContain("2/5");
    expect(body).toContain("https://hyperframes.dev/p/abc123");
    expect(body).toContain("os=darwin/arm64");
    expect(body).toContain("cli=1.2.3");
  });

  it("falls back to a generic title when there is no comment", () => {
    const url = buildIssueUrl({ ...base, comment: undefined });
    expect(decoded(url, "title")).toBe("Render feedback (rating 2/5)");
  });

  it("truncates an overlong comment in the body", () => {
    const longComment = "x".repeat(9000);
    const url = buildIssueUrl({ ...base, comment: longComment });
    const body = decoded(url, "body");
    expect(body).not.toContain("x".repeat(9000));
    expect(body).toContain("…");
    // Whole URL stays well under the ~8 KB pre-fill limit.
    expect(url.length).toBeLessThan(8000);
  });

  it("strips a trailing .git from the repo url", () => {
    const url = buildIssueUrl({
      ...base,
      repoUrl: "https://github.com/heygen-com/hyperframes.git",
    });
    expect(url.startsWith(`${HYPERFRAMES_REPO_URL}/issues/new?`)).toBe(true);
  });

  it("notes when no repro link is available", () => {
    const url = buildIssueUrl({ ...base, repoPublicUrl: undefined });
    expect(decoded(url, "body")).toContain("Publishing the repro failed");
  });
});
