import { PrismaClient } from "@prisma/client";

const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined;
};

function createClient(): PrismaClient {
  return new PrismaClient();
}

export const prisma = new Proxy({} as PrismaClient, {
  get(_target, prop) {
    if (!globalForPrisma.prisma) {
      globalForPrisma.prisma = createClient();
    }

    let client = globalForPrisma.prisma as unknown as Record<string, unknown>;

    // Se um modelo (ex: 'tag') não existir na instância armazenada em cache no dev server (devido a HMR do Next.js),
    // reinstancia o PrismaClient com os novos modelos gerados.
    if (
      typeof prop === "string" &&
      !prop.startsWith("$") &&
      !prop.startsWith("_") &&
      !(prop in client)
    ) {
      globalForPrisma.prisma = createClient();
      client = globalForPrisma.prisma as unknown as Record<string, unknown>;
    }

    const value = client[prop as string];
    if (typeof value === "function") {
      return value.bind(client);
    }
    return value;
  },
});

if (process.env.NODE_ENV !== "production" && !globalForPrisma.prisma) {
  globalForPrisma.prisma = createClient();
}
