import { FacturasService } from './facturas.service';
import { correrConRubro } from 'src/utils/rubro-context';

/**
 * Detalle del reporte de ventas por producto: "cuánto de X le vendimos a Y y en
 * qué facturas". Tiene que compartir el criterio de ventas válidas y el alcance
 * del agregado, y devolver una fila por línea con el número de factura armado.
 */
describe('FacturasService.getReporteProductosDetalle', () => {
  const crear = () => {
    const prisma: any = {
      usuario: { findUnique: jest.fn().mockResolvedValue({ is_superadmin: true }) },
      empresas: { findUnique: jest.fn().mockResolvedValue({ type: 'subsidiary' }) },
      rubros: { findFirst: jest.fn().mockResolvedValue(null) },
      asignacion_sucursal_caja_usuario: { findMany: jest.fn().mockResolvedValue([]) },
      empresas_sucursales: { findMany: jest.fn().mockResolvedValue([]) },
      factura_det: {
        count: jest.fn().mockResolvedValue(1),
        aggregate: jest.fn().mockResolvedValue({ _sum: { dcantproser: 100, dtotopeitem: 2500000 } }),
        findMany: jest.fn().mockResolvedValue([
          {
            id: 'det-1',
            producto_id: 'prod-1',
            ddesproser: 'JAMONADA EXPRESS',
            cunimed: '83',
            dcantproser: 100,
            duniproser: 25000,
            dtotopeitem: 2500000,
            productos: { descripcion: 'JAMONADA EXPRESS', cod_producto: 'JAM-01' },
            factura_cab: {
              id: 'fac-1',
              dfeemide: new Date('2026-09-10T00:00:00Z'),
              dest: '001',
              dpunexp: '001',
              dnumdoc: '0002405',
              estado: 'Aprobado',
              estado_sifen: 'Aprobado',
              cliente_id: 'cli-1',
              moneda: { codigo: 'PYG' },
              clientes: { personas: { razon_social: 'MT ALIMENTOS', ruc: '80012345', dv: 7, nro_documento: null } },
            },
          },
        ]),
      },
    };
    const service = Object.create(FacturasService.prototype) as any;
    service.prisma = prisma;
    return { service, prisma };
  };

  it('filtra por producto y cliente con el criterio de ventas válidas y arma la fila', async () => {
    const { service, prisma } = crear();
    const r = await service.getReporteProductosDetalle(
      'emp-1',
      { producto_id: 'prod-1', cliente_id: 'cli-1', fecha_desde: '2026-09-01', fecha_hasta: '2026-09-30', page: 1, limit: 50 },
      'usr-1',
    );

    const where = prisma.factura_det.findMany.mock.calls[0][0].where;
    expect(where.productos).toEqual({ id: 'prod-1' });
    expect(where.factura_cab).toMatchObject({ empresa_id: 'emp-1', cliente_id: 'cli-1' });
    expect(where.factura_cab.estado.notIn).toContain('Anulado');
    expect(where.factura_cab.dfeemide.gte).toBeInstanceOf(Date);
    expect(prisma.factura_det.count).toHaveBeenCalledWith({ where });
    expect(prisma.factura_det.findMany.mock.calls[0][0]).toMatchObject({ skip: 0, take: 50 });

    expect(r.total).toBe(1);
    expect(r.totales).toEqual({ cantidad: 100, importe: 2500000 });
    expect(r.items[0]).toMatchObject({
      factura_id: 'fac-1',
      numero: '001-001-0002405',
      cliente: 'MT ALIMENTOS',
      cliente_ruc: '80012345-7',
      producto: 'JAMONADA EXPRESS',
      cod_producto: 'JAM-01',
      cantidad: 100,
      precio_unitario: 25000,
      total: 2500000,
      moneda: 'PYG',
    });
  });

  it('el rubro elegido en el selector recorta las líneas por producto', async () => {
    const { service, prisma } = crear();
    prisma.rubros.findFirst.mockResolvedValue({ id: 'rubro-1' });
    await correrConRubro('rubro-1', () => service.getReporteProductosDetalle('emp-1', { rubro_id: 'rubro-1' }, 'usr-1'));
    const where = prisma.factura_det.findMany.mock.calls[0][0].where;
    expect(JSON.stringify(where.productos)).toContain('rubro-1');
  });
});
