// Registre extensible des types de blocs.
// Les blocs built-in s'enregistrent dans defaultBlocks.js (chargé par index.js).
// Les consommateurs peuvent appeler `registerBlock` pour ajouter leurs propres types.
//
// Forme d'une définition de bloc :
// {
//   type: string,                  // id unique (ex: 'paragraph', 'my_custom')
//   label: string,                 // libellé affiché dans le slash menu
//   icon: ReactNode,               // élément React rendu dans le slash menu (typiquement une icône de `@zen/core/shared/icons`)
//   keywords: string[],            // termes de recherche pour le slash menu
//   shortcut?: string,             // préfixe markdown qui convertit (ex: '# ', '- ')
//   shortcutTransform?: (block, match) => block,  // optionnel : transforme un bloc existant
//   create: (init?) => Block,      // construit un nouveau bloc
//   isText: boolean,               // true si le bloc a un contentEditable de texte
//   textTag?: string,              // pour info / rendu en mode display
//   textClassName?: string,        // classes appliquées au contentEditable
//   placeholder?: string,          // texte fantôme quand le bloc est vide et focus
//   renderPrefix?: (ctx) => ReactNode,  // pour les listes (puce, numéro)
//   Component?: ReactComponent,    // pour blocs non-texte ; reçoit { block, onChange, disabled }
// }

const registry = new Map();

export function registerBlock(def) {
  if (!def || typeof def.type !== 'string') {
    throw new Error('registerBlock: `type` is required');
  }
  if (typeof def.create !== 'function') {
    throw new Error(`registerBlock(${def.type}): \`create\` is required`);
  }
  registry.set(def.type, def);
}

export function getBlockDef(type) {
  return registry.get(type) || null;
}

export function listBlocks() {
  return Array.from(registry.values());
}

export function isBlockText(type) {
  const def = registry.get(type);
  return Boolean(def?.isText);
}

export const DEFAULT_BLOCK_TYPE = 'paragraph';
