import { PrismaClient } from "@prisma/client";
import { PrismaMariaDb } from "@prisma/adapter-mariadb";

// The MariaDB driver adapter speaks to both MariaDB (XAMPP) and MySQL 8.
function adapterFromUrl(raw: string | undefined) {
  if (!raw) throw new Error("DATABASE_URL is not set. Copy .env.example to .env and fill it in.");
  const url = new URL(raw);
  return new PrismaMariaDb({
    host: url.hostname,
    port: url.port ? Number(url.port) : 3306,
    user: decodeURIComponent(url.username),
    password: url.password ? decodeURIComponent(url.password) : undefined,
    database: url.pathname.replace(/^\//, ""),
    connectionLimit: Number(process.env.DATABASE_POOL_SIZE ?? 5),
    // MySQL 8 default auth (caching_sha2_password) over non-TLS local connections
    allowPublicKeyRetrieval: url.searchParams.get("allowPublicKeyRetrieval") !== "false",
    ssl: url.searchParams.get("ssl") === "true" ? { rejectUnauthorized: true } : undefined,
  });
}

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

export const db: PrismaClient =
  globalForPrisma.prisma ??
  new PrismaClient({
    adapter: adapterFromUrl(process.env.DATABASE_URL),
    log: process.env.NODE_ENV === "development" ? ["warn", "error"] : ["error"],
  });

if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = db;

export type Tx = Omit<PrismaClient, "$connect" | "$disconnect" | "$on" | "$transaction" | "$extends">;
