/**
 * Реестр объектов игры для дев-панели (трек 33): объекты регистрируются
 * там же, где создаются (штампы мира в areas.ts, персонажи/снаряжение в
 * main.ts, фауна в fauna.ts) — каталог вьювера собирается сам, без ручного
 * списка в devview. Дедуп по id: штампы тысяч объектов и повторный спавн
 * при переходах областей заполняют каталог по одному разу на вид.
 */
import type { VoxelModel, VoxelRig, AnimClip, CloudTiles, MannequinPalette } from '@rpg/engine';

/** Что строит вьювер из записи: модель + опционально рига/клип/тайли/скины. */
export interface RegistryBuild {
    model: VoxelModel;
    rig?: VoxelRig;
    clip?: AnimClip;
    tiles?: CloudTiles;
    /** Скины: [имя, палитра] — переключение перекрашивает модель. */
    skins?: Array<[string, MannequinPalette]>;
}

/** Запись каталога: id (стабильный, для моста/гейтов), подпись, сборка. */
export interface RegistryEntry {
    id: string;
    label: string;
    build(): RegistryBuild;
}

const entries = new Map<string, RegistryEntry>();

/** Зарегистрировать объект вида (повторная регистрация с тем же id — no-op). */
export function registerObject(entry: RegistryEntry): void {
    if (!entries.has(entry.id)) entries.set(entry.id, entry);
}

/** Все записи каталога в порядке регистрации. */
export function registryAll(): RegistryEntry[] {
    return [...entries.values()];
}

/** Запись по id (мост/гейты открывают вьювер по id). */
export function registryGet(id: string): RegistryEntry | null {
    return entries.get(id) ?? null;
}