import { TAREAS_SYNC_SIFEN, tareasPendientesPorTipo } from './sifen-sync.plan';

describe('plan de sincronización SIFEN', () => {
  it('cubre documentos y eventos de los tres tipos que se envían a SIFEN', () => {
    const cubierto = TAREAS_SYNC_SIFEN.map((t) => `${t.tipo}:${t.modo}`).sort();
    expect(cubierto).toEqual(
      [
        'factura:documento',
        'factura:evento',
        'nota_credito:documento',
        'nota_credito:evento',
        // El estado de las remisiones no se sincronizaba: quedaban en "Enviado"
        // hasta que alguien apretaba "Sincronizar SIFEN" a mano.
        'nota_remision:documento',
        'nota_remision:evento',
      ].sort(),
    );
  });

  it('cada tarea sabe qué documentos considera pendientes', () => {
    const doc = TAREAS_SYNC_SIFEN.find((t) => t.tipo === 'nota_remision' && t.modo === 'documento')!;
    expect(doc.where).toEqual({ nro_lote: { not: null }, estado_sifen: { in: ['Enviado', 'Pendiente', 'Documento firmado'] } });
    const evento = TAREAS_SYNC_SIFEN.find((t) => t.tipo === 'nota_remision' && t.modo === 'evento')!;
    // Los 'Rechazado' también se reconsultan: un rechazo puede ser el 4003 de
    // SIFEN ("el CDC ya tiene ese evento"), que en realidad confirma el evento.
    // Con el filtro viejo esos documentos salían para siempre del set.
    expect(evento.where).toEqual({
      evento_aplicado: { in: ['ECAN', 'EINO', 'EINU'] },
      estado_evento: { in: ['Pendiente', 'Rechazado'] },
    });
  });

  it('solo devuelve las tareas que tienen empresas con algo pendiente', async () => {
    const conteos: Record<string, string[]> = {
      'factura:documento': ['e1', 'e2'],
      'nota_remision:documento': ['e3'],
    };
    const tareas = await tareasPendientesPorTipo(async (t) => conteos[`${t.tipo}:${t.modo}`] ?? []);
    expect(tareas.map((t) => `${t.tarea.tipo}:${t.tarea.modo}`).sort()).toEqual(['factura:documento', 'nota_remision:documento']);
    expect(tareas.find((t) => t.tarea.tipo === 'nota_remision')!.empresaIds).toEqual(['e3']);
  });
});
