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 { BackLink } from '@/components/app/back-link'
import { isCompanySchemaMissing } from '@/lib/data/companies'
import { CompanyReviewConsole, type ReviewItem } from './company-review-console'
import type {
  Company, CompanyAuditEvent, CompanyClaim, CompanyMembership, CompanyVerificationRecord,
} from '@/types/db'

/**
 * Company verification — manual review queue (Task 93; article §19).
 * Admin-gated like the Moderator Dashboard. Queue = claims flagged for
 * review + companies nobody owns yet + logged slug conflicts.
 */
export default async function CompanyReviewPage() {
  const user = await getSessionUser()
  if (!user) redirect('/login')
  if (user.role !== 'admin') redirect('/dashboard')
  const profile = (await getProfile())!
  const admin = createAdminClient()

  const claimsRes = await admin
    .from('company_claims')
    .select('*')
    .in('claim_status', ['admin_review_required', 'company_verification_pending'])
    .order('created_at', { ascending: false })
    .limit(200)

  if (isCompanySchemaMissing(claimsRes.error)) {
    return (
      <AppShell profile={profile}>
        <main className="mx-auto max-w-3xl px-4 py-8">
          <BackLink />
          <h1 className="mt-3 text-2xl font-bold">Company Review</h1>
          <p className="mt-3 rounded-xl border bg-white p-5 text-sm text-neutral-600">
            Company verification needs database migration 0013 — apply
            <span className="font-mono"> supabase/migrations/0013_company_verification.sql</span> in the
            Supabase SQL editor.
          </p>
        </main>
      </AppShell>
    )
  }

  const claims = (claimsRes.data ?? []) as CompanyClaim[]
  const [companiesRes, membershipsRes, conflictsRes] = await Promise.all([
    admin.from('companies').select('*').is('merged_into', null).order('created_at', { ascending: false }).limit(500),
    admin.from('company_memberships').select('*').eq('status', 'approved'),
    admin
      .from('company_audit_log')
      .select('*')
      .eq('event_type', 'slug_conflict')
      .order('created_at', { ascending: false })
      .limit(50),
  ])
  const companies = (companiesRes.data ?? []) as Company[]
  const approved = (membershipsRes.data ?? []) as CompanyMembership[]
  const ownerless = new Set(
    companies
      .filter((c) => !approved.some((m) => m.company_id === c.id && (m.role === 'company_owner' || m.role === 'company_admin')))
      .map((c) => c.id),
  )

  const userIds = [...new Set([...claims.map((c) => c.user_id), ...approved.map((m) => m.user_id)])]
  const { data: profiles } =
    userIds.length > 0
      ? await admin.from('profiles').select('id, full_name, email, phone, default_role').in('id', userIds)
      : { data: [] }
  const profileMap = new Map(
    ((profiles ?? []) as { id: string; full_name: string; email: string; phone: string | null; default_role: string }[]).map(
      (p) => [p.id, p],
    ),
  )
  const companyIds = [...new Set([...claims.map((c) => c.company_id), ...ownerless])]
  const { data: records } =
    companyIds.length > 0
      ? await admin.from('company_verification_records').select('*').in('company_id', companyIds).order('created_at', { ascending: false })
      : { data: [] }

  const items: ReviewItem[] = claims.map((claim) => {
    const p = profileMap.get(claim.user_id)
    return {
      kind: 'claim',
      claim,
      company: companies.find((c) => c.id === claim.company_id) ?? null,
      requester: p ? { id: p.id, name: p.full_name, email: p.email, phone: p.phone, role: p.default_role } : null,
      records: ((records ?? []) as CompanyVerificationRecord[]).filter((r) => r.company_id === claim.company_id),
    }
  })
  // Companies nobody owns and no open claim covers (e.g. placeholder from an
  // unknown MC whose claim is still with the corporate email).
  for (const c of companies) {
    if (!ownerless.has(c.id)) continue
    if (items.some((i) => i.company?.id === c.id)) continue
    items.push({
      kind: 'company',
      claim: null,
      company: c,
      requester: null,
      records: ((records ?? []) as CompanyVerificationRecord[]).filter((r) => r.company_id === c.id),
    })
  }

  return (
    <AppShell profile={profile}>
      <CompanyReviewConsole
        items={items}
        companies={companies.map((c) => ({ id: c.id, display_name: c.display_name, mc_number: c.mc_number, company_type: c.company_type }))}
        users={[...profileMap.values()].map((p) => ({ id: p.id, name: p.full_name, email: p.email }))}
        conflicts={(conflictsRes.data ?? []) as CompanyAuditEvent[]}
      />
    </AppShell>
  )
}
