/* eslint-disable @typescript-eslint/no-explicit-any */
import { test, expect } from "@sand4rt/experimental-ct-web";
import { SketchPushButton } from "./sketch-push-button";

test("does not show GitHub link for non-GitHub remotes", async ({ mount }) => {
  const component = await mount(SketchPushButton, {});

  // Test GitHub remote (should return URL)
  const githubURL = await component.evaluate((el: SketchPushButton) => {
    const githubRemote = {
      name: "origin",
      url: "https://github.com/user/repo.git",
      display_name: "user/repo",
      is_github: true,
    };
    (el as any)._remotes = [githubRemote];
    (el as any)._selectedRemote = "origin";
    (el as any)._branch = "test-branch";
    return (el as any)._computeBranchURL();
  });
  expect(githubURL).toBe("https://github.com/user/repo/tree/test-branch");

  // Test GitLab remote (should return empty string)
  const gitlabURL = await component.evaluate((el: SketchPushButton) => {
    const gitlabRemote = {
      name: "gitlab",
      url: "https://gitlab.com/user/repo.git",
      display_name: "gitlab.com/user/repo",
      is_github: false,
    };
    (el as any)._remotes = [gitlabRemote];
    (el as any)._selectedRemote = "gitlab";
    (el as any)._branch = "test-branch";
    return (el as any)._computeBranchURL();
  });
  expect(gitlabURL).toBe("");

  // Test self-hosted remote (should return empty string)
  const selfHostedURL = await component.evaluate((el: SketchPushButton) => {
    const selfHostedRemote = {
      name: "self",
      url: "https://git.company.com/user/repo.git",
      display_name: "git.company.com/user/repo",
      is_github: false,
    };
    (el as any)._remotes = [selfHostedRemote];
    (el as any)._selectedRemote = "self";
    (el as any)._branch = "test-branch";
    return (el as any)._computeBranchURL();
  });
  expect(selfHostedURL).toBe("");
});

test("handles missing remote gracefully", async ({ mount }) => {
  const component = await mount(SketchPushButton, {});

  // Test with no remotes
  const noRemotesURL = await component.evaluate((el: SketchPushButton) => {
    (el as any)._remotes = [];
    (el as any)._selectedRemote = "";
    (el as any)._branch = "test-branch";
    return (el as any)._computeBranchURL();
  });
  expect(noRemotesURL).toBe("");

  // Test with selected remote that doesn't exist
  const invalidRemoteURL = await component.evaluate((el: SketchPushButton) => {
    (el as any)._remotes = [
      {
        name: "origin",
        url: "https://github.com/user/repo.git",
        display_name: "user/repo",
        is_github: true,
      },
    ];
    (el as any)._selectedRemote = "nonexistent";
    (el as any)._branch = "test-branch";
    return (el as any)._computeBranchURL();
  });
  expect(invalidRemoteURL).toBe("");
});
