import type { TemplateResult } from 'lit' import type { KpiMetricLike } from './metric-input-hint' /** 특정 metric 에 대한 커스텀 입력 렌더러. 제네릭 위젯으로 표현 못 하는 예외용. */ export type MetricInputRenderer = ( metric: KpiMetricLike, value: any, onChange: (value: any) => void ) => TemplateResult type Entry = { predicate: (metric: KpiMetricLike) => boolean; renderer: MetricInputRenderer } /** * 커스텀 렌더러 레지스트리 (80/20 탈출구). * 제네릭 렌더러가 대부분을 처리하고, 특수 UI 만 predicate 로 등록해 우선 적용한다. */ class Registry { private entries: Entry[] = [] register(predicate: (metric: KpiMetricLike) => boolean, renderer: MetricInputRenderer): void { this.entries.push({ predicate, renderer }) } /** 가장 먼저 매칭되는 커스텀 렌더러(없으면 undefined → 제네릭 사용). */ resolve(metric: KpiMetricLike): MetricInputRenderer | undefined { return this.entries.find(e => { try { return e.predicate(metric) } catch { return false } })?.renderer } /** 테스트/리셋용. */ clear(): void { this.entries = [] } } export const MetricRendererRegistry = new Registry()