import { ContabilidadSeedService } from './seed.service';
import { MAPEO_DEFAULT_MODULOS } from '../seeds/plan-cuentas-paraguay.seed';

/**
 * Los conceptos de comisiones estaban gateados por un módulo "COMISIONES" que
 * el plan de la empresa no trae: la función vive bajo Cobranzas y se habilita
 * con el submódulo COB_COMISIONES.
 *
 * Efecto en producción (DOBA): liquidan comisiones todos los meses, pero el
 * grupo no aparecía en Mapeo de Cuentas y "Crear mapeos faltantes" los saltaba.
 * El dibujo del asiento sí los mostraba, con un "Falta mapear" que llevaba a un
 * grupo invisible.
 */
describe('El seed mira módulos Y submódulos del plan', () => {
  const crear = (modulos: string[], submodulos: string[]) => {
    const service = Object.create(ContabilidadSeedService.prototype) as any;
    service.prisma = {
      suscripciones: { findFirst: jest.fn().mockResolvedValue({ id: 'sus-1' }) },
      suscripcion_modulos: {
        findMany: jest.fn().mockResolvedValue(modulos.map((codigo) => ({ modulos: { codigo } }))),
      },
      suscripcion_submodulos: {
        findMany: jest.fn().mockResolvedValue(submodulos.map((codigo) => ({ submodulos: { codigo } }))),
      },
    };
    return service;
  };

  it('los conceptos de comisiones se gatean por el submódulo, no por un módulo inexistente', () => {
    expect(MAPEO_DEFAULT_MODULOS.GASTO_COMISIONES_VENTAS).toBe('COB_COMISIONES');
    expect(MAPEO_DEFAULT_MODULOS.COMISIONES_A_PAGAR).toBe('COB_COMISIONES');
    expect(MAPEO_DEFAULT_MODULOS.PAGO_COMISIONES_FONDOS).toBe('COB_COMISIONES');
  });

  it('el plan de DOBA habilita comisiones por submódulo aunque no tenga el módulo', async () => {
    const service = crear(['COBRANZAS', 'CONTABILIDAD', 'RRHH'], ['COB_COMISIONES', 'RRHH_COMISIONES']);

    const activos = await service.obtenerModulosActivos('emp-1');

    expect(activos.has('COB_COMISIONES')).toBe(true);
    expect(activos.has('COMISIONES')).toBe(false);
    expect(service.moduloHabilitado('COB_COMISIONES', activos)).toBe(true);
  });

  it('una empresa sin comisiones sigue sin sembrar esos conceptos', async () => {
    const service = crear(['COBRANZAS', 'CONTABILIDAD'], ['COB_ASIGNACION']);

    const activos = await service.obtenerModulosActivos('emp-1');

    expect(service.moduloHabilitado('COB_COMISIONES', activos)).toBe(false);
  });

  it('los módulos de siempre siguen valiendo', async () => {
    const service = crear(['RRHH'], []);

    const activos = await service.obtenerModulosActivos('emp-1');

    expect(service.moduloHabilitado('RRHH', activos)).toBe(true);
    expect(service.moduloHabilitado(undefined, activos)).toBe(true);
  });

  it('sin suscripción activa no se filtra nada (plan maestro)', async () => {
    const service = crear([], []);
    service.prisma.suscripciones.findFirst.mockResolvedValue(null);

    expect(await service.obtenerModulosActivos('emp-1')).toBeNull();
    expect(service.moduloHabilitado('COB_COMISIONES', null)).toBe(true);
  });
});
