import type { SidebarChatProvider } from '../sidebarProvider';

/**
 * Sidebar webview message handler 등록소.
 *
 * 의도: 옛 sidebarProvider 의 if-chain (`if (await handleChat()) return; if (await
 * handleBrain()) return; ...`) 은 새 도메인 추가 시 항상 sidebarProvider.ts 본문을
 * 손대야 했다. 이 레지스트리는 도메인 핸들러를 *배열* 로 관리해 그 의존성을
 * 끊는다 — 새 핸들러는 array push 한 줄, sidebarProvider 본문은 무수정.
 *
 * 외부 플러그인 / 다른 모듈도 활성화 시점에 `registerSidebarHandler()` 한 번
 * 호출하면 message dispatch loop 에 자동 합류.
 *
 * Handler 계약:
 *   - 처리했으면 true 반환 (dispatch 종료)
 *   - 자기 도메인 아니면 false 반환 (다음 handler 로 chain)
 *   - throw 는 호출자 (sidebarProvider) 가 잡아 unhandled 로 로그
 */
export type SidebarMessageHandler = (
    provider: SidebarChatProvider,
    data: any,
) => Promise<boolean>;

const HANDLERS: SidebarMessageHandler[] = [];

/**
 * 새 sidebar handler 등록. 중복 등록 시 *추가* 함 (같은 함수 여러 번 등록 가능,
 * 호출자가 dedup 해야 함). 일반적으로 모듈 load 시점 1회만 호출.
 */
export function registerSidebarHandler(h: SidebarMessageHandler): void {
    HANDLERS.push(h);
}

/**
 * 등록 순서대로 handler 들을 순회. true 반환한 첫 핸들러에서 stop.
 * sidebarProvider 의 webview message dispatch 가 이걸 호출.
 */
export async function dispatchSidebarMessage(
    provider: SidebarChatProvider,
    data: any,
): Promise<boolean> {
    for (const h of HANDLERS) {
        if (await h(provider, data)) return true;
    }
    return false;
}

/** 디버그 — 현재 등록된 핸들러 수. 테스트 setup/teardown 검증용. */
export function _sidebarHandlerCount(): number {
    return HANDLERS.length;
}
