import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common';
import { PrismaService } from '../../prisma/prisma.service';

@Injectable()
export class CentrosCostoService {
  constructor(private readonly prisma: PrismaService) {}

  async listar(empresaId: string) {
    return this.prisma.cont_centros_costo.findMany({
      where: { empresa_id: empresaId },
      orderBy: { codigo: 'asc' },
    });
  }

  async crear(empresaId: string, data: { codigo: string; descripcion: string }) {
    const existente = await this.prisma.cont_centros_costo.findFirst({
      where: { empresa_id: empresaId, codigo: data.codigo },
    });
    if (existente) throw new BadRequestException(`Ya existe un centro de costo con código ${data.codigo}`);

    return this.prisma.cont_centros_costo.create({
      data: { empresa_id: empresaId, codigo: data.codigo, descripcion: data.descripcion },
    });
  }

  async editar(id: string, empresaId: string, data: Partial<{ descripcion: string; activo: boolean }>) {
    const cc = await this.prisma.cont_centros_costo.findFirst({ where: { id, empresa_id: empresaId } });
    if (!cc) throw new NotFoundException('Centro de costo no encontrado');

    return this.prisma.cont_centros_costo.update({ where: { id }, data: { ...data, updated_at: new Date() } });
  }

  async eliminar(id: string, empresaId: string) {
    const cc = await this.prisma.cont_centros_costo.findFirst({ where: { id, empresa_id: empresaId } });
    if (!cc) throw new NotFoundException('Centro de costo no encontrado');

    const enUso = await this.prisma.cont_asientos_det.findFirst({ where: { centro_costo_id: id } });
    if (enUso) throw new BadRequestException('El centro de costo tiene movimientos y no puede eliminarse');

    return this.prisma.cont_centros_costo.delete({ where: { id } });
  }
}
