import { DepositosService } from './depositos.service';
import { correrConRubro } from 'src/utils/rubro-context';

/** GET /depositos respeta el alcance por sucursal y el rubro del selector. */
describe('DepositosService.findAll con alcance', () => {
  const crearPrisma = ({ superadmin = true } = {}) => {
    const depositos = [
      { id: 'dep-t', sucursal_id: 'suc-taller' },
      { id: 'dep-a', sucursal_id: 'suc-agogo' },
    ];
    const prisma: any = {
      usuario: { findUnique: jest.fn().mockResolvedValue({ is_superadmin: superadmin }) },
      empresas: { findUnique: jest.fn().mockResolvedValue({ type: 'subsidiary' }) },
      rubros: { findFirst: jest.fn(({ where }) => Promise.resolve(where.id === 'rubro-taller' ? { id: 'rubro-taller' } : null)) },
      asignacion_sucursal_caja_usuario: { findMany: jest.fn().mockResolvedValue([]) },
      empresas_sucursales: {
        findMany: jest.fn(({ where }) =>
          Promise.resolve(where?.sucursal_rubros ? [{ id: 'suc-taller', punto_establecimiento: '001' }] : []),
        ),
      },
      depositos: {
        findMany: jest.fn(({ where }) =>
          Promise.resolve(
            depositos.filter((d) => {
              const f = where.sucursal_id;
              if (f === undefined) return true;
              if (typeof f === 'string') return d.sucursal_id === f;
              return f.in.includes(d.sucursal_id);
            }),
          ),
        ),
      },
    };
    return prisma;
  };

  it('sin rubro: superadmin ve todos los depósitos', async () => {
    const service = new DepositosService(crearPrisma(), {} as any);
    expect((await service.findAll('emp', undefined, 'usr')).map((d: any) => d.id)).toEqual(['dep-t', 'dep-a']);
  });

  it('con rubro Taller: sólo los depósitos de sucursales del Taller', async () => {
    const service = new DepositosService(crearPrisma(), {} as any);
    const r = await correrConRubro('rubro-taller', () => service.findAll('emp', undefined, 'usr'));
    expect(r.map((d: any) => d.id)).toEqual(['dep-t']);
  });

  it('pide una sucursal fuera del alcance: lista vacía', async () => {
    const service = new DepositosService(crearPrisma(), {} as any);
    const r = await correrConRubro('rubro-taller', () => service.findAll('emp', 'suc-agogo', 'usr'));
    expect(r).toEqual([]);
  });
});
