import { SucursalesService } from './sucursales.service';
import { correrConRubro } from 'src/utils/rubro-context';

/**
 * El selector de sucursal de Inventario (Stock, Ajuste, Transferencias) sale de
 * GET /sucursales: con un rubro elegido en el sidebar, sólo las sucursales de ese
 * rubro, también para un superadmin. Ver docs/plan-rubros-multi-sucursal.md (Fase 7).
 */
describe('SucursalesService.findAllByEmpresa con rubro del request', () => {
  const TALLER = { id: 'suc-taller', punto_establecimiento: '001' };
  const AGOGO = { id: 'suc-agogo', punto_establecimiento: '003' };
  const RUBRO_TALLER = 'rubro-taller';

  const crearPrisma = () => {
    const todas = [TALLER, AGOGO];
    const filtrar = (where: any) => {
      let r = todas;
      if (where?.id?.in) r = r.filter((s) => where.id.in.includes(s.id));
      if (where?.sucursal_rubros?.some?.rubro_id) r = r.filter((s) => (s === TALLER ? RUBRO_TALLER : 'otro') === where.sucursal_rubros.some.rubro_id);
      return r;
    };
    const prisma: any = {
      usuario: { findUnique: jest.fn().mockResolvedValue({ is_superadmin: true }) },
      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(filtrar(where))),
        count: jest.fn(({ where }) => Promise.resolve(filtrar(where).length)),
      },
      depositos: { findMany: jest.fn().mockResolvedValue([]) },
      $transaction: jest.fn((ops: Promise<any>[]) => Promise.all(ops)),
    };
    return prisma;
  };

  it('sin rubro: superadmin ve todas', async () => {
    const service = new SucursalesService({} as any, crearPrisma(), {} as any, {} as any);
    const r = await service.findAllByEmpresa('emp', 1, 100, 'usr');
    expect(r.items.map((s: any) => s.id)).toEqual(['suc-taller', 'suc-agogo']);
  });

  it('con rubro Taller: sólo la sucursal del Taller, y el total acompaña', async () => {
    const service = new SucursalesService({} as any, crearPrisma(), {} as any, {} as any);
    const r = await correrConRubro(RUBRO_TALLER, () => service.findAllByEmpresa('emp', 1, 100, 'usr'));
    expect(r.items.map((s: any) => s.id)).toEqual(['suc-taller']);
    expect(r.total).toBe(1);
  });
});
