// RegionsTable: region links into Insight, the renamed risk columns carry
// their definitions as tooltips, and sorting still works on them. Fabricated
// RegionOverviewRow fixtures.

import { describe, expect, it, vi } from "vitest";
import { fireEvent, render, screen } from "@testing-library/react";
import { RegionsTable } from "@/components/regions/RegionsTable";
import { mkOverviewRow } from "../helpers/mk-overview-row";

// next/link requires app-router context; render it as a plain anchor.
vi.mock("next/link", () => ({
  default: ({
    href,
    children,
  }: {
    href: string;
    children: React.ReactNode;
  }) => (
    <a href={href}>{children}</a>
  ),
}));

const rows = [
  mkOverviewRow("aws-us-west-2", { idleCount: 1, reverseAdjustmentCount: 2 }),
  mkOverviewRow("aws-eu-central-1"),
  mkOverviewRow("gcp-asia-east1", { vendor: "gcp", pricingMissing: true }),
];

function renderTable(regions = rows) {
  return render(<RegionsTable regions={regions} />);
}

describe("RegionsTable", () => {
  it("region names link into the Insight page", () => {
    renderTable();
    expect(screen.getByText("gcp-asia-east1").closest("a")?.getAttribute("href")).toBe(
      "/insight/gcp-asia-east1",
    );
  });

  it("renamed risk columns carry their definitions as title tooltips", () => {
    renderTable();
    expect(screen.getByTitle(/below 5% of their request/).textContent).toBe("Idle workloads");
    expect(screen.getByTitle(/requests should be raised/).textContent).toBe("Raise req");
  });

  it("sorting by the idle column reorders rows", () => {
    const { container } = renderTable([
      mkOverviewRow("a-low", { idleCount: 0 }),
      mkOverviewRow("z-high", { idleCount: 9 }),
    ]);
    const body = () => [...container.querySelectorAll("tbody tr")].map((tr) => tr.textContent ?? "");
    expect(body()[0]).toContain("a-low"); // equal cost: stable order keeps insertion
    fireEvent.click(screen.getByTitle(/below 5% of their request/));
    expect(body()[0]).toContain("z-high"); // numeric first click: desc
    fireEvent.click(screen.getByTitle(/below 5% of their request/));
    expect(body()[0]).toContain("a-low"); // second click: asc
  });

  it("pricing badges carry tone classes", () => {
    renderTable();
    expect(screen.getByText("missing")).toHaveClass("bg-warning/10");
    const okBadges = screen.getAllByText("ok");
    expect(okBadges.length).toBe(2);
    expect(okBadges[0]).toHaveClass("bg-success/10");
  });
});
