import { afterEach, describe, expect, it } from "vitest";
import { events, orders, paymentSubmissions, tickets, ticketTypes } from "../drizzle/schema";
import { getOrganizerSummary, listPendingPayments, setDbForTests } from "./db";

const ownedEvent = { id: 10, organizerId: 7, title: "Owned event", createdAt: new Date(), startsAt: new Date() };
const ownedOrder = { id: 100, eventId: 10, buyerId: 55, status: "pending", quantity: 1, totalMinor: 1000 };
const ownedPayment = { id: 1000, orderId: 100, status: "pending", createdAt: new Date() };

describe("organizer progress scoping", () => {
  afterEach(() => setDbForTests(null));
  it("builds organizer summaries from organizer-owned events and their orders", async () => {
    const queriedTables: unknown[] = [];
    const db = {
      select() {
        return {
          from(table: unknown) {
            queriedTables.push(table);
            if (table === events) return { where: () => ({ orderBy: async () => [ownedEvent] }) };
            if (table === orders) return { where: async () => [ownedOrder] };
            return { where: async () => [] };
          },
        };
      },
    };
    setDbForTests(db as never);

    await expect(getOrganizerSummary(7)).resolves.toEqual({ events: [ownedEvent], orders: [ownedOrder], guests: [{ orderId: 100, eventId: 10, eventTitle: "Owned event", ticketTypeName: "Ticket", ticketCount: 0, ticketDetails: [], name: undefined, email: undefined, phone: undefined, quantity: 1, totalMinor: 1000, accessType: "paid", transactionId: null, paymentStatus: null, emailStatus: undefined, smsStatus: undefined, createdAt: undefined }] });
    expect(queriedTables).toEqual([events, orders, paymentSubmissions, tickets, ticketTypes]);
  });

  it("loads pending payments only through the organizer event scope", async () => {
    const queriedTables: unknown[] = [];
    const db = {
      select() {
        return {
          from(table: unknown) {
            queriedTables.push(table);
            if (table === events) return { where: () => ({ orderBy: async () => [ownedEvent] }) };
            if (table === orders) return { where: async () => [ownedOrder] };
            return { where: () => ({ orderBy: async () => [ownedPayment] }) };
          },
        };
      },
    };
    setDbForTests(db as never);

    await expect(listPendingPayments(7)).resolves.toEqual([ownedPayment]);
    expect(queriedTables).toEqual([events, orders, paymentSubmissions]);
  });
});
