import { describe, expect, it } from "vitest";
import { events, ticketTypes } from "../drizzle/schema";
import { createEventWithTicket, setDbForTests } from "./db";
import { appRouter } from "./routers";
import type { TrpcContext } from "./_core/context";

function makeDb() {
  const inserted: Array<{ table: unknown; values: any }> = [];
  const db = {
    select() {
      return { from() { return { where() { return { limit: async () => [{ id: 1, slug: "gen-z-awakening" }] }; } }; } };
    },
    insert(table: unknown) {
      return { values: async (values: any) => { inserted.push({ table, values }); return [{ insertId: table === events ? 90 : 0 }]; } };
    },
  };
  return { db, inserted };
}

const user = { id: 1, openId: "organizer", role: "user" as const, name: "Organizer", email: "organizer@example.com", loginMethod: "manus", createdAt: new Date(), updatedAt: new Date(), lastSignedIn: new Date() };
function context(): TrpcContext { return { user, req: {} as TrpcContext["req"], res: {} as TrpcContext["res"] }; }

describe("event creation", () => {
  it("publishes an uploaded-banner event with a unique slug", async () => {
    const { db, inserted } = makeDb();
    setDbForTests(db as never);
    await createEventWithTicket({ organizerId: 1, title: "GEN Z AWAKENING", slug: "gen-z-awakening", description: "OPEN ENTRY", category: "Music", location: "G+ NIGHTCLUB", startsAt: new Date("2026-08-29T23:00:00Z"), bannerUrl: "/manus-storage/event-banners/1/banner.jpg", status: "published" }, { name: "General admission", priceMinor: 0, quantityLimit: 100 });
    const eventInsert = inserted.find((entry) => entry.table === events)?.values;
    const ticketInsert = inserted.find((entry) => entry.table === ticketTypes)?.values;
    expect(eventInsert.bannerUrl).toBe("/manus-storage/event-banners/1/banner.jpg");
    expect(eventInsert.slug).toMatch(/^gen-z-awakening-/);
    expect(ticketInsert[0].eventId).toBe(90);
  });

  it("accepts the previously failing payload through the authenticated create procedure", async () => {
    const { db, inserted } = makeDb();
    setDbForTests(db as never);
    const caller = appRouter.createCaller(context());
    await expect(caller.events.create({ title: "GEN Z AWAKENING", slug: "gen-z-awakening", description: "OPEN ENTRY", category: "Music", location: "G+ NIGHTCLUB", startsAt: new Date("2026-08-29T23:00:00Z"), bannerUrl: "/manus-storage/event-banners/1/1786679845324-g-nightclub_309b276a.jpg", status: "published", ticketName: "General admission", priceMinor: 0, quantityLimit: 100 })).resolves.toBe(90);
    const eventInsert = inserted.find((entry) => entry.table === events)?.values;
    expect(eventInsert.bannerUrl).toContain("/manus-storage/event-banners/1/");
    expect(eventInsert.slug).toMatch(/^gen-z-awakening-/);
  });
});
