'use client' import { useEffect, useState } from 'react' import Link from 'next/link' import { Activity, ArrowRight, Building2, ClipboardList, ShieldCheck, Users, WalletCards } from 'lucide-react' import { useAdminI18n } from '@/components/I18nProvider' import { ADMIN_API_BASE } from '@/lib/api' import { canAccessAdminMetrics, useAdminSession } from './AdminSessionContext' interface Metrics { totalCompanies: number activeCompanies: number totalRenters: number totalReservations: number mrr?: number } export default function AdminDashboardPage() { const { language } = useAdminI18n() const admin = useAdminSession() const copy = { en: { kpis: ['Total companies', 'Active companies', 'Total renters', 'Total reservations'], brand: 'RentalDriveGo', eyebrow: 'Operations command', platformOverview: 'RentalDriveGo admin dashboard', subtitle: 'Monitor Carplace health, subscription coverage, renter activity, and operator actions from one control surface.', liveSignal: 'Live platform signal', readiness: 'Operational readiness', readinessBody: 'Core admin workflows are connected and ready for platform support.', quickActions: 'Quick actions', mrr: 'Monthly recurring revenue', noMetrics: 'Metrics are limited for this admin role.', cards: [ ['Companies', 'Search operators, review subscription state, and manage account status.', 'View all'], ['Renters', 'Support renter trust workflows, blocking, and account recovery.', 'View all'], ['Audit logs', 'Trace every sensitive admin action across RentalDriveGo.', 'View logs'], ], health: ['Tenant accounts', 'Carplace identity', 'Admin audit trail'], }, fr: { kpis: ['Entreprises totales', 'Entreprises actives', 'Locataires totaux', 'Réservations totales'], brand: 'RentalDriveGo', eyebrow: 'Centre des opérations', platformOverview: 'Tableau de bord admin RentalDriveGo', subtitle: 'Suivez la santé de la Carplace, les abonnements, l’activité des locataires et les actions opérateur depuis une même interface.', liveSignal: 'Signal plateforme en direct', readiness: 'Disponibilité opérationnelle', readinessBody: 'Les principaux workflows admin sont connectés et prêts pour le support plateforme.', quickActions: 'Actions rapides', mrr: 'Revenu mensuel récurrent', noMetrics: 'Les métriques sont limitées pour ce rôle admin.', cards: [ ['Entreprises', 'Rechercher les opérateurs, vérifier les abonnements et gérer les statuts.', 'Voir tout'], ['Locataires', 'Gérer les workflows de confiance, de blocage et de récupération.', 'Voir tout'], ['Journaux d’audit', 'Tracer chaque action admin sensible dans RentalDriveGo.', 'Voir les journaux'], ], health: ['Comptes locataires', 'Identité Carplace', 'Piste d’audit admin'], }, ar: { kpis: ['إجمالي الشركات', 'الشركات النشطة', 'إجمالي المستأجرين', 'إجمالي الحجوزات'], brand: 'RentalDriveGo', eyebrow: 'مركز العمليات', platformOverview: 'لوحة إدارة RentalDriveGo', subtitle: 'راقب صحة السوق وحالة الاشتراكات ونشاط المستأجرين وإجراءات الإدارة من مساحة واحدة.', liveSignal: 'مؤشر المنصة المباشر', readiness: 'جاهزية التشغيل', readinessBody: 'مسارات الإدارة الأساسية متصلة وجاهزة لدعم المنصة.', quickActions: 'إجراءات سريعة', mrr: 'الإيراد الشهري المتكرر', noMetrics: 'المؤشرات محدودة لهذا الدور الإداري.', cards: [ ['الشركات', 'ابحث عن المشغلين وراجع الاشتراكات وأدر حالة الحساب.', 'عرض الكل'], ['المستأجرون', 'إدارة الثقة والحظر واستعادة الحسابات للمستأجرين.', 'عرض الكل'], ['سجلات التدقيق', 'تتبع كل إجراء إداري حساس داخل RentalDriveGo.', 'عرض السجلات'], ], health: ['حسابات الشركات', 'هوية السوق', 'سجل تدقيق الإدارة'], }, }[language] const [metrics, setMetrics] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { if (!canAccessAdminMetrics(admin)) { setMetrics(null) setLoading(false) return } fetch(`${ADMIN_API_BASE}/admin/metrics`, { credentials: 'include', cache: 'no-store', }) .then(async (response) => { const json = await response.json().catch(() => null) if (!response.ok) { setMetrics(null) return } setMetrics((json?.data ?? json) as Metrics) }) .catch(() => null) .finally(() => setLoading(false)) }, [admin]) const numberFormatter = new Intl.NumberFormat(language === 'ar' ? 'ar-MA' : language === 'fr' ? 'fr-FR' : 'en-US') const currencyFormatter = new Intl.NumberFormat(language === 'ar' ? 'ar-MA' : language === 'fr' ? 'fr-FR' : 'en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0, }) const kpis = metrics ? [ { label: copy.kpis[0], value: metrics.totalCompanies, icon: Building2, tone: 'text-blue-600 dark:text-blue-300', bg: 'bg-blue-50 dark:bg-blue-500/10' }, { label: copy.kpis[1], value: metrics.activeCompanies, icon: Activity, tone: 'text-emerald-600 dark:text-emerald-300', bg: 'bg-emerald-50 dark:bg-emerald-500/10' }, { label: copy.kpis[2], value: metrics.totalRenters, icon: Users, tone: 'text-violet-600 dark:text-violet-300', bg: 'bg-violet-50 dark:bg-violet-500/10' }, { label: copy.kpis[3], value: metrics.totalReservations, icon: ClipboardList, tone: 'text-orange-600 dark:text-orange-300', bg: 'bg-orange-50 dark:bg-orange-500/10' }, ] : [] const activeRate = metrics?.totalCompanies ? Math.round((metrics.activeCompanies / metrics.totalCompanies) * 100) : 0 const renterRatio = metrics?.totalCompanies ? Math.round(metrics.totalRenters / Math.max(metrics.totalCompanies, 1)) : 0 const actionCards = [ { href: '/dashboard/companies', icon: Building2, title: copy.cards[0][0], body: copy.cards[0][1], cta: copy.cards[0][2] }, { href: '/dashboard/renters', icon: Users, title: copy.cards[1][0], body: copy.cards[1][1], cta: copy.cards[1][2] }, { href: '/dashboard/audit-logs', icon: ShieldCheck, title: copy.cards[2][0], body: copy.cards[2][1], cta: copy.cards[2][2] }, ] return (

{copy.eyebrow}

{copy.platformOverview}

{copy.subtitle}

{copy.mrr}

{metrics?.mrr != null ? currencyFormatter.format(metrics.mrr) : '—'}

{copy.health.map((item) => (
{item}
))}

{copy.liveSignal}

{copy.readiness} {activeRate}%

{copy.readinessBody}

{copy.kpis[1]}

{metrics ? numberFormatter.format(metrics.activeCompanies) : '—'}

{copy.kpis[2]}

{metrics ? numberFormatter.format(renterRatio) : '—'}

{loading ? Array.from({ length: 4 }).map((_, i) => (
)) : kpis.length > 0 ? kpis.map((kpi) => { const Icon = kpi.icon return (

{kpi.label}

{numberFormatter.format(kpi.value ?? 0)}

) }) : (

{copy.noMetrics}

)}

{copy.quickActions}

{copy.brand}

{actionCards.map(({ href, icon: Icon, title, body, cta }) => (

{title}

{body}

{cta}

))}
) }