import { describe, expect, test } from "bun:test";
import { MAX_LIVE_REPORT_RANGE_MS, parseObservabilityReportQuery } from "./query";

const NOW = Date.parse("2026-08-16T12:00:00.000Z");
const now = () => NOW;

function params(value = ""): URLSearchParams {
  return new URLSearchParams(value);
}

describe("parseObservabilityReportQuery", () => {
  test("defaults to the previous 24 hours and a valid local timezone", () => {
    const result = parseObservabilityReportQuery(params(), now);
    expect(result.ok).toBe(true);
    if (!result.ok) return;
    expect(result.query.from).toBe("2026-08-15T12:00:00.000Z");
    expect(result.query.to).toBe("2026-08-16T12:00:00.000Z");
    expect(result.query.timezone.length).toBeGreaterThan(0);
  });

  test("normalizes repeatable filters and omits blank search", () => {
    const result = parseObservabilityReportQuery(params("timezone=UTC&project=overdeck&project=overdeck&project=deck&source=actions&severity=warn&q=++"), now);
    expect(result).toEqual({
      ok: true,
      query: {
        from: "2026-08-15T12:00:00.000Z",
        to: "2026-08-16T12:00:00.000Z",
        timezone: "UTC",
        projects: ["overdeck", "deck"],
        sources: ["actions"],
        severity: "warn",
      },
    });
  });

  test("rejects inverted, excessive, invalid timezone, and unknown-source queries", () => {
    const from = new Date(NOW - MAX_LIVE_REPORT_RANGE_MS - 1).toISOString();
    expect(parseObservabilityReportQuery(params(`from=${encodeURIComponent(new Date(NOW).toISOString())}&to=${encodeURIComponent(new Date(NOW - 1).toISOString())}`), now)).toMatchObject({ ok: false });
    expect(parseObservabilityReportQuery(params(`from=${encodeURIComponent(from)}&to=${encodeURIComponent(new Date(NOW).toISOString())}`), now)).toEqual({ ok: false, error: "Reports are limited to 90 days." });
    expect(parseObservabilityReportQuery(params("timezone=Moon/Base"), now)).toEqual({ ok: false, error: "Report timezone is not recognized." });
    expect(parseObservabilityReportQuery(params(`timezone=${"x".repeat(101)}`), now)).toEqual({ ok: false, error: "Report timezone is not recognized." });
    expect(parseObservabilityReportQuery(params("source=not-registered"), now)).toEqual({ ok: false, error: "Unknown activity source: not-registered" });
  });
});
