// Tests for the run-detail region table: badge tones per status, the shrink
// degraded marker, stage/error rendering, and the duration column derived
// from the entry's stamps.

import { describe, expect, it } from "vitest";
import { render, screen } from "@testing-library/react";
import { RunRegionTable } from "@/components/runs/RunRegionTable";
import type { RunRegionEntry } from "@/lib/api-types";

function entry(over: Partial<RunRegionEntry> = {}): RunRegionEntry {
  return {
    regionKey: "aws-us-east-1",
    status: "success",
    stage: "report-model",
    startedAt: "2026-09-05T08:00:10.000+08:00",
    finishedAt: "2026-09-05T08:03:10.000+08:00",
    ...over,
  };
}

describe("RunRegionTable", () => {
  it("renders status badges with their tones and the persisted error text", () => {
    render(
      <RunRegionTable
        entries={[
          entry(),
          entry({
            regionKey: "gcp-asia-east1",
            status: "failed",
            stage: "shrink",
            error: "query_range timeout after 120s: quantile_over_time(...",
          }),
        ]}
      />,
    );
    expect(screen.getByText("success")).toHaveClass("bg-success/10");
    expect(screen.getByText("failed")).toHaveClass("bg-danger/10");
    expect(screen.getByText(/timeout after 120s/)).toBeInTheDocument();
    // One region shows an em-dash instead of an error cell.
    expect(screen.getAllByText("—").length).toBeGreaterThanOrEqual(1);
  });

  it("marks shrink-degraded regions without failing the run", () => {
    render(
      <RunRegionTable entries={[entry({ degradedStages: ["shrink"] })]} />,
    );
    expect(screen.getByText("shrink degraded")).toHaveClass("bg-warning/10");
  });

  it("omits the degraded marker when the field is absent (legacy entries)", () => {
    render(<RunRegionTable entries={[entry()]} />);
    expect(screen.queryByText("shrink degraded")).not.toBeInTheDocument();
  });

  it("derives duration from the entry stamps and shows — when either is missing", () => {
    render(
      <RunRegionTable
        entries={[
          entry(), // 08:00:10 -> 08:03:10 = 180s
          entry({ regionKey: "gcp-asia-east1", startedAt: undefined }),
        ]}
      />,
    );
    expect(screen.getByText("180.0s")).toBeInTheDocument();
    // The entry without startedAt has no duration, only finish + error dashes.
    expect(screen.getAllByText("—").length).toBeGreaterThanOrEqual(2);
  });

  it("renders an empty state for a run with no region entries", () => {
    render(<RunRegionTable entries={[]} />);
    expect(screen.getByText(/no regions recorded/i)).toBeInTheDocument();
  });
});
