import { test, expect } from "@sand4rt/experimental-ct-web";
import { SketchContainerStatus } from "./sketch-container-status";
import { State } from "../types";

// Mock complete state for testing
const mockCompleteState: State = {
  state_version: 2,
  hostname: "test-host",
  working_dir: "/test/dir",
  initial_commit: "abcdef1234567890",
  message_count: 42,
  os: "linux",
  slug: "test-session",
  total_usage: {
    input_tokens: 1000,
    output_tokens: 2000,
    cache_read_input_tokens: 300,
    cache_creation_input_tokens: 400,
    total_cost_usd: 0.25,
    start_time: "",
    messages: 0,
    tool_uses: {},
  },
  outstanding_llm_calls: 0,
  outstanding_tool_calls: [],
  session_id: "test-session-id",
  ssh_available: false,
  in_container: true,
  first_message_index: 0,
  diff_lines_added: 15,
  diff_lines_removed: 3,
};

test("render props", async ({ mount }) => {
  const component = await mount(SketchContainerStatus, {
    props: {
      state: mockCompleteState,
    },
  });
  await expect(component.locator("#hostname")).toContainText(
    mockCompleteState.hostname,
  );
  // Check that all expected elements exist
  await expect(component.locator("#workingDir")).toContainText(
    mockCompleteState.working_dir,
  );

  // Show details to access the popup elements
  await component.locator(".info-toggle").click();

  await expect(component.locator("#initialCommit")).toContainText(
    mockCompleteState.initial_commit.substring(0, 8),
  );

  await expect(component.locator("#messageCount")).toContainText(
    mockCompleteState.message_count + "",
  );
  const expectedTotalInputTokens =
    mockCompleteState.total_usage.input_tokens +
    mockCompleteState.total_usage.cache_read_input_tokens +
    mockCompleteState.total_usage.cache_creation_input_tokens;
  await expect(component.locator("#inputTokens")).toContainText(
    expectedTotalInputTokens.toLocaleString(),
  );
  await expect(component.locator("#outputTokens")).toContainText(
    mockCompleteState.total_usage.output_tokens.toLocaleString(),
  );
  await expect(component.locator("#totalCost")).toContainText(
    "$" + mockCompleteState.total_usage.total_cost_usd.toFixed(2),
  );
});

test("renders with partial state data", async ({ mount }) => {
  const partialState: Partial<State> = {
    state_version: 2,
    hostname: "partial-host",
    message_count: 10,
    os: "linux",
    slug: "partial-test",
    session_id: "partial-session",
    ssh_available: false,
    total_usage: {
      input_tokens: 500,
      start_time: "",
      messages: 0,
      output_tokens: 0,
      cache_read_input_tokens: 0,
      cache_creation_input_tokens: 0,
      total_cost_usd: 0,
      tool_uses: {},
    },
  };

  const component = await mount(SketchContainerStatus, {
    props: {
      state: partialState as State,
    },
  });

  // Check that elements with data are properly populated
  await expect(component.locator("#hostname")).toContainText("partial-host");

  // Show details to access the popup elements
  await component.locator(".info-toggle").click();
  await expect(component.locator("#messageCount")).toContainText("10");

  const expectedTotalInputTokens =
    partialState.total_usage.input_tokens +
    partialState.total_usage.cache_read_input_tokens +
    partialState.total_usage.cache_creation_input_tokens;
  await expect(component.locator("#inputTokens")).toContainText(
    expectedTotalInputTokens.toLocaleString(),
  );

  // Check that elements without data are empty
  await expect(component.locator("#workingDir")).toContainText("");
  await expect(component.locator("#initialCommit")).toContainText("");
  await expect(component.locator("#outputTokens")).toContainText("0");
  // totalCost element should not exist when cost is 0
  await expect(component.locator("#totalCost")).toHaveCount(0);
});

test("formatGitHubRepo handles repository names with dots correctly", async ({
  mount,
}) => {
  // Test repository with dots in name
  const component = await mount(SketchContainerStatus, {
    props: {
      state: {
        ...mockCompleteState,
        git_origin: "git@github.com:user/repo.with.dots.git",
        link_to_github: true,
      },
    },
  });

  // Check that the GitHub link is displayed correctly with dots preserved
  const githubLink = component.locator("a.github-link");
  await expect(githubLink).toContainText("user/repo.with.dots");
  await expect(githubLink).toHaveAttribute(
    "href",
    "https://github.com/user/repo.with.dots",
  );
  await expect(githubLink).toHaveAttribute(
    "title",
    "git@github.com:user/repo.with.dots.git",
  );
});

test("formatGitHubRepo handles boldsoftware/sketch.git correctly", async ({
  mount,
}) => {
  // Test the specific case mentioned in the issue
  const component = await mount(SketchContainerStatus, {
    props: {
      state: {
        ...mockCompleteState,
        git_origin: "git@github.com:boldsoftware/sketch.git",
        link_to_github: true,
      },
    },
  });

  // Check that the GitHub link is displayed correctly
  const githubLink = component.locator("a.github-link");
  await expect(githubLink).toContainText("boldsoftware/sketch");
  await expect(githubLink).toHaveAttribute(
    "href",
    "https://github.com/boldsoftware/sketch",
  );
  await expect(githubLink).toHaveAttribute(
    "title",
    "git@github.com:boldsoftware/sketch.git",
  );
});
