import type { VoiceAgentConfig } from "./config.ts";
import type { VoiceProvider, VoiceProviderKind } from "./types.ts";
import { FailoverVoiceProvider } from "./failover-voice-provider.ts";
import { OpenAiRealtimeProvider } from "./openai-realtime.ts";
import { XaiGrokVoiceProvider } from "./xai-grok-voice.ts";

export function createVoiceProvider(
  kind: VoiceProviderKind,
  config: VoiceAgentConfig,
): VoiceProvider {
  const primary = createSingleVoiceProvider(kind, config);
  if (
    kind === "openai_realtime" &&
    config.voiceProviderFailover &&
    config.xai.apiKey &&
    config.xai.phiAllowed
  ) {
    return new FailoverVoiceProvider(primary, [createSingleVoiceProvider("grok_voice", config)]);
  }
  return primary;
}

export function createSingleVoiceProvider(
  kind: VoiceProviderKind,
  config: VoiceAgentConfig,
): VoiceProvider {
  switch (kind) {
    case "openai_realtime":
      if (!config.openai.apiKey) {
        throw new Error("OPENAI_API_KEY is required for OpenAI Realtime.");
      }
      return new OpenAiRealtimeProvider({
        apiKey: config.openai.apiKey,
        model: config.openai.model,
        realtimeUrl: config.openai.realtimeUrl,
        defaultVoice: config.openai.voice,
      });
    case "grok_voice":
      if (!config.xai.apiKey) {
        throw new Error("XAI_API_KEY is required for Grok Voice.");
      }
      return new XaiGrokVoiceProvider({
        apiKey: config.xai.apiKey,
        model: config.xai.model,
        realtimeUrl: config.xai.realtimeUrl,
        defaultVoice: config.xai.voice,
        phiAllowed: config.xai.phiAllowed,
      });
  }
}
