import { prisma } from '@/lib/prisma';
import { hashPassword } from '@/lib/password';
import { sanitizeEmail, sanitizeText } from '@/lib/sanitize';
import type { CreateUserInput, UpdateUserInput } from '@/schemas/user.schema';

export async function listUsers(page = 1, limit = 20) {
  const skip = (page - 1) * limit;
  const [users, total] = await prisma.$transaction([
    prisma.user.findMany({
      skip,
      take: limit,
      select: { id: true, email: true, name: true, role: true, isActive: true, createdAt: true },
      orderBy: { createdAt: 'desc' },
    }),
    prisma.user.count(),
  ]);
  return { users, total, page, limit };
}

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

export async function createUser(data: CreateUserInput) {
  const cleanEmail = sanitizeEmail(data.email);
  if (!cleanEmail) throw new Error('EMAIL_INVALID');

  const passwordHash = await hashPassword(data.password);

  return prisma.user.create({
    data: {
      email: cleanEmail,
      name: sanitizeText(data.name),
      passwordHash,
      role: data.role,
      isActive: true,
    },
    select: { id: true, email: true, name: true, role: true, isActive: true, createdAt: true },
  });
}

export async function updateUser(id: string, data: UpdateUserInput) {
  return prisma.user.update({
    where: { id },
    data: {
      ...(data.name ? { name: sanitizeText(data.name) } : {}),
      ...(data.role ? { role: data.role } : {}),
      ...(data.isActive !== undefined ? { isActive: data.isActive } : {}),
    },
    select: { id: true, email: true, name: true, role: true, isActive: true, updatedAt: true },
  });
}

export async function deleteUser(id: string) {
  // Soft delete: desactivar en lugar de eliminar para mantener integridad referencial
  return prisma.user.update({
    where: { id },
    data: { isActive: false },
    select: { id: true, email: true, isActive: true },
  });
}
