import { PedidosService } from '../pedidos.service';

/**
 * Las estadísticas de órdenes de venta (KPIs y conteos por estado) tienen que
 * usar los mismos filtros que la lista: si no, al filtrar por vendedor la lista
 * mostraba sus órdenes y las tarjetas seguían sumando las de todos.
 */
describe('PedidosService.statsOrdenes', () => {
  const crear = () => {
    const prisma: any = {
      pedidos: {
        count: jest.fn().mockResolvedValue(0),
        aggregate: jest.fn().mockResolvedValue({ _sum: { total: 0 } }),
      },
    };
    const service = Object.create(PedidosService.prototype) as any;
    service.prisma = prisma;
    return { service, prisma };
  };

  it('aplica vendedor, cliente y sucursal a todos los conteos y al monto', async () => {
    const { service, prisma } = crear();

    await service.statsOrdenes(
      { vendedor_id: 'ven-1', cliente_id: 'cli-1', sucursal_id: 'suc-1', fecha_desde: '2026-09-01' },
      'emp-1',
    );

    const wheres = [
      ...prisma.pedidos.count.mock.calls.map((c: any) => c[0].where),
      ...prisma.pedidos.aggregate.mock.calls.map((c: any) => c[0].where),
    ];
    expect(wheres.length).toBeGreaterThan(0);
    for (const w of wheres) {
      expect(w).toEqual(expect.objectContaining({
        empresa_id: 'emp-1', vendedor_id: 'ven-1', cliente_id: 'cli-1', sucursal_id: 'suc-1',
      }));
    }
  });

  it('sin filtros no agrega condiciones de vendedor, cliente ni sucursal', async () => {
    const { service, prisma } = crear();

    await service.statsOrdenes({}, 'emp-1');

    const w = prisma.pedidos.count.mock.calls[0][0].where;
    expect(w.vendedor_id).toBeUndefined();
    expect(w.cliente_id).toBeUndefined();
    expect(w.sucursal_id).toBeUndefined();
  });
});
