import { redirect } from 'next/navigation'
import { getProfile, getSessionUser } from '@/lib/auth'
import { createAdminClient } from '@/lib/supabase/admin'
import { AppShell } from '@/components/app/app-shell'
import { DEFAULT_MODERATION_SETTINGS } from '@/lib/domain/moderation'
import { ModerationConsole, type TicketView } from './moderation-console'
import type { DeveloperIssue, ReviewTicket, TicketEvent } from '@/types/db'

/**
 * Moderator Dashboard (internal, admin-gated) — the review console for AI
 * answers that received negative feedback or an AI-side warning signal.
 * "When the AI makes a mistake, the platform should not just apologize. The
 * platform should learn." Tolerant of missing tables/columns until
 * migrations 0009/0012 are applied.
 */
export default async function ModerationPage() {
  const user = await getSessionUser()
  if (!user) redirect('/login')
  if (user.role !== 'admin') redirect('/dashboard')
  const profile = (await getProfile())!

  const admin = createAdminClient()
  const { data: ticketRows } = await admin
    .from('review_tickets')
    .select('*')
    .order('created_at', { ascending: false })
    .limit(500)
  const tickets = (ticketRows ?? []) as ReviewTicket[]

  let views: TicketView[] = []
  let events: TicketEvent[] = []
  let developerIssues: DeveloperIssue[] = []
  if (tickets.length > 0) {
    const ticketIds = tickets.map((t) => t.id)
    const messageIds = [
      ...new Set(
        tickets.flatMap((t) => [t.message_id, t.question_message_id].filter(Boolean) as string[]),
      ),
    ]
    const tripIds = [...new Set(tickets.map((t) => t.trip_id))]
    const permitIds = [...new Set(tickets.map((t) => t.permit_id).filter(Boolean) as string[])]
    const [msgs, trips, permits, evts, issues] = await Promise.all([
      admin
        .from('chat_messages')
        .select('id, content, author_label, created_at, sources')
        .in('id', messageIds),
      admin.from('trips').select('id, ref_code, origin, destination, carrier_name').in('id', tripIds),
      permitIds.length > 0
        ? admin.from('permits').select('*').in('id', permitIds)
        : Promise.resolve({ data: [] }),
      admin.from('ticket_events').select('*').in('ticket_id', ticketIds).order('created_at'),
      admin
        .from('developer_issues')
        .select('*')
        .in('ticket_id', ticketIds)
        .order('created_at', { ascending: false }),
    ])
    const msgMap = new Map((msgs.data ?? []).map((m) => [m.id, m]))
    const tripMap = new Map((trips.data ?? []).map((t) => [t.id, t]))
    const permitMap = new Map(((permits.data ?? []) as { id: string }[]).map((p) => [p.id, p]))
    events = (evts.data ?? []) as TicketEvent[]
    developerIssues = (issues.data ?? []) as DeveloperIssue[]

    // Signed permit-file links for the source-evidence tab (one batch).
    const permitDocs = new Map<string, string>()
    const docIds = ((permits.data ?? []) as Array<{ document_id: string | null }>)
      .map((p) => p.document_id)
      .filter(Boolean) as string[]
    if (docIds.length > 0) {
      const { data: docs } = await admin
        .from('documents')
        .select('id, storage_path')
        .in('id', [...new Set(docIds)])
      const pathByDoc = new Map((docs ?? []).map((d) => [d.id, d.storage_path]))
      await Promise.all(
        ((permits.data ?? []) as Array<{ id: string; document_id: string | null }>).map(async (p) => {
          const path = p.document_id ? pathByDoc.get(p.document_id) : null
          if (!path) return
          const { data: signed } = await admin.storage
            .from('trip-documents')
            .createSignedUrl(path, 60 * 30)
          if (signed?.signedUrl) permitDocs.set(p.id, signed.signedUrl)
        }),
      )
    }

    views = tickets.map((t) => {
      const trip = tripMap.get(t.trip_id)
      const answer = msgMap.get(t.message_id)
      const question = t.question_message_id ? msgMap.get(t.question_message_id) : undefined
      return {
        ticket: t,
        question: (question?.content as string | undefined) ?? null,
        questionAuthor: (question?.author_label as string | undefined) ?? null,
        answer: (answer?.content as string | undefined) ?? '(answer no longer available)',
        answerSources: (answer?.sources as string[] | null | undefined) ?? t.sources ?? null,
        tripRef: trip?.ref_code ?? '',
        tripLane: trip ? `${trip.origin || 'Origin TBD'} → ${trip.destination || 'Destination TBD'}` : '',
        carrierName: trip?.carrier_name ?? '',
        permit: t.permit_id ? ((permitMap.get(t.permit_id) as TicketView['permit']) ?? null) : null,
        permitUrl: t.permit_id ? (permitDocs.get(t.permit_id) ?? null) : null,
      }
    })
  }

  // Settings (§3 categories, §22 reviewer per state) — defaults until saved
  // or until migration 0012 exists.
  const settings = { ...DEFAULT_MODERATION_SETTINGS }
  const { data: settingRows } = await admin.from('moderation_settings').select('*')
  for (const row of settingRows ?? []) {
    if (row.key === 'categories' && Array.isArray(row.value)) settings.categories = row.value as string[]
    if (row.key === 'state_reviewers' && row.value && typeof row.value === 'object') {
      settings.state_reviewers = row.value as Record<string, string>
    }
  }

  return (
    <AppShell profile={profile}>
      <ModerationConsole
        views={views}
        events={events}
        developerIssues={developerIssues}
        settings={settings}
        adminName={user.name || user.email}
      />
    </AppShell>
  )
}
