import { ViajeDocumentosService } from '../viaje-documentos.service';

describe('ViajeDocumentosService — alcance y ventana de fechas', () => {
  const armar = () => {
    const prisma: any = {
      // Usuario NO superadmin, asignado a una sucursal: hay alcance real.
      usuario: { findUnique: jest.fn().mockResolvedValue({ is_superadmin: false }) },
      empresas: { findUnique: jest.fn().mockResolvedValue({ type: 'subsidiary' }) },
      rubros: { findFirst: jest.fn().mockResolvedValue(null) },
      asignacion_sucursal_caja_usuario: {
        findMany: jest.fn().mockResolvedValue([{ sucursal_id: 'suc-1' }]),
      },
      empresas_sucursales: {
        findMany: jest.fn().mockResolvedValue([{ id: 'suc-1', punto_establecimiento: '001' }]),
      },
      depositos: { findMany: jest.fn().mockResolvedValue([{ id: 'dep-1' }]) },
      viaje_documentos: { findMany: jest.fn().mockResolvedValue([]), findFirst: jest.fn().mockResolvedValue(null), createMany: jest.fn() },
      factura_cab: { findMany: jest.fn().mockResolvedValue([]), findFirst: jest.fn().mockResolvedValue(null) },
      nota_remision_cab: { findMany: jest.fn().mockResolvedValue([]), findFirst: jest.fn().mockResolvedValue(null) },
      nota_credito_cab: { findMany: jest.fn().mockResolvedValue([]), findFirst: jest.fn().mockResolvedValue(null) },
      recibos_cobro: { findMany: jest.fn().mockResolvedValue([]), findFirst: jest.fn().mockResolvedValue(null) },
      pedidos: { findMany: jest.fn().mockResolvedValue([]), findFirst: jest.fn().mockResolvedValue(null) },
      presupuesto_cab: { findMany: jest.fn().mockResolvedValue([]), findFirst: jest.fn().mockResolvedValue(null) },
    };
    const viaje = {
      id: 'v-1',
      empresa_id: 'emp-1',
      estado: 'EN_RUTA',
      vendedor_id: null,
      fecha_salida: new Date('2026-09-20T00:00:00.000Z'),
      fecha_retorno: new Date('2026-09-22T00:00:00.000Z'),
    };
    const viajes: any = {
      findOne: jest.fn().mockResolvedValue(viaje),
      exigirEditable: jest.fn().mockResolvedValue(viaje),
    };
    const service = Object.create(ViajeDocumentosService.prototype) as any;
    service.prisma = prisma;
    service.viajes = viajes;
    return { service, prisma };
  };

  it('la ventana llega hasta el FIN del día de retorno, no a su medianoche', async () => {
    const { service, prisma } = armar();
    await service.sugeridos('v-1', 'emp-1', 'usr-1');

    const hasta = prisma.factura_cab.findMany.mock.calls[0][0].where.dfeemide.lte as Date;
    // Con `lte: medianoche` se perdían todas las facturas del último día.
    expect(hasta.getTime()).toBeGreaterThan(new Date('2026-09-22T12:00:00.000Z').getTime());
  });

  it('las órdenes de venta y los presupuestos también se filtran por sucursal', async () => {
    const { service, prisma } = armar();
    await service.sugeridos('v-1', 'emp-1', 'usr-1');

    expect(prisma.pedidos.findMany.mock.calls[0][0].where.sucursal_id).toBeDefined();
    expect(prisma.presupuesto_cab.findMany.mock.calls[0][0].where.sucursal_id).toBeDefined();
  });

  it('no se engancha a mano un documento de una sucursal fuera del alcance', async () => {
    const { service, prisma } = armar();
    // La factura existe en la empresa pero es de otra sucursal (dest 003).
    prisma.factura_cab.findFirst = jest.fn().mockResolvedValue(null);

    await expect(
      service.agregar('v-1', [{ tipo: 'FACTURA', documento_id: 'f-ajena' }], 'emp-1', 'usr-1'),
    ).rejects.toThrow(/no encontrado|alcance|sucursal/i);
    // La consulta tiene que haber llevado el filtro de sucursal.
    expect(prisma.factura_cab.findFirst.mock.calls[0][0].where.dest).toBeDefined();
  });

  it('no trae todos los viaje_documentos del sistema para excluirlos', async () => {
    const { service, prisma } = armar();
    await service.sugeridos('v-1', 'emp-1', 'usr-1');

    // Cada llamada a idsAsignados debe acotar por empresa, no escanear la tabla entera.
    for (const call of prisma.viaje_documentos.findMany.mock.calls) {
      expect(call[0].where.viaje).toBeDefined();
    }
  });
});
