import { ContabilidadConciliacionService } from './contabilidad-conciliacion.service';
import { CONT_ORIGEN_REGISTRY_SEED } from './registry.seed';

/** Conciliación sin Nest ni base: solo lo que tocan `detalle` y `resumen`. */
const crear = (cuentaPuente: string | null) => {
  const s = Object.create(ContabilidadConciliacionService.prototype) as any;
  s.logger = { log: jest.fn(), warn: jest.fn(), error: jest.fn() };
  s.prisma = {
    cont_origen_registry: {
      findUnique: jest.fn().mockResolvedValue({ origen_tipo: 'imp_cierre', activo: true, tabla_origen: 'imp_embarques' }),
      findMany: jest.fn().mockResolvedValue([{ origen_tipo: 'imp_cierre', tabla_origen: 'imp_embarques' }]),
    },
    cont_mapeo_cuentas: { findUnique: jest.fn().mockResolvedValue(cuentaPuente ? { cuenta_id: cuentaPuente } : null) },
  };
  s.fechaActivacionContabilidad = jest.fn().mockResolvedValue(null);
  s.buildWhereConSinDocumento = jest.fn().mockRejectedValue(new Error('no debería consultar'));
  return s;
};

describe('cierre de importación en Conciliación', () => {
  it('está en el registro, sobre los embarques cerrados', () => {
    expect(CONT_ORIGEN_REGISTRY_SEED.find((e) => e.origen_tipo === 'imp_cierre')).toMatchObject({
      tabla_origen: 'imp_embarques',
      filtro_extra: { estado: 'CERRADO' },
      service_method: 'integrarCierreImportacion',
      conceptos_req: ['INVENTARIO'],
    });
  });

  it('ningún origen exige la cuenta puente (es opcional; Salud contable no la marca)', () => {
    const exigen = CONT_ORIGEN_REGISTRY_SEED.filter((e) => (e.conceptos_req ?? []).includes('IMPORTACIONES_EN_CURSO'));
    expect(exigen).toEqual([]);
  });

  it('sin cuenta puente mapeada no hay pendientes de cierre (detalle vacío)', async () => {
    const s = crear(null);
    await expect(s.detalle('emp', 'imp_cierre')).resolves.toEqual({ items: [], total: 0 });
    expect(s.buildWhereConSinDocumento).not.toHaveBeenCalled();
  });

  it('sin cuenta puente mapeada el resumen no lista el cierre', async () => {
    const s = crear(null);
    await expect(s.resumen('emp')).resolves.toEqual([]);
  });

  it('con cuenta puente mapeada el cierre se consulta', async () => {
    const s = crear('cta-puente');
    await s.detalle('emp', 'imp_cierre').catch(() => undefined);
    expect(s.buildWhereConSinDocumento).toHaveBeenCalled();
    expect(s.prisma.cont_mapeo_cuentas.findUnique).toHaveBeenCalledWith({
      where: { empresa_id_concepto: { empresa_id: 'emp', concepto: 'IMPORTACIONES_EN_CURSO' } },
      select: { cuenta_id: true },
    });
  });
  it('con la puente mapeada a una cuenta inutilizable el cierre se sigue listando (el integrador lo deja pendiente con aviso)', async () => {
    const s = crear('cta-desactivada');
    await s.detalle('emp', 'imp_cierre').catch(() => undefined);
    expect(s.buildWhereConSinDocumento).toHaveBeenCalled();
  });
});
