/**
 * 轻量级 AI 模型配置读取（供 GenUI / Insights / Audit 等 Edge Function 使用）
 *
 * 与 _shared/aiProvider.ts 的区别：
 *  - aiProvider.ts 提供完整的 provider 路由（lovable/qwen/volcengine 多家适配）
 *  - 本文件只读取 model 名，假定调用方自己已经在调 Lovable AI Gateway
 *  - 用最小改动让旧 GenUI 函数支持后台动态切换模型
 *
 * 用法：
 *   import { getModelForPurpose } from "../_shared/modelConfig.ts";
 *   const model = await getModelForPurpose("manager_genui", "google/gemini-2.5-flash");
 */
import { createClient } from "https://esm.sh/@supabase/supabase-js@2.45.0";

const SUPABASE_URL = Deno.env.get("SUPABASE_URL")!;
const SERVICE_ROLE = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!;

// 简单内存缓存（5 分钟），避免每次请求都查表
const cache = new Map<string, { value: string; expires: number }>();
const TTL_MS = 5 * 60 * 1000;

export async function getModelForPurpose(
  purpose: string,
  fallback = "google/gemini-2.5-flash",
): Promise<string> {
  // AI 中台启用时统一返回 agent-default（中台不识别 google/openai 等模型名）
  const HUB_KEY = Deno.env.get("AI_HUB_API_KEY");
  const HUB_BASE = Deno.env.get("AI_HUB_BASE_URL");
  if (HUB_KEY && HUB_BASE) {
    return Deno.env.get("AI_HUB_DEFAULT_CHAT_MODEL") || "agent-default";
  }

  const cached = cache.get(purpose);
  if (cached && cached.expires > Date.now()) return cached.value;

  try {
    const admin = createClient(SUPABASE_URL, SERVICE_ROLE);
    const { data } = await admin
      .from("ai_provider_configs")
      .select("model, enabled")
      .eq("purpose", purpose)
      .maybeSingle();
    const model = (data && data.enabled !== false && data.model) || fallback;
    cache.set(purpose, { value: model, expires: Date.now() + TTL_MS });
    return model;
  } catch (e) {
    console.warn(`[modelConfig] load purpose=${purpose} failed`, e);
    return fallback;
  }
}

/**
 * 读取消费者聊天/管理后台聊天的引擎策略
 * 返回值：'dify' | 'coze' | 'dify_with_coze_fallback' | 'coze_with_dify_fallback'
 */
export async function getChatEngineStrategy(
  purpose: "consumer_chat" | "admin_chat",
  fallback: "dify_with_coze_fallback" | "coze" = "dify_with_coze_fallback",
): Promise<string> {
  const model = await getModelForPurpose(purpose, fallback);
  return model;
}
