import "server-only"

import type { AiUsageStats } from "./types"

/**
 * AI 模块数据访问层
 *
 * 当前为内存实现（单实例），生产环境应替换为数据库或 Redis 查询。
 *
 * 职责：
 * 1. AI 使用统计聚合（供管理员仪表盘）
 * 2. AI 使用日志查询
 *
 * 注意：trackEvent 当前仅输出到 console（见 shared/lib/track-event.ts），
 * 生产环境接入真实 sink（PostHog/Sentry/DB 事件表）后，
 * 此处的聚合函数需改为查询真实数据源。
 */

// ---------------------------------------------------------------------------
// 内存事件存储（生产环境替换为 DB/Redis）
// ---------------------------------------------------------------------------

interface StoredAiEvent {
  userId: string
  capability: string
  success: boolean
  durationMs: number
  timestamp: number
  errorMessage?: string
}

// 单实例内存存储，最多保留最近 10000 条事件
const MAX_EVENTS = 10000
const eventStore: StoredAiEvent[] = []

/**
 * 记录 AI 事件到内存存储
 *
 * 由 usage-tracker.ts 调用（非导出，仅模块内部使用）。
 * 生产环境替换为 DB 异步写入。
 */
export function recordAiEvent(event: StoredAiEvent): void {
  eventStore.push(event)
  // 超出上限时丢弃最旧的事件
  if (eventStore.length > MAX_EVENTS) {
    eventStore.splice(0, eventStore.length - MAX_EVENTS)
  }
}

// ---------------------------------------------------------------------------
// 使用统计聚合
// ---------------------------------------------------------------------------

/**
 * 获取 AI 使用统计
 *
 * 从内存事件存储聚合统计数据。
 * 生产环境应改为查询 DB 或 Redis。
 *
 * @returns AiUsageStats — 聚合后的统计数据
 */
export async function getAiUsageStats(): Promise<AiUsageStats> {
  const now = Date.now()
  const todayStart = new Date()
  todayStart.setHours(0, 0, 0, 0)
  const todayMs = todayStart.getTime()
  const weekMs = now - 7 * 24 * 60 * 60 * 1000

  const totalCalls = eventStore.length
  const callsToday = eventStore.filter((e) => e.timestamp >= todayMs).length
  const callsThisWeek = eventStore.filter((e) => e.timestamp >= weekMs).length
  const failedCalls = eventStore.filter((e) => !e.success).length
  const errorRate = totalCalls > 0 ? failedCalls / totalCalls : 0

  const durations = eventStore.map((e) => e.durationMs)
  const avgDurationMs = durations.length > 0
    ? Math.round(durations.reduce((a, b) => a + b, 0) / durations.length)
    : 0

  // 活跃用户（今日有调用的去重用户数）
  const activeUserIds = new Set(
    eventStore
      .filter((e) => e.timestamp >= todayMs)
      .map((e) => e.userId)
  )

  // 按 capability 聚合
  const capabilityMap = new Map<string, number>()
  for (const e of eventStore) {
    capabilityMap.set(e.capability, (capabilityMap.get(e.capability) ?? 0) + 1)
  }
  const byCapability = Array.from(capabilityMap.entries())
    .map(([capability, count]) => ({
      capability,
      count,
      percentage: totalCalls > 0 ? Math.round((count / totalCalls) * 100) : 0,
    }))
    .sort((a, b) => b.count - a.count)

  // 按角色聚合（当前无法从事件中获取角色，返回空数组）
  // 生产环境若需按角色聚合，需在 StoredAiEvent 中增加 role 字段
  const byRole: Array<{ role: string; count: number }> = []

  // Top 用户
  const userCallMap = new Map<string, number>()
  for (const e of eventStore) {
    userCallMap.set(e.userId, (userCallMap.get(e.userId) ?? 0) + 1)
  }
  const topUsers = Array.from(userCallMap.entries())
    .map(([userId, count]) => ({ userId, count }))
    .sort((a, b) => b.count - a.count)
    .slice(0, 10)

  // 最近活动
  const recentActivity = eventStore
    .slice(-20)
    .reverse()
    .map((e) => ({
      userId: e.userId,
      capability: e.capability,
      success: e.success,
      durationMs: e.durationMs,
      timestamp: new Date(e.timestamp).toISOString(),
    }))

  return {
    totalCalls,
    callsToday,
    callsThisWeek,
    activeUsers: activeUserIds.size,
    errorRate: Math.round(errorRate * 100) / 100,
    avgDurationMs,
    byCapability,
    byRole,
    topUsers,
    recentActivity,
  }
}
