import type { RuntimeOptionApplyResult, RuntimeOptionId } from "../types";
import { handleMpvCommandFromIpcService } from "../core/services";
import { createMpvCommandRuntimeServiceDeps } from "./dependencies";
import { SPECIAL_COMMANDS } from "../config";

export interface MpvCommandFromIpcRuntimeDeps {
  triggerSubsyncFromConfig: () => void;
  openRuntimeOptionsPalette: () => void;
  cycleRuntimeOption: (
    id: RuntimeOptionId,
    direction: 1 | -1,
  ) => RuntimeOptionApplyResult;
  showMpvOsd: (text: string) => void;
  replayCurrentSubtitle: () => void;
  playNextSubtitle: () => void;
  sendMpvCommand: (command: (string | number)[]) => void;
  isMpvConnected: () => boolean;
  hasRuntimeOptionsManager: () => boolean;
}

export function handleMpvCommandFromIpcRuntime(
  command: (string | number)[],
  deps: MpvCommandFromIpcRuntimeDeps,
): void {
  handleMpvCommandFromIpcService(
    command,
    createMpvCommandRuntimeServiceDeps({
      specialCommands: SPECIAL_COMMANDS,
      triggerSubsyncFromConfig: deps.triggerSubsyncFromConfig,
      openRuntimeOptionsPalette: deps.openRuntimeOptionsPalette,
      runtimeOptionsCycle: deps.cycleRuntimeOption,
      showMpvOsd: deps.showMpvOsd,
      mpvReplaySubtitle: deps.replayCurrentSubtitle,
      mpvPlayNextSubtitle: deps.playNextSubtitle,
      mpvSendCommand: deps.sendMpvCommand,
      isMpvConnected: deps.isMpvConnected,
      hasRuntimeOptionsManager: deps.hasRuntimeOptionsManager,
    }),
  );
}
