import { getAIProviderForShop } from "./provider-factory";
import { GeminiProvider } from "./gemini-provider";
import { AgentRunResult } from "../openai/agent";

export interface UniversalAgentParams {
  shopDomain: string;
  sessionId: string;
  userMessage: string;
  customerAccessToken?: string;
  aiProvider?: string; // "gemini", "openai", or "local"
  model?: string;
}

/**
 * Universal AI Agent Runner.
 * Uses getAIProviderForShop to resolve the merchant's configured AI Provider
 * and delegates execution to provider.generateResponse().
 */
export async function runUniversalAIAgent({
  shopDomain,
  sessionId,
  userMessage,
  customerAccessToken,
  aiProvider,
  model,
}: UniversalAgentParams): Promise<AgentRunResult> {
  const { provider, model: resolvedModel, systemPrompt } = await getAIProviderForShop(shopDomain, aiProvider);

  const res = await provider.generateResponse({
    shopDomain,
    sessionId,
    userMessage,
    customerAccessToken,
    config: {
      provider: provider.name,
      model: model || resolvedModel,
      systemPrompt: systemPrompt || undefined,
    },
  });

  return res as AgentRunResult;
}

/**
 * Backwards-compatible Google Gemini AI Agent delegator.
 */
export async function runGeminiAgentLoop(params: {
  shopDomain: string;
  sessionId: string;
  userMessage: string;
  customerAccessToken?: string;
  model?: string;
}): Promise<AgentRunResult> {
  const gemini = new GeminiProvider();
  const res = await gemini.generateResponse({
    shopDomain: params.shopDomain,
    sessionId: params.sessionId,
    userMessage: params.userMessage,
    customerAccessToken: params.customerAccessToken,
    config: { provider: "gemini", model: params.model || "gemini-1.5-flash" },
  });

  return res as AgentRunResult;
}
