/**
 * FieldRegistry —— 字段驱动注册中心
 *
 * 管理所有 FieldDriver 实例，提供查找、列举、选择器数据源等能力。
 *
 * 使用方式：
 * - 通过 FieldSystemManager.getFieldSystem().registry 获取全局实例
 * - 内建字段在 createDefaultDrivers() 中批量注册
 * - 外部插件通过 registerFieldDriver(s) 追加注册
 *
 * 以 FieldMeta.type 为 key，同类型重复注册会覆盖并打印警告。
 */
export class FieldRegistry {
    constructor() {
        /** type → FieldDriver 映射，保证同一类型只保留最后注册的实例 */
        this.drivers = new Map();
    }
    /** 注册单个 driver，重复注册同一 type 会覆盖并发出警告 */
    register(driver) {
        const { type } = driver.getMeta();
        if (this.drivers.has(type)) {
            console.warn(`[FieldRegistry] driver type "${type}" already registered, overwriting.`);
        }
        this.drivers.set(type, driver);
    }
    /** 批量注册，内部依次调用 register */
    registerBatch(drivers) {
        drivers.forEach((d) => this.register(d));
    }
    /** 按 type 精确查找，未找到返回 undefined */
    get(type) {
        return this.drivers.get(type);
    }
    /** 返回所有已注册 driver（无序） */
    getAll() {
        return Array.from(this.drivers.values());
    }
    /**
     * 返回按 order 排序的选择器条目列表。
     * 用于 FieldSelector 的扁平列表渲染。
     */
    getSelectorItems() {
        return this.getAll()
            .map((d) => d.getUiContribution().selectorItem)
            .sort((a, b) => a.order - b.order);
    }
    /**
     * 按 category 分组返回选择器条目。
     * 用于 FieldSelector 的分组 Tab 渲染。
     */
    getSelectorItemsByCategory() {
        const items = this.getSelectorItems();
        const grouped = {};
        for (const item of items) {
            const cat = item.category;
            if (!grouped[cat])
                grouped[cat] = [];
            grouped[cat].push(item);
        }
        return grouped;
    }
    has(type) {
        return this.drivers.has(type);
    }
}
