import React from 'react';
import { useQuery } from '@tanstack/react-query';
import { adminApi } from '../../api/admin';
import { AppLayout } from '../../components/layout/AppLayout';
import { StatCard } from '../../components/ui/StatCard';
import { NextMoveWidget } from '../../components/ui/NextMoveWidget';
import { PageLoader } from '../../components/ui/LoadingSpinner';
import { Building2, Users, TrendingUp, DollarSign, AlertTriangle } from 'lucide-react';
import type { DashboardStats } from '../../types';
export function AdminDashboard() {
const { data, isLoading } = useQuery<DashboardStats>({
queryKey: ['admin-overview'],
queryFn: () => adminApi.getOverview(),
});
if (isLoading) {
return (
<AppLayout title="Admin Dashboard">
<PageLoader />
</AppLayout>
);
}
return (
<AppLayout title="Admin Dashboard">
<div className="mb-6">
<h1 className="text-xl sm:text-2xl font-bold text-surface-900">System Overview</h1>
<p className="mt-1 text-sm text-surface-500">
Platform-wide metrics and health status
</p>
</div>
{/* Next Move — Smart Coaching */}
<div className="mb-6">
<NextMoveWidget coachingPath="/admin/coaching" />
</div>
{/* Stats Grid */}
<div className="mb-8 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4">
<StatCard
title="Total Organizations"
value={data?.totalOrganizations ?? 0}
icon={Building2}
iconBg="bg-brand-100 text-brand-600"
href="/admin/organizations"
/>
<StatCard
title="Active Organizations"
value={data?.totalActive ?? 0}
icon={TrendingUp}
iconBg="bg-success/10 text-success"
change={`${data?.totalSuspended ?? 0} suspended`}
changeType="neutral"
href="/admin/organizations"
/>
<StatCard
title="Total Users"
value={data?.totalUsers ?? 0}
icon={Users}
iconBg="bg-warning/10 text-warning"
href="/admin/users"
/>
<StatCard
title="Total Revenue"
value={`$${data?.totalRevenue?.toLocaleString() ?? 0}`}
icon={DollarSign}
iconBg="bg-brand-100 text-brand-600"
/>
</div>
{/* System Health */}
{data?.systemHealth && (
<div className="mb-8 rounded-xl border border-surface-200 bg-white p-5">
<div className="mb-3 flex items-center gap-2">
<AlertTriangle className="h-4 w-4 text-warning" />
<h3 className="text-sm font-semibold text-surface-700">System Health</h3>
</div>
<div className="grid grid-cols-2 gap-4 sm:grid-cols-4">
<div>
<p className="text-xs text-surface-500">Email Failures</p>
<p className={`text-lg font-semibold ${data.systemHealth.emailFailures > 0 ? 'text-error' : 'text-success'}`}>
{data.systemHealth.emailFailures}
</p>
</div>
<div>
<p className="text-xs text-surface-500">Integration Errors</p>
<p className={`text-lg font-semibold ${data.systemHealth.integrationErrors > 0 ? 'text-error' : 'text-success'}`}>
{data.systemHealth.integrationErrors}
</p>
</div>
<div>
<p className="text-xs text-surface-500">Active Alerts</p>
<p className={`text-lg font-semibold ${data.systemHealth.activeAlerts > 0 ? 'text-error' : 'text-success'}`}>
{data.systemHealth.activeAlerts}
</p>
</div>
<div>
<p className="text-xs text-surface-500">Last Sync</p>
<p className="text-lg font-semibold text-surface-900">
{data.systemHealth.lastSync ? new Date(data.systemHealth.lastSync).toLocaleDateString() : 'N/A'}
</p>
</div>
</div>
</div>
)}
{/* Recent Activity */}
<div className="rounded-xl border border-surface-200 bg-white p-5">
<h3 className="mb-3 text-sm font-semibold text-surface-700">Recent Activity</h3>
{data?.recentActivity?.length === 0 ? (
<p className="text-sm text-surface-500">No recent activity</p>
) : (
<div className="space-y-3">
{data?.recentActivity?.map((activity) => (
<div key={activity.id} className="flex items-start gap-3 rounded-lg p-3 hover:bg-surface-50">
<div className="mt-0.5 flex h-8 w-8 items-center justify-center rounded-full bg-brand-100 text-brand-600">
<span className="text-xs">•</span>
</div>
<div className="flex-1 min-w-0">
<p className="text-sm font-medium text-surface-900">{activity.description}</p>
<p className="text-xs text-surface-500">
{activity.timestamp ? new Date(activity.timestamp).toLocaleString() : 'Recent'}
{' · '}
{activity.user_id || 'System'}
</p>
</div>
</div>
))}
</div>
)}
</div>
</AppLayout>
);
}