/**
 * Tests for cooldown-history shape — status-derivation + pagination cursor.
 */
import { describe, expect, it } from "vitest";

type CooldownRow = {
  id: string;
  reason: string | null;
  cooldownStartedAt: Date;
  cooldownEndsAt: Date;
  resolvedAt: Date | null;
  cancelledAt: Date | null;
};

// Inline-replication of the endpoint's status-derivation logic — keeps test
// fast and independent of full nitro-event-handler boot.
function deriveStatus(r: CooldownRow): "active" | "resolved" | "cancelled" {
  if (r.cancelledAt) return "cancelled";
  if (r.resolvedAt || r.cooldownEndsAt <= new Date()) return "resolved";
  return "active";
}

describe("cooldown-history status derivation", () => {
  it("returns 'cancelled' if cancelledAt is set", () => {
    expect(
      deriveStatus({
        id: "1",
        reason: null,
        cooldownStartedAt: new Date("2026-04-01"),
        cooldownEndsAt: new Date("2026-04-02"),
        resolvedAt: null,
        cancelledAt: new Date("2026-04-01T12:00"),
      }),
    ).toBe("cancelled");
  });

  it("returns 'resolved' if resolvedAt is set", () => {
    expect(
      deriveStatus({
        id: "1",
        reason: null,
        cooldownStartedAt: new Date("2026-04-01"),
        cooldownEndsAt: new Date("2026-04-02"),
        resolvedAt: new Date("2026-04-02"),
        cancelledAt: null,
      }),
    ).toBe("resolved");
  });

  it("returns 'resolved' if cooldownEndsAt is in the past (auto-resolved)", () => {
    expect(
      deriveStatus({
        id: "1",
        reason: null,
        cooldownStartedAt: new Date("2026-01-01"),
        cooldownEndsAt: new Date("2026-01-02"),
        resolvedAt: null,
        cancelledAt: null,
      }),
    ).toBe("resolved");
  });

  it("returns 'active' if cooldownEndsAt is in the future + nothing set", () => {
    const future = new Date(Date.now() + 24 * 60 * 60 * 1000);
    expect(
      deriveStatus({
        id: "1",
        reason: null,
        cooldownStartedAt: new Date(),
        cooldownEndsAt: future,
        resolvedAt: null,
        cancelledAt: null,
      }),
    ).toBe("active");
  });
});

describe("cooldown-history pagination math", () => {
  it("computes durationMinutes correctly", () => {
    const start = new Date("2026-04-01T10:00:00Z");
    const end = new Date("2026-04-01T22:00:00Z");
    const minutes = Math.round((end.getTime() - start.getTime()) / 60_000);
    expect(minutes).toBe(720); // 12h
  });

  it("clamps limit to MAX_LIMIT=50", () => {
    const requested = 9999;
    const limit = Math.min(50, Math.max(1, requested));
    expect(limit).toBe(50);
  });

  it("falls back to default 20 when limit is missing/invalid", () => {
    const limit = Math.min(50, Math.max(1, parseInt("" as string, 10) || 20));
    expect(limit).toBe(20);
  });
});
