import { randomBytes } from "crypto";
import { prisma } from "@linkwarden/prisma";
import transporter from "./transporter";
import Handlebars from "handlebars";
import { readFileSync } from "fs";
import path from "path";

export default async function sendChangeEmailVerificationRequest(
  oldEmail: string,
  newEmail: string,
  user: string
) {
  const token = randomBytes(32).toString("hex");

  await prisma.$transaction(async () => {
    await prisma.verificationToken.create({
      data: {
        identifier: oldEmail?.toLowerCase(),
        token,
        expires: new Date(Date.now() + 24 * 3600 * 1000), // 1 day
      },
    });
    await prisma.user.update({
      where: {
        email: oldEmail?.toLowerCase(),
      },
      data: {
        unverifiedNewEmail: newEmail?.toLowerCase(),
      },
    });
  });

  const emailsDir = path.resolve(process.cwd(), "templates");

  const templateFile = readFileSync(
    path.join(emailsDir, "verifyEmailChange.html"),
    "utf8"
  );

  const emailTemplate = Handlebars.compile(templateFile);

  transporter.sendMail({
    from: {
      name: "Linkwarden",
      address: process.env.EMAIL_FROM as string,
    },
    to: newEmail,
    subject: "Verify your new Linkwarden email address",
    html: emailTemplate({
      user,
      baseUrl: process.env.BASE_URL,
      oldEmail,
      newEmail,
      verifyUrl: `${process.env.BASE_URL}/auth/verify-email?token=${token}`,
    }),
  });
}
