import { LiquidacionesService } from './liquidaciones.service';

const EMPRESA = 'emp-1';
const LIQ = { id: 'liq-1', empresa_id: EMPRESA, estado: 'PRE_LIQUIDACION' };

function crear(linea: Record<string, unknown>) {
  const tx = {
    rrhh_liquidaciones_detalle: { delete: jest.fn().mockResolvedValue({}) },
    cuentas_cobrar: { updateMany: jest.fn().mockResolvedValue({ count: 1 }) },
  };
  const prisma = {
    rrhh_liquidaciones_cabecera: { findFirst: jest.fn().mockResolvedValue(LIQ) },
    rrhh_liquidaciones_detalle: { findFirst: jest.fn().mockResolvedValue({ id: 'l-1', empleado_id: 'e-1', ...linea }) },
    $transaction: jest.fn((fn: (t: typeof tx) => unknown) => fn(tx)),
  };
  const audit = { log: jest.fn().mockResolvedValue(undefined) };
  const service = new LiquidacionesService(prisma as never, {} as never, audit as never, {} as never, {} as never);
  jest.spyOn(service as never, 'recomputarTotales' as never).mockResolvedValue(undefined as never);
  return { service, tx, audit };
}

describe('LiquidacionesService.eliminarLineaManual — consumo de funcionarios', () => {
  it('quitar una línea de consumo sin excluir solo la borra (recalcular la vuelve a proponer)', async () => {
    const { service, tx, audit } = crear({ origen: 'CONSUMO_FUNCIONARIO', referencia_origen_id: 'cc-1' });
    const r = await service.eliminarLineaManual('liq-1', 'l-1', EMPRESA);

    expect(tx.rrhh_liquidaciones_detalle.delete).toHaveBeenCalledWith({ where: { id: 'l-1' } });
    expect(tx.cuentas_cobrar.updateMany).not.toHaveBeenCalled();
    expect(audit.log).not.toHaveBeenCalled();
    expect(r).toEqual({ ok: true, factura_excluida: false });
  });

  it('con excluirFactura marca la cuenta por cobrar en la misma transacción y lo audita', async () => {
    const { service, tx, audit } = crear({ origen: 'CONSUMO_FUNCIONARIO', referencia_origen_id: 'cc-1' });
    const r = await service.eliminarLineaManual('liq-1', 'l-1', EMPRESA, { excluirFactura: true, userId: 'u-1' });

    expect(tx.cuentas_cobrar.updateMany).toHaveBeenCalledWith({
      where: { id: 'cc-1', empresa_id: EMPRESA },
      data: expect.objectContaining({ excluir_descuento_planilla: true }),
    });
    expect(audit.log).toHaveBeenCalledWith(
      expect.objectContaining({ entity_type: 'cuentas_cobrar', entity_id: 'cc-1', user_id: 'u-1' }),
    );
    expect(r).toEqual({ ok: true, factura_excluida: true });
  });

  it('en una línea MANUAL ignora excluirFactura: no hay factura que marcar', async () => {
    const { service, tx } = crear({ origen: 'MANUAL', referencia_origen_id: null });
    const r = await service.eliminarLineaManual('liq-1', 'l-1', EMPRESA, { excluirFactura: true });

    expect(tx.rrhh_liquidaciones_detalle.delete).toHaveBeenCalled();
    expect(tx.cuentas_cobrar.updateMany).not.toHaveBeenCalled();
    expect(r.factura_excluida).toBe(false);
  });
});
