import { ViajesService } from '../viajes.service';

describe('ViajesService — alta y numeración', () => {
  const crear = (ultimoNumero: string | null = null) => {
    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([]) },
      depositos: { findMany: jest.fn().mockResolvedValue([]) },
      viajes: {
        findFirst: jest.fn().mockResolvedValue(ultimoNumero ? { numero: ultimoNumero } : null),
        create: jest.fn().mockImplementation(({ data }) => Promise.resolve({ id: 'v-1', ...data })),
      },
    };
    const service = Object.create(ViajesService.prototype) as any;
    service.prisma = prisma;
    return { service, prisma };
  };

  it('numera el primer viaje de la empresa como VJ-000001', async () => {
    const { service } = crear();
    expect(await service.siguienteNumero('emp-1')).toBe('VJ-000001');
  });

  it('continúa la numeración desde el último viaje', async () => {
    const { service } = crear('VJ-000041');
    expect(await service.siguienteNumero('emp-1')).toBe('VJ-000042');
  });

  it('crea el viaje en estado PLANIFICADO con el usuario que lo creó', async () => {
    const { service, prisma } = crear();
    const viaje = await service.create(
      { fecha_salida: '2026-09-23', descripcion: 'Interior — Cristian', vendedor_id: 'vend-1' },
      'emp-1',
      'usr-1',
    );
    expect(viaje.estado).toBe('PLANIFICADO');
    expect(viaje.numero).toBe('VJ-000001');
    expect(prisma.viajes.create).toHaveBeenCalled();
    const data = prisma.viajes.create.mock.calls[0][0].data;
    expect(data.empresa_id).toBe('emp-1');
    expect(data.creado_por).toBe('usr-1');
    expect(data.fecha_salida).toBeInstanceOf(Date);
  });
});
