import { describe, expect, it } from "vitest";
import { eventKindToUrl, type RoutableEvent } from "./event-routing";

// A minimal event factory keeps the assertions short and keeps the
// focus on what the helper actually inspects (kind + the relevant
// entity-id field for that kind).
function evt(overrides: Partial<RoutableEvent> & { kind: RoutableEvent["kind"] }): RoutableEvent {
  return {
    claimId: null,
    remittanceId: null,
    npi: undefined,
    ...overrides,
  };
}

describe("eventKindToUrl", () => {
  // ----- claim_* → /claims?claim=ID -------------------------------
  it("routes claim_submitted to /claims?claim=ID", () => {
    expect(
      eventKindToUrl(evt({ kind: "claim_submitted", claimId: "CLM-1" })),
    ).toBe("/claims?claim=CLM-1");
  });

  it("routes claim_paid to /claims?claim=ID", () => {
    expect(
      eventKindToUrl(evt({ kind: "claim_paid", claimId: "CLM-2" })),
    ).toBe("/claims?claim=CLM-2");
  });

  it("routes claim_denied to /claims?claim=ID", () => {
    expect(
      eventKindToUrl(evt({ kind: "claim_denied", claimId: "CLM-3" })),
    ).toBe("/claims?claim=CLM-3");
  });

  it("routes claim_accepted to /claims?claim=ID", () => {
    expect(
      eventKindToUrl(evt({ kind: "claim_accepted", claimId: "CLM-4" })),
    ).toBe("/claims?claim=CLM-4");
  });

  it("percent-encodes the claim id when it contains special chars", () => {
    expect(
      eventKindToUrl(evt({ kind: "claim_paid", claimId: "CLM/1+2" })),
    ).toBe("/claims?claim=CLM%2F1%2B2");
  });

  it("returns null for claim_* when claimId is missing", () => {
    expect(
      eventKindToUrl(evt({ kind: "claim_paid", claimId: null })),
    ).toBeNull();
    expect(
      eventKindToUrl(evt({ kind: "claim_paid", claimId: undefined })),
    ).toBeNull();
  });

  // ----- remit_received → null (Phase 4) --------------------------
  it("returns null for remit_received (Phase 4 drawer not built yet)", () => {
    expect(
      eventKindToUrl(evt({ kind: "remit_received", remittanceId: "REM-1" })),
    ).toBeNull();
  });

  // ----- provider_added → /providers?provider=NPI -----------------
  it("routes provider_added to /providers?provider=NPI", () => {
    expect(
      eventKindToUrl(evt({ kind: "provider_added", npi: "1730187395" })),
    ).toBe("/providers?provider=1730187395");
  });

  it("returns null for provider_added when npi is missing", () => {
    expect(eventKindToUrl(evt({ kind: "provider_added", npi: undefined }))).toBeNull();
  });

  // ----- default branch ------------------------------------------
  it("returns null for unhandled kinds (manual_match)", () => {
    expect(eventKindToUrl(evt({ kind: "manual_match" }))).toBeNull();
  });

  it("returns null for unknown kinds (defensive default)", () => {
    // Cast through unknown so the type-checker doesn't widen the
    // literal away from the exhaustive union.
    const unknown = { kind: "future_kind" } as unknown as RoutableEvent;
    expect(eventKindToUrl(unknown)).toBeNull();
  });
});
