// Micara bridge — micro par défaut du système (t_dd15f264, device « Micara Mic »)
//
// Objectif : au 1er lancement, faire en sorte que Teams prenne LE micro Micara
// sans que l'utilisateur cherche. Le bridge ne peut pas renommer le driver
// BlackHole (le nom « BlackHole 16ch » est compilé dans le code C du driver,
// pas dans son Info.plist — voir la conclusion de l'étude dans le récap) ; on
// fait donc le travail côté système :
//
//   1. Lister les devices d'entrée (SwitchAudioSource -a -t input)
//   2. Choisir le MEILLEUR device Micara :
//        « Micara Mic » (driver renommé, si un jour) > « BlackHole 16ch »
//        (toute variante non-2ch) — JAMAIS « BlackHole 2ch » (caché, inutilisé)
//   3. Le définir comme micro par défaut (SwitchAudioSource -s <nom> -t input)
//
// SwitchAudioSource est l'outil standard (brew install switchaudio-osx) —
// petit, zéro permission spéciale (simple appel CoreAudio). S'il est absent,
// le bridge dégrade proprement : instruction visuelle au 1er lancement (la
// bannière) + bouton « Définir le micro par défaut » quand l'outil arrive.
//
// Ce module est PUR (aucun child_process) pour être testable en Node :
// la partie shell vit dans main.js (applyDefaultMic → runSwitchAudio).

// Préférence stricte des devices d'entrée, dans l'ordre :
//   1. « Micara Mic » (driver renommé — si le custom build est fait un jour)
//   2. BlackHole NON-2ch (16ch en pratique — celui que le bridge utilise)
//   3. JAMAIS « BlackHole 2ch » / « … Mirror » (jamais utilisé, caché)
const EXCLUDE = /2\s?ch|mirror/i;

// Choisit le device d'entrée Micara parmi les lignes de
// `SwitchAudioSource -a -t input` (un nom par ligne). Retourne le nom exact
// (celui à passer à `-s`) ou null si aucun device utilisable.
function pickMicaraDevice(lines) {
  const names = (lines || [])
    .map((l) => String(l).trim())
    .filter((l) => l.length > 0);
  if (!names.length) return null;

  // 1. « Micara Mic » d'abord (le driver renommé, s'il existe)
  for (const name of names) {
    if (/micara/i.test(name) && !EXCLUDE.test(name)) return name;
  }
  // 2. BlackHole non-2ch (16ch en pratique)
  for (const name of names) {
    if (/blackhole/i.test(name) && !EXCLUDE.test(name)) return name;
  }
  // 3. BlackHole 2ch → JAMAIS (caché — ne pas le définir par défaut)
  return null;
}

// Traduit le résultat d'applyDefaultMic en raison lisible (i18n du renderer).
// reasons : 'missing' (outil absent) | 'notfound' (aucun device) | 'other'
function micSetupFailureReason(result) {
  if (result && result.missing) return 'missing';
  if (result && result.notfound) return 'notfound';
  return 'other';
}

module.exports = { pickMicaraDevice, micSetupFailureReason };
