// Tek bir self-hosted GPU'ya (RunPod) gidiyoruz — Mizan (sohbet/analiz) ve
// DeepSeek-OCR (görsel OCR) aynı kartı paylaşıyor. Backend'de hiçbir eşzamanlılık
// sınırı yoksa, çok sayıda kullanıcı aynı anda istek atarsa hepsi anında Ollama'ya
// gidiyor — bu da kuyrukta 90 saniyeyi aşıp "başarısız" olarak görünmesine yol
// açabiliyor. Bu modül, aynı anda GPU'ya giden istek sayısını sınırlayıp fazlasını
// burada (backend'de) bekletiyor — kullanıcı "başarısız" yerine sadece biraz
// daha geç bir sonuç görüyor.
const MAX_CONCURRENT = parseInt(process.env.AI_MAX_CONCURRENT || '4', 10);

let active = 0;
const waiting: Array<() => void> = [];

function acquire(): Promise<void> {
  if (active < MAX_CONCURRENT) {
    active++;
    return Promise.resolve();
  }
  return new Promise((resolve) => waiting.push(resolve));
}

function release() {
  active--;
  const next = waiting.shift();
  if (next) {
    active++;
    next();
  }
}

export async function withAiQueue<T>(fn: () => Promise<T>): Promise<T> {
  await acquire();
  try {
    return await fn();
  } finally {
    release();
  }
}

// Ayarlar/monitoring için — kuyrukta kaç istek beklediğini dışarı açar.
export function getAiQueueStatus() {
  return { active, waiting: waiting.length, max: MAX_CONCURRENT };
}
