import { describe, expect, it } from "vitest";
import { appRouter } from "./routers";
import type { TrpcContext } from "./_core/context";

function context(user: TrpcContext["user"]): TrpcContext {
  return { user, req: {} as TrpcContext["req"], res: {} as TrpcContext["res"] };
}

describe("gngtickets event procedures", () => {
  it("returns a safe empty list when event storage is unavailable", async () => {
    const caller = appRouter.createCaller(context(null));
    const result = await caller.events.list();
    expect(Array.isArray(result)).toBe(true);
  });

  it("requires an authenticated organizer to upload an event banner", async () => {
    const caller = appRouter.createCaller(context(null));
    await expect(caller.events.uploadBanner({
      fileName: "banner.png",
      contentType: "image/png",
      data: "data:image/png;base64,aGVsbG8=",
    })).rejects.toMatchObject({ code: "UNAUTHORIZED" });
  });

  it("rejects unsupported banner content types before storage", async () => {
    const caller = appRouter.createCaller(context({ id: 7, openId: "organizer", role: "user", name: "Organizer", email: "organizer@example.com", loginMethod: "manus", createdAt: new Date(), updatedAt: new Date(), lastSignedIn: new Date() }));
    await expect(caller.events.uploadBanner({
      fileName: "banner.txt",
      // @ts-expect-error intentionally invalid input for runtime schema coverage
      contentType: "text/plain",
      data: "aGVsbG8=",
    })).rejects.toMatchObject({ code: "BAD_REQUEST" });
  });

  it("requires an authenticated organizer to create an event", async () => {
    const caller = appRouter.createCaller(context(null));
    await expect(caller.events.create({
      title: "Test Event",
      slug: "test-event",
      category: "Community",
      location: "Accra",
      startsAt: new Date("2026-09-18T09:00:00Z"),
      status: "draft",
    })).rejects.toMatchObject({ code: "UNAUTHORIZED" });
  });
});
