import type { InMemoryEventBus } from "./eventBus";
import { createEvent } from "./events";

type BridgeLog = (message: string, fields?: Record<string, unknown>) => void;

export function attachAdminCommandBridge(
    eventBus: InMemoryEventBus,
    log: BridgeLog
): () => void {
    return eventBus.on(
        "admin_command",
        async (event) => {
            const command = event.payload.command.trim().toLowerCase();
            if (!command) {
                return;
            }
            if (command === "ext" || command === "action" || command === "youtube") {
                log("admin_command_reserved", {
                    streamId: event.payload.streamId,
                    command
                });
                return;
            }

            await eventBus.emit(
                createEvent("chat_command", {
                    streamId: event.payload.streamId,
                    command,
                    args: event.payload.args,
                    source: "chat",
                    origin: "admin",
                    actor: {
                        role: event.payload.actorRole,
                        platform: "local",
                        userId: event.payload.tokenId,
                        username: event.payload.sessionId ?? undefined
                    }
                })
            );

            log("admin_command_bridged", {
                streamId: event.payload.streamId,
                command,
                argsCount: event.payload.args.length,
                sessionId: event.payload.sessionId
            });
        },
        {
            componentId: "admin-command-bridge",
            componentKind: "core"
        }
    );
}
