"use client"

import { createContext, useContext, type ReactNode } from "react"

import type { AiClientService } from "../types"

/**
 * AI 客户端服务 Context
 *
 * 通过 React Context 注入 AiClientService（Server Action 引用集合），
 * 客户端组件通过 useAiClient() 消费，不直接 import actions。
 *
 * 遵循 settings 模块的依赖注入模式：
 * - 页面层（Server Component）创建 service 对象并注入 Provider
 * - 组件层通过 Hook 消费
 * - 测试时可注入 mock service
 */

// 重新导出 AiClientService 类型，方便调用方从单一入口导入
export type { AiClientService } from "../types"

const AiClientContext = createContext<AiClientService | null>(null)

export function AiClientProvider({
  children,
  service,
}: {
  children: ReactNode
  service: AiClientService
}) {
  return (
    <AiClientContext.Provider value={service}>
      {children}
    </AiClientContext.Provider>
  )
}

/**
 * 获取 AI 客户端服务
 *
 * 必须在 AiClientProvider 内部使用。
 * 若未注入，抛出错误以防止静默失败。
 */
export function useAiClient(): AiClientService {
  const service = useContext(AiClientContext)
  if (!service) {
    throw new Error(
      "useAiClient must be used within an AiClientProvider. " +
        "Wrap your component tree with <AiClientProvider service={...}>."
    )
  }
  return service
}

/**
 * 安全获取 AI 客户端服务（未注入时返回 null）
 *
 * 用于可选 AI 功能的场景，组件需自行处理 null 情况。
 */
export function useAiClientOptional(): AiClientService | null {
  return useContext(AiClientContext)
}
