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 { SettingsForm } from './settings-form'
import { BrokerDefaults } from './broker-defaults'
import { resolveLanguagePrefs } from '@/lib/domain/languages'
import { getCompanyContext } from '@/lib/data/companies'
import { CompanyAccessCard } from './company-access-card'
import { SecurityCard } from './security-card'
import { getMfaState } from '@/lib/security/mfa'
import { loadPreferences } from '@/lib/email/send'
import { notExpired } from '@/lib/domain/time'
import { EmailAddressCard, EmailPreferencesCard } from './email-cards'
import Link from 'next/link'
import { Card, CardContent } from '@/components/ui/card'
import { FEATURE_EXPLANATION, FEATURE_NAME, FEATURE_TAGLINE } from '@/lib/domain/auto-participants'
import { CARD_PITCH } from '@/components/app/auto-participants-explainer'

/** Settings — UI preview; brokers also manage their permit-handling defaults here. */
export default async function SettingsPage() {
  const user = await getSessionUser()
  if (!user) redirect('/login')
  const profile = (await getProfile())!

  // Broker defaults (order-intake doc §22) — tolerant until migration 0009.
  let brokerDefaults: { policy: string; payment: string } | null = null
  if (user.role === 'broker') {
    const admin = createAdminClient()
    const { data } = await admin
      .from('broker_pages')
      .select('*')
      .eq('owner_id', user.id)
      .maybeSingle()
    if (data) {
      brokerDefaults = {
        policy: data.default_permit_policy ?? 'ask',
        payment: data.default_payment_party ?? 'ask',
      }
    }
  }

  // Company verification (Task 89) — brokers and carriers/dispatchers only;
  // Nash: "the drivers do not need any validation from the carrier."
  const companyCtx =
    user.role === 'broker' || user.role === 'dispatcher' ? await getCompanyContext(user.id) : null

  const mfa = await getMfaState(user.id)
  const emailPrefs = await loadPreferences(user.id)
  const deliveryAddress = (profile.delivery_email || profile.email).trim().toLowerCase()
  const { data: sups } = await createAdminClient().from('email_suppressions').select('reason, expires_at').eq('email_normalized', deliveryAddress).eq('scope', 'global').is('overridden_at', null)
  const activeSup = (sups ?? []).find((x) => notExpired(x.expires_at)) ?? null

  return (
    <AppShell profile={profile}>
      <main className="mx-auto max-w-2xl px-4 py-8">
        <BackLink />
        <h1 className="mt-3 text-2xl font-bold tracking-tight">Settings</h1>
        <p className="mt-1 text-sm text-neutral-500">Notifications, language, security, and account options.</p>
        <SecurityCard state={mfa} isAdmin={user.role === 'admin'} />
        <EmailAddressCard email={profile.email} deliveryEmail={profile.delivery_email ?? null} pendingEmail={profile.pending_email ?? null} suppressed={activeSup ? { reason: activeSup.reason, temporary: activeSup.reason === 'repeated_soft_bounce' } : null} />
        <EmailPreferencesCard prefs={emailPrefs.prefs} available={emailPrefs.available} />
        {/* Auto-Participants (Task 9.2, D7): the canonical screen is /settings/auto-participants. */}
        <Card className="mt-6">
          <CardContent className="pt-6">
            <div className="flex flex-wrap items-center justify-between gap-2">
              <h3 className="text-sm font-bold uppercase tracking-wide text-neutral-500">{FEATURE_NAME} — {FEATURE_TAGLINE}</h3>
              <Link href="/settings/auto-participants" className="rounded-lg border bg-white px-3 py-1.5 text-xs font-bold text-neutral-800 transition hover:bg-neutral-50">Manage</Link>
            </div>
            <p className="mt-2 text-xs text-neutral-600">{FEATURE_EXPLANATION}</p>
            <p className="mt-1 text-xs text-neutral-600">{CARD_PITCH}</p>
          </CardContent>
        </Card>
        {companyCtx && (
          <div className="mt-6">
            <CompanyAccessCard
              available={companyCtx.available}
              company={companyCtx.company}
              membership={companyCtx.membership}
              claim={companyCtx.claim}
            />
          </div>
        )}
        {brokerDefaults && (
          <BrokerDefaults
            initialPolicy={brokerDefaults.policy as 'synchron_required' | 'upload_allowed' | 'ask'}
            initialPayment={brokerDefaults.payment as 'broker' | 'carrier' | 'ask'}
          />
        )}
        <SettingsForm
          userId={user.id}
          initialLanguages={resolveLanguagePrefs(profile).languages}
          initialPrimary={resolveLanguagePrefs(profile).primary}
        />
      </main>
    </AppShell>
  )
}
