import { PrismaClient } from "@prisma/client";
import fs from "fs";
import path from "path";
import { databaseUrl, rootDir } from "./env";

export function resolveDatabaseUrl(): string {
  const raw = databaseUrl();
  if (!raw.startsWith("file:")) return raw;
  let filePath = raw.slice("file:".length);
  const query = filePath.indexOf("?");
  if (query >= 0) filePath = filePath.slice(0, query);
  if (!path.isAbsolute(filePath)) {
    filePath = path.resolve(rootDir, "prisma", filePath);
  }
  return `file:${filePath}`;
}

export function sqliteFilePath(): string {
  const url = resolveDatabaseUrl();
  return url.startsWith("file:") ? url.slice("file:".length) : "";
}

export function ensureDataDir(): void {
  const filePath = sqliteFilePath();
  if (!filePath) return;
  fs.mkdirSync(path.dirname(filePath), { recursive: true });
}

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

export const prisma =
  globalForPrisma.prisma ??
  new PrismaClient({
    datasources: { db: { url: resolveDatabaseUrl() } },
  });

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