import { emitirCobroConsumo } from './consumo-funcionario-cobro';

function tx(cuentas: Array<{ id: string; factura_venta_id: string | null; saldo_pendiente: number }>) {
  return {
    cuentas_cobrar: { findMany: jest.fn().mockResolvedValue(cuentas), update: jest.fn().mockResolvedValue({}) },
    recibos_cobro: { create: jest.fn().mockResolvedValue({ id: 'rec-1' }) },
    recibo_cobro_facturas: { create: jest.fn().mockResolvedValue({}) },
  };
}
const base = {
  empresaId: 'emp-1',
  empleado: { cliente_id: 'cli-1', sucursal_id: 'suc-1' },
  medio: 'DESCUENTO_PLANILLA',
  observacion: 'x',
  fecha: new Date('2026-10-31'),
};
const numero = jest.fn().mockResolvedValue('001-001-0000009');

describe('emitirCobroConsumo', () => {
  it('nunca cobra más que el saldo: si alguien ya cobró parte, aplica lo que queda', async () => {
    const t = tx([{ id: 'cc-1', factura_venta_id: 'f-1', saldo_pendiente: 4_000 }]);
    const r = await emitirCobroConsumo(t as never, numero, { ...base, items: [{ cuentaCobrarId: 'cc-1', monto: 11_000 }] });

    expect(t.cuentas_cobrar.update).toHaveBeenCalledWith(
      expect.objectContaining({ data: expect.objectContaining({ saldo_pendiente: 0, estado: 'cobrada' }) }),
    );
    expect(r).toEqual({ reciboId: 'rec-1', totalCobrado: 4_000 });
  });

  it('sin nada que cobrar no emite recibo', async () => {
    const t = tx([{ id: 'cc-1', factura_venta_id: 'f-1', saldo_pendiente: 0 }]);
    const r = await emitirCobroConsumo(t as never, numero, { ...base, items: [{ cuentaCobrarId: 'cc-1', monto: 11_000 }] });

    expect(r).toBeNull();
    expect(t.recibos_cobro.create).not.toHaveBeenCalled();
  });

  it('imputa solo las cuentas con factura, pero baja el saldo de todas', async () => {
    const t = tx([
      { id: 'cc-1', factura_venta_id: 'f-1', saldo_pendiente: 5_000 },
      { id: 'cc-2', factura_venta_id: null, saldo_pendiente: 3_000 },
    ]);
    await emitirCobroConsumo(t as never, numero, {
      ...base,
      items: [
        { cuentaCobrarId: 'cc-1', monto: 5_000 },
        { cuentaCobrarId: 'cc-2', monto: 3_000 },
      ],
    });

    expect(t.cuentas_cobrar.update).toHaveBeenCalledTimes(2);
    expect(t.recibo_cobro_facturas.create).toHaveBeenCalledTimes(1);
    expect(t.recibos_cobro.create).toHaveBeenCalledWith(
      expect.objectContaining({ data: expect.objectContaining({ monto_total: 8_000 }) }),
    );
  });
});
