"use server";
import bcrypt from "bcryptjs";
import { auth } from "@/auth"; // Import the new `auth()` function
import { prisma } from "@/lib/prisma";
import { SettingsSchemaType } from "@/schemas/settings.schema";

export const settings = async (values: SettingsSchemaType) => {
  const { user } = await auth(); // Use the new `auth()` function to get the current user

  if (!user) {
    return { error: "Unauthorized" };
  }

  const dbUser = await prisma.user.findUnique({
    where: { id: user.id },
  });

  if (!dbUser) {
    return { error: "Unauthorized" };
  }

  if (user.isOAuth) {
    values.email = undefined;
    values.password = undefined;
    values.newPassword = undefined;
    values.isTwoFactorEnabled = undefined;
  }

  if (values.password && values.newPassword && dbUser.password) {
    const passwordsMatch = await bcrypt.compare(
      values.password,
      dbUser.password,
    );

    if (!passwordsMatch) {
      return { error: "Incorrect password!" };
    }

    const hashedPassword = await bcrypt.hash(values.newPassword, 10);
    values.password = hashedPassword;
    values.newPassword = undefined;
  }

  const updatedUser = await prisma.user.update({
    where: { id: dbUser.id },
    data: {
      ...values,
    },
  });

  // Custom session update logic using `auth()`
  const session = await auth();
  if (session && session.user) {
    session.user = {
      ...session.user,
      name: updatedUser.name,
      email: updatedUser.email,
      isTwoFactorEnabled: updatedUser.isTwoFactorEnabled,
      role: updatedUser.role,
    };
  }

  return { success: "Settings Updated!" };
};
