import { createAdminClient } from "@/lib/supabase/admin"
import { DashboardMetrics } from "@/components/admin/dashboard-metrics"
import { RecentActivity } from "@/components/admin/recent-activity"

export const dynamic = "force-dynamic"

// Admin Dashboard — now focused purely on metrics + recent activity.
// The registered-users table lives on /admin/users and the verification
// (blue tick) queue lives on /admin/verification. Auth + admin check
// happen in the shared app/admin/layout.tsx.
export default async function AdminDashboardPage() {
  const admin = createAdminClient()
  const startOfDay = new Date()
  startOfDay.setHours(0, 0, 0, 0)

  const [
    totalUsersRes,
    newTodayRes,
    activeCallsRes,
    waitingRes,
    sessionsTodayRes,
    avgDurationRes,
    recentRes,
  ] = await Promise.all([
    admin.from("profiles").select("id", { count: "exact", head: true }),
    admin
      .from("profiles")
      .select("id", { count: "exact", head: true })
      .gte("created_at", startOfDay.toISOString()),
    admin.from("rooms").select("id", { count: "exact", head: true }),
    admin.from("waiting_users").select("user_id", { count: "exact", head: true }),
    admin
      .from("call_sessions")
      .select("id", { count: "exact", head: true })
      .gte("started_at", startOfDay.toISOString()),
    admin
      .from("call_sessions")
      .select("duration_seconds")
      .gte("started_at", startOfDay.toISOString())
      .not("duration_seconds", "is", null),
    admin
      .from("call_sessions")
      .select("id, room_id, started_at, ended_at, duration_seconds, user_a, user_b")
      .order("started_at", { ascending: false })
      .limit(8),
  ])

  const durations = (avgDurationRes.data ?? [])
    .map((r) => r.duration_seconds as number | null)
    .filter((n): n is number => typeof n === "number" && Number.isFinite(n))
  const avgDurationSec = durations.length
    ? durations.reduce((a, b) => a + b, 0) / durations.length
    : 0

  const initialMetrics = {
    totalUsers: totalUsersRes.count ?? 0,
    newUsersToday: newTodayRes.count ?? 0,
    activeCalls: activeCallsRes.count ?? 0,
    waiting: waitingRes.count ?? 0,
    sessionsToday: sessionsTodayRes.count ?? 0,
    avgDurationSec,
  }

  // Join recent-activity user ids to profile display names so the table
  // can render friendly labels instead of raw UUIDs.
  const recent = recentRes.data ?? []
  const idsToLookup = Array.from(
    new Set(
      recent
        .flatMap((r) => [r.user_a as string | null, r.user_b as string | null])
        .filter((x): x is string => !!x),
    ),
  )
  const nameById = new Map<string, string>()
  if (idsToLookup.length > 0) {
    const { data: profs } = await admin
      .from("profiles")
      .select("id, display_name")
      .in("id", idsToLookup)
    for (const p of profs ?? []) {
      if (p.display_name) nameById.set(p.id, p.display_name)
    }
  }
  const activityItems = recent.map((r) => ({
    id: r.id,
    room_id: r.room_id,
    started_at: r.started_at,
    ended_at: r.ended_at,
    duration_seconds: r.duration_seconds,
    user_a_name: r.user_a ? nameById.get(r.user_a) ?? null : null,
    user_b_name: r.user_b ? nameById.get(r.user_b) ?? null : null,
  }))

  return (
    <>
      <DashboardMetrics initial={initialMetrics} />
      <RecentActivity items={activityItems} />
    </>
  )
}
