/**
 * LLM/TTS 调用会话上下文
 * 通过 AsyncLocalStorage 实现，无需修改任何 LLM 调用方签名
 * 
 * 用法:
 *   import { runWithContext } from '../../services/llm-context';
 *   await runWithContext({ bookId: 17, chapterId: 5 }, async () => {
 *     await callLLMWithMessages(...);  // 自动携带 bookId
 *     await ttsProvider.synthesize(...); // 自动携带 bookId
 *   });
 */

import { AsyncLocalStorage } from 'async_hooks';

export interface LlmContext {
  userId?: number;
  bookId?: number;
  chapterId?: number;
}

const storage = new AsyncLocalStorage<LlmContext>();

/** 获取当前异步上下文（withAiLog 内部调用） */
export function getLlmContext(): LlmContext | undefined {
  return storage.getStore();
}

/** 在指定上下文中执行异步函数 */
export async function runWithContext<T>(
  ctx: LlmContext,
  fn: () => Promise<T>,
): Promise<T> {
  return storage.run(ctx, fn);
}
