/**
 * 质量组件注册表
 * <p>
 * 全平台唯一的组件来源：设计器左侧面板、属性面板、渲染引擎、校验都从这里取定义。
 * 新增组件只需要在 index.ts 里多注册一个 definition，不改动 GrapesJS 集成代码。
 */
import type {
  QualityCategory,
  QualityComponentDefinition,
} from './types';

import { QUALITY_CATEGORY_ORDER } from './types';

const definitions = new Map<string, QualityComponentDefinition>();

/** 注册单个组件；同 type 重复注册按覆盖处理，便于开发期热更新 */
export function registerQualityComponent(definition: QualityComponentDefinition): void {
  if (!definition.type) {
    throw new Error('质量组件定义缺少 type');
  }
  definitions.set(definition.type, definition);
}

/** 批量注册 */
export function registerQualityComponents(list: QualityComponentDefinition[]): void {
  list.forEach(registerQualityComponent);
}

/** 按类型取定义，未注册返回 undefined */
export function getQualityComponent(type?: string): QualityComponentDefinition | undefined {
  return type ? definitions.get(type) : undefined;
}

/** 全部组件，按分类顺序排列（同分类内按注册顺序） */
export function listQualityComponents(): QualityComponentDefinition[] {
  return [...definitions.values()].sort(
    (a, b) => categoryIndex(a.category) - categoryIndex(b.category),
  );
}

/** 按分类分组，空分类不返回 */
export function listQualityComponentsByCategory(): {
  category: QualityCategory;
  components: QualityComponentDefinition[];
}[] {
  const grouped = new Map<QualityCategory, QualityComponentDefinition[]>();
  listQualityComponents().forEach((definition) => {
    const list = grouped.get(definition.category) ?? [];
    list.push(definition);
    grouped.set(definition.category, list);
  });
  return QUALITY_CATEGORY_ORDER.filter((category) => grouped.has(category)).map(
    (category) => ({ category, components: grouped.get(category)! }),
  );
}

function categoryIndex(category: QualityCategory): number {
  const index = QUALITY_CATEGORY_ORDER.indexOf(category);
  return index === -1 ? QUALITY_CATEGORY_ORDER.length : index;
}