import { prisma } from '@/lib/prisma';
import { Prisma } from '@/generated/prisma/client';

/**
 * Repository para acceso a datos de Categorías
 */
export class CategoryRepository {
  /**
   * Buscar todas las categorías
   */
  async findMany() {
    return prisma.category.findMany({
      include: {
        _count: {
          select: { documents: true },
        },
      },
      orderBy: { name: 'asc' },
    });
  }

  /**
   * Buscar una categoría por ID
   */
  async findById(id: string) {
    return prisma.category.findUnique({
      where: { id },
      include: {
        _count: {
          select: { documents: true },
        },
      },
    });
  }

  /**
   * Buscar una categoría por nombre
   */
  async findByName(name: string) {
    return prisma.category.findUnique({
      where: { name },
    });
  }

  /**
   * Crear una nueva categoría
   */
  async create(data: Prisma.CategoryCreateInput) {
    return prisma.category.create({
      data,
      include: {
        _count: {
          select: { documents: true },
        },
      },
    });
  }

  /**
   * Actualizar una categoría
   */
  async update(id: string, data: Prisma.CategoryUpdateInput) {
    return prisma.category.update({
      where: { id },
      data,
    });
  }

  /**
   * Eliminar una categoría
   */
  async delete(id: string) {
    return prisma.category.delete({
      where: { id },
    });
  }

  /**
   * Verificar si una categoría existe
   */
  async exists(id: string) {
    const category = await prisma.category.findUnique({
      where: { id },
      select: { id: true },
    });
    return category !== null;
  }

  /**
   * Contar documentos de una categoría
   */
  async countDocuments(id: string) {
    const category = await prisma.category.findUnique({
      where: { id },
      include: {
        _count: {
          select: { documents: true },
        },
      },
    });
    return category?._count.documents ?? 0;
  }
}

export const categoryRepository = new CategoryRepository();
