import { redirect } from'next/navigation'
import { createClient } from'@/lib/supabase/server'
import { getUserSession } from'@/lib/auth/permissions'
import { isAtLeastRole } from'@/lib/auth/permissions-shared'
import AppHeader from'@/components/layout/app-header'
import AuditClient from'@/components/admin/audit-client'
import type { AuditEntry } from'@/components/admin/audit-client'

export default async function AdminAuditPage() {
 const session = await getUserSession()
 if (!session || !isAtLeastRole(session,'admin')) {
 redirect('/projektanlage')
 }

 const supabase = await createClient()

 // Fetch last 200 entries (client will show 50 at a time)
 const { data: rawEntries } = await supabase
 .from('user_audit_log')
 .select('id, created_at, actor_id, target_user_id, action, details, ip_address')
 .order('created_at', { ascending: false })
 .limit(200)

 const entries = rawEntries ?? []

 // Batch-fetch actor and target profiles
 const profileIds = new Set<string>()
 for (const e of entries) {
 if (e.actor_id) profileIds.add(e.actor_id as string)
 if (e.target_user_id) profileIds.add(e.target_user_id as string)
 }

 const idList = Array.from(profileIds)
 const { data: profiles } = idList.length > 0
 ? await supabase
 .from('user_profiles')
 .select('id, display_name, email')
 .in('id', idList)
 : { data: [] }

 const profileMap = new Map<string, { display_name: string; email: string }>()
 for (const p of profiles ?? []) {
 profileMap.set(p.id as string, {
 display_name: p.display_name as string,
 email: p.email as string,
 })
 }

 const enrichedEntries: AuditEntry[] = entries.map((e) => ({
 id: e.id as number,
 created_at: e.created_at as string,
 actor_id: (e.actor_id as string | null) ?? null,
 target_user_id: (e.target_user_id as string | null) ?? null,
 action: e.action as string,
 details: (e.details as Record<string, unknown> | null) ?? null,
 ip_address: (e.ip_address as string | null) ?? null,
 actor_display_name: e.actor_id ? (profileMap.get(e.actor_id as string)?.display_name ?? null) : null,
 target_display_name: e.target_user_id ? (profileMap.get(e.target_user_id as string)?.display_name ?? null) : null,
 target_email: e.target_user_id ? (profileMap.get(e.target_user_id as string)?.email ?? null) : null,
 }))

 // Fetch all users for filter dropdowns
 const { data: users } = await supabase
 .from('user_profiles')
 .select('id, display_name, email')
 .is('deleted_at', null)
 .order('display_name')

 const userList = (users ?? []).map((u) => ({
 id: u.id as string,
 display_name: u.display_name as string,
 email: u.email as string,
 }))

 return (
 <>
 <AppHeader title="Audit Log"backHref="/projektanlage"/>
 <main className="px-4 py-6 pb-24 md:pb-8 max-w-7xl mx-auto w-full">
 <AuditClient
 initialEntries={enrichedEntries}
 users={userList}
 session={session}
 />
 </main>
 </>
 )
}
