// Tests for the live current-run panel: header line, progress over terminal
// region statuses, failed-region error tooltips, and the running stage text.

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

const run: RunHeaderText = {
  runId: "run-20260901T030000",
  trigger: "schedule",
  status: "running",
  startedAt: "2026-09-01T03:00:00Z",
  regions: {
    "aws-us-east-1": { status: "success", stage: "report-model", finishedAt: "2026-09-01T03:04:00Z" },
    "aws-us-west-2": { status: "success", stage: "report-model", finishedAt: "2026-09-01T03:05:00Z" },
    "gcp-us-central1": { status: "running", stage: "pricing" },
    "azure-japaneast": { status: "failed", error: "prometheus query timeout" },
    "alicloud-ap-northeast-1": { status: "pending" },
  },
};

describe("RunHeader", () => {
  it("renders run id, trigger, status and started stamp", () => {
    render(<RunHeader run={run} />);
    expect(screen.getByText("run-20260901T030000")).toBeInTheDocument();
    expect(screen.getByText("schedule")).toBeInTheDocument();
    // run header badge + the running region badge
    expect(screen.getAllByText("running").length).toBe(2);
    expect(screen.getByText("started 2026-09-01 11:00 UTC+8")).toBeInTheDocument();
  });

  it("computes progress over terminal statuses only (success+failed done, pending/running not)", () => {
    expect(runProgress(run)).toEqual({ done: 3, total: 5 });
    render(<RunHeader run={run} />);
    expect(screen.getByText("3/5 regions")).toBeInTheDocument();
    const bar = document.querySelector<HTMLElement>(".h-full.progress-shimmer");
    expect(bar).not.toBeNull();
    expect(bar!).toHaveStyle({ width: "60%" });
  });

  it("surfaces a failed region's error as a tooltip on a bad badge", () => {
    render(<RunHeader run={run} />);
    const badge = screen.getByTitle("prometheus query timeout");
    expect(badge).toHaveTextContent("failed");
    expect(badge).toHaveClass("bg-danger/10");
  });

  it("shows the current stage for running regions only", () => {
    render(<RunHeader run={run} />);
    expect(screen.getByText("pricing")).toBeInTheDocument();
    // the finished region's last stage is not displayed
    expect(screen.queryByText("report-model")).not.toBeInTheDocument();
  });

  it("lists every region in the grid with its status badge", () => {
    render(<RunHeader run={run} />);
    expect(screen.getByText("aws-us-east-1")).toBeInTheDocument();
    expect(screen.getByText("aws-us-west-2")).toBeInTheDocument();
    expect(screen.getByText("gcp-us-central1")).toBeInTheDocument();
    expect(screen.getByText("azure-japaneast")).toBeInTheDocument();
    expect(screen.getByText("alicloud-ap-northeast-1")).toBeInTheDocument();
    expect(screen.getByText("pending")).toHaveClass("bg-text-muted/10");
  });
});
