import { describe, expect, test } from "bun:test";

import {
  validateDashboardWindow,
  validateMetricsBucket,
  validatePagination,
  validateRecentLimit,
  validateTargetId,
  validateTimeRange,
} from "../../src/server/middleware";

describe("validateTargetId", () => {
  test("有效的 target ID 返回字符串", () => {
    const result = validateTargetId("api-health_01", "production");
    expect(result).not.toHaveProperty("status");
    expect((result as { id: string }).id).toBe("api-health_01");
  });

  test("无效的 target ID 返回 400", () => {
    const invalid = ["-1", "_abc", "has space", "1.5", ""];

    for (const id of invalid) {
      const result = validateTargetId(id, "production");
      expect(result).toHaveProperty("status", 400);
    }
  });
});

describe("validateTimeRange", () => {
  test("有效的 from/to 返回 ISO 字符串", () => {
    const result = validateTimeRange("2024-01-01T00:00:00.000Z", "2024-01-02T00:00:00.000Z", "production");
    expect(result).not.toHaveProperty("status");
    expect((result as { from: string; to: string }).from).toBe("2024-01-01T00:00:00.000Z");
    expect((result as { from: string; to: string }).to).toBe("2024-01-02T00:00:00.000Z");
  });

  test("缺失 from 或 to 返回 400", () => {
    const missingFrom = validateTimeRange(null, "2024-01-02T00:00:00.000Z", "production");
    const missingTo = validateTimeRange("2024-01-01T00:00:00.000Z", null, "production");
    const missingBoth = validateTimeRange(null, null, "production");

    expect(missingFrom).toHaveProperty("status", 400);
    expect(missingTo).toHaveProperty("status", 400);
    expect(missingBoth).toHaveProperty("status", 400);
  });

  test("空字符串 from 或 to 返回 400", () => {
    const emptyFrom = validateTimeRange("", "2024-01-02T00:00:00.000Z", "production");
    const emptyTo = validateTimeRange("2024-01-01T00:00:00.000Z", "", "production");

    expect(emptyFrom).toHaveProperty("status", 400);
    expect(emptyTo).toHaveProperty("status", 400);
  });

  test("无效的日期格式返回 400", () => {
    const result = validateTimeRange("invalid-date", "2024-01-02T00:00:00.000Z", "production");
    expect(result).toHaveProperty("status", 400);
  });

  test("from 晚于 to 返回 400", () => {
    const result = validateTimeRange("2024-01-02T00:00:00.000Z", "2024-01-01T00:00:00.000Z", "production");
    expect(result).toHaveProperty("status", 400);
  });
});

describe("validatePagination", () => {
  test("默认值：page=1, pageSize=20", () => {
    const result = validatePagination(null, null, "production");
    expect(result).toEqual({ page: 1, pageSize: 20 });
  });

  test("有效的 page 和 pageSize 参数", () => {
    const result = validatePagination("2", "50", "production");
    expect(result).toEqual({ page: 2, pageSize: 50 });
  });

  test("无效的 page 参数返回 400", () => {
    const invalidPage = ["0", "-1", "abc", "1.5"];

    for (const page of invalidPage) {
      const result = validatePagination(page, "20", "production");
      expect(result).toHaveProperty("status", 400);
    }
  });

  test("无效的 pageSize 参数返回 400", () => {
    const invalidPageSize = ["0", "-1", "abc", "1.5"];

    for (const pageSize of invalidPageSize) {
      const result = validatePagination("1", pageSize, "production");
      expect(result).toHaveProperty("status", 400);
    }
  });

  test("pageSize 超过上限返回 400", () => {
    const result = validatePagination("1", "201", "production");
    expect(result).toHaveProperty("status", 400);
  });

  test("pageSize 等于上限 200 返回成功", () => {
    const result = validatePagination("1", "200", "production");
    expect(result).toEqual({ page: 1, pageSize: 200 });
  });
});

describe("validateRecentLimit", () => {
  test("默认值：recentLimit=30", () => {
    const result = validateRecentLimit(null, "production");
    expect(result).toEqual({ recentLimit: 30 });
  });

  test("有效的 recentLimit 参数", () => {
    const result = validateRecentLimit("50", "production");
    expect(result).toEqual({ recentLimit: 50 });
  });

  test("无效的 recentLimit 参数返回 400", () => {
    const invalid = ["0", "-1", "abc", "1.5"];

    for (const limit of invalid) {
      const result = validateRecentLimit(limit, "production");
      expect(result).toHaveProperty("status", 400);
    }
  });

  test("recentLimit 超过上限返回 400", () => {
    const result = validateRecentLimit("201", "production");
    expect(result).toHaveProperty("status", 400);
  });

  test("recentLimit 等于上限 200 返回成功", () => {
    const result = validateRecentLimit("200", "production");
    expect(result).toEqual({ recentLimit: 200 });
  });
});

describe("validateDashboardWindow", () => {
  test("默认值：window=24h", () => {
    const result = validateDashboardWindow(null, "production");
    expect(result).not.toHaveProperty("status");
    expect((result as { label: string }).label).toBe("24h");
  });

  test("window=24h 返回成功", () => {
    const result = validateDashboardWindow("24h", "production");
    expect(result).not.toHaveProperty("status");
    expect((result as { label: string }).label).toBe("24h");
  });

  test("不支持的 window 参数返回 400", () => {
    const result = validateDashboardWindow("7d", "production");
    expect(result).toHaveProperty("status", 400);
  });
});

describe("validateMetricsBucket", () => {
  test("默认值：bucket=1h", () => {
    const result = validateMetricsBucket(null, "production");
    expect(result).toEqual({ bucket: "1h" });
  });

  test("bucket=1h 返回成功", () => {
    const result = validateMetricsBucket("1h", "production");
    expect(result).toEqual({ bucket: "1h" });
  });

  test("不支持的 bucket 参数返回 400", () => {
    const result = validateMetricsBucket("5m", "production");
    expect(result).toHaveProperty("status", 400);
  });
});
