import "../../../tests/web/test-utils";
import { render } from "@testing-library/react";
import { describe, expect, test } from "bun:test";

import type { TargetMetricsResponse, TargetStatus } from "../../../src/shared/api";

import { OverviewTab } from "../../../src/web/components/OverviewTab";

describe("OverviewTab", () => {
  const target: TargetStatus = {
    currentStreak: null,
    description: null,
    group: "default",
    id: "1",
    interval: "30s",
    latestCheck: {
      detail: "200 OK",
      durationMs: 100,
      failure: null,
      matched: true,
      observation: null,
      timestamp: "2025-01-15T10:00:00.000Z",
    },
    name: "test-target",
    recentSamples: [],
    stats: { availability: 100, downChecks: 0, totalChecks: 10, upChecks: 10 },
    target: "https://example.com",
    type: "http",
  };

  const metricsData: TargetMetricsResponse = {
    stats: {
      availability: 95,
      avgDurationMs: 150,
      currentStreak: { count: 5, up: true },
      downChecks: 1,
      incidentCount: 1,
      longestOutage: 60000,
      mttr: 30000,
      p95DurationMs: 200,
      p99DurationMs: 250,
      totalChecks: 20,
      upChecks: 19,
    },
    targetId: "1",
    trend: [],
    window: { bucket: "1h", from: "", to: "" },
  };

  test("有数据不崩溃", () => {
    const { container } = render(<OverviewTab metricsData={metricsData} metricsLoading={false} target={target} />);
    expect(container.firstChild).not.toBeNull();
  });

  test("loading 状态不崩溃", () => {
    const { container } = render(<OverviewTab metricsData={null} metricsLoading={true} target={target} />);
    expect(container.firstChild).not.toBeNull();
  });

  test("无指标数据不崩溃", () => {
    const { container } = render(<OverviewTab metricsData={null} metricsLoading={false} target={target} />);
    expect(container.firstChild).not.toBeNull();
  });

  test("显示趋势图表不崩溃", () => {
    const { container } = render(<OverviewTab metricsData={metricsData} metricsLoading={false} target={target} />);
    expect(container.firstChild).not.toBeNull();
  });
});
