import { ref, reactive, readonly } from 'vue'

// ─────────────────────────────────────────────────────────────────────────────
// Palette de commandes globale (Cmd/Ctrl+K) — l'« escape hatch » qui permet de
// DÉCLUTTERER les pages : toute action reléguée dans un ⋮ ou une DisclosureSection
// reste joignable en tapant. Une seule instance, montée dans MainLayout.
//
//   const { open, openPalette, registerActions } = useCommandPalette()
//
// Une PAGE enregistre ses actions contextuelles au montage et les retire au démontage :
//   onMounted(() => registerActions('planif', [
//     { id:'publish', label:'Publier l’horaire', icon:'cloud_upload', group:'Planification', run: publishWeek },
//   ]))
//   onUnmounted(() => unregisterActions('planif'))
//
// Chaque action : { id, label, icon?, caption?, group?, keywords?, run() }.
// ─────────────────────────────────────────────────────────────────────────────

const open = ref(false)
const _sources = reactive({})   // sourceId → [actions]

function openPalette () { open.value = true }
function closePalette () { open.value = false }
function togglePalette () { open.value = !open.value }

// Enregistre (ou remplace) le lot d'actions d'une source contextuelle.
function registerActions (sourceId, actions) {
  _sources[sourceId] = Array.isArray(actions) ? actions.filter(a => a && a.label && typeof a.run === 'function') : []
}
function unregisterActions (sourceId) {
  delete _sources[sourceId]
}

// Toutes les actions contextuelles actuellement enregistrées, à plat.
function contextActions () {
  const out = []
  for (const id in _sources) for (const a of _sources[id]) out.push({ ...a, _source: id })
  return out
}

export function useCommandPalette () {
  return {
    open,
    openPalette,
    closePalette,
    togglePalette,
    registerActions,
    unregisterActions,
    contextActions,
    sources: readonly(_sources),
  }
}
