import fs from "fs-extra";
import path from "path";
import { type PackageJson } from "type-fest";
import { PKG_ROOT } from "~/consts.js";
import { type Installer } from "~/installers/index.js";
import { addPackageDependency } from "~/utils/addPackageDependency.js";

export const prismaInstaller: Installer = ({ frontendDir, packages }) => {
  addPackageDependency({
    frontendDir,
    dependencies: ["prisma"],
    devMode: true,
  });
  addPackageDependency({
    frontendDir,
    dependencies: ["@prisma/client"],
    devMode: false,
  });

  const extrasDir = path.join(PKG_ROOT, "template/extras");

  const schemaSrc = path.join(
    extrasDir,
    "prisma/schema",
    packages?.nextAuth.inUse ? "with-auth.prisma" : "base.prisma",
  );
  const schemaDest = path.join(frontendDir, "prisma/schema.prisma");

  const clientSrc = path.join(extrasDir, "src/server/db.ts");
  const clientDest = path.join(frontendDir, "src/server/db.ts");

  // add postinstall script to package.json
  const packageJsonPath = path.join(frontendDir, "package.json");

  const packageJsonContent = fs.readJSONSync(packageJsonPath) as PackageJson;
  packageJsonContent.scripts = {
    ...packageJsonContent.scripts,
    postinstall: "prisma generate",
  };

  fs.copySync(schemaSrc, schemaDest);
  fs.copySync(clientSrc, clientDest);
  fs.writeJSONSync(packageJsonPath, packageJsonContent, {
    spaces: 2,
  });
};
