import prisma from '../lib/prisma';
import bcrypt from 'bcryptjs';

export async function validateCredentials(email: string, password: string) {
  const user = await prisma.user.findUnique({ where: { email } });
  if (!user || !user.password) return null;
  const valid = await bcrypt.compare(password, user.password);
  if (!valid) return null;
  return user;
}

export async function findUserById(id: number) {
  return prisma.user.findUnique({
    where: { id },
    select: { id: true, email: true, name: true, role: true, createdAt: true, updatedAt: true }
  });
}

export async function updateUserProfile(userId: number, data: any) {
  const { name, email, currentPassword, newPassword } = data;
  const user = await prisma.user.findUnique({ where: { id: userId } });
  if (!user) {
    const err: any = new Error('Usuario no encontrado');
    err.statusCode = 404;
    throw err;
  }

  if (newPassword) {
    if (!currentPassword) {
      const err: any = new Error('Debes proporcionar la contraseña actual');
      err.statusCode = 400;
      throw err;
    }
    const valid = await bcrypt.compare(currentPassword, user.password!);
    if (!valid) {
      const err: any = new Error('Contraseña actual incorrecta');
      err.statusCode = 401;
      throw err;
    }
  }

  if (email && email !== user.email) {
    const existing = await prisma.user.findUnique({ where: { email } });
    if (existing) {
      const err: any = new Error('El correo electrónico ya está en uso');
      err.statusCode = 400;
      throw err;
    }
  }

  const updateData: any = {};
  if (name) updateData.name = name;
  if (email) updateData.email = email;
  if (newPassword) updateData.password = await bcrypt.hash(newPassword, 10);

  return prisma.user.update({
    where: { id: userId },
    data: updateData,
    select: { id: true, email: true, name: true, role: true, createdAt: true, updatedAt: true }
  });
}
