import { Clock, Link2, Users } from 'lucide-react';

import { Suspense, lazy } from 'react';

import { Head, Link } from '@inertiajs/react';

import { AdminStatsGrid, type StatCard } from '@/Components/admin/AdminStatsGrid';
import PageHeader from '@/Components/layout/PageHeader';
import { Badge } from '@/Components/ui/badge';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/Components/ui/card';
import { EmptyState } from '@/Components/ui/empty-state';
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from '@/Components/ui/table';
import AdminLayout from '@/Layouts/AdminLayout';
import { formatProviderName, formatRelativeTime } from '@/lib/format';
import type { AdminSocialAuthDashboardProps } from '@/types/admin';

// Chart loading fallback
const ChartLoader = () => (
  <div className="flex h-[300px] items-center justify-center">
    <div className="h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent" />
  </div>
);

// Lazy load provider pie chart
const LazyProviderChart = lazy(async () => {
  const { PieChart, Pie, Cell, ChartContainer, ChartTooltip, Legend, CHART_COLORS } =
    await import('@/Components/ui/chart');
  return {
    default: ({ data }: { data: { provider: string; count: number }[] }) => (
      <ChartContainer height={300}>
        <PieChart>
          <Pie
            data={data}
            dataKey="count"
            nameKey="provider"
            cx="50%"
            cy="50%"
            outerRadius={100}
            label={({ name, value }) => `${name}: ${value}`}
          >
            {data.map((_entry, index) => (
              <Cell key={`cell-${index}`} fill={CHART_COLORS[index % CHART_COLORS.length]} />
            ))}
          </Pie>
          <ChartTooltip />
          <Legend />
        </PieChart>
      </ChartContainer>
    ),
  };
});

export default function SocialAuthDashboard({ stats, linked_accounts }: AdminSocialAuthDashboardProps) {
  const providerData = Object.entries(stats.by_provider).map(([provider, count]) => ({
    provider: formatProviderName(provider),
    count,
  }));

  return (
    <AdminLayout>
      <Head title="Admin - Social Auth" />
      <PageHeader title="Social Authentication" description="OAuth provider statistics" />

      <div className="container py-6 space-y-6">
        {/* Stats */}
        <AdminStatsGrid
          columns="grid-cols-1 md:grid-cols-3"
          stats={
            [
              { title: 'Linked Accounts', value: stats.total_linked, icon: Link2 },
              { title: 'Users with Social Auth', value: stats.users_with_social, icon: Users },
              { title: 'Expired Tokens', value: stats.expired_tokens, icon: Clock },
            ] satisfies StatCard[]
          }
        />

        {/* Provider Distribution */}
        <Card>
          <CardHeader>
            <CardTitle>Accounts by Provider</CardTitle>
            <CardDescription>Distribution of linked OAuth accounts</CardDescription>
          </CardHeader>
          <CardContent>
            {providerData.length === 0 ? (
              <EmptyState
                icon={Link2}
                title="No linked accounts"
                description="OAuth provider data will appear here."
                size="sm"
                animated={false}
              />
            ) : (
              <Suspense fallback={<ChartLoader />}>
                <LazyProviderChart data={providerData} />
              </Suspense>
            )}
          </CardContent>
        </Card>
        {/* Linked Accounts */}
        <Card>
          <CardHeader>
            <CardTitle>Recent Linked Accounts</CardTitle>
            <CardDescription>Users who most recently linked an OAuth account</CardDescription>
          </CardHeader>
          <CardContent className="p-0">
            {linked_accounts.length === 0 ? (
              <EmptyState
                icon={Link2}
                title="No linked accounts"
                description="OAuth linked accounts will appear here."
                size="sm"
                animated={false}
              />
            ) : (
              <div className="overflow-x-auto">
                <Table>
                  <TableHeader>
                    <TableRow>
                      <TableHead>User</TableHead>
                      <TableHead>Provider</TableHead>
                      <TableHead>Linked</TableHead>
                    </TableRow>
                  </TableHeader>
                  <TableBody>
                    {linked_accounts.map((account, i) => (
                      <TableRow key={`${account.user_id}-${account.provider}-${i}`}>
                        <TableCell>
                          <Link href={`/admin/users/${account.user_id}`} className="font-medium hover:underline">
                            {account.user_name}
                          </Link>
                          <div className="text-xs text-muted-foreground">{account.user_email}</div>
                        </TableCell>
                        <TableCell>
                          <Badge variant="secondary">{formatProviderName(account.provider)}</Badge>
                        </TableCell>
                        <TableCell className="text-sm text-muted-foreground">
                          {formatRelativeTime(account.created_at)}
                        </TableCell>
                      </TableRow>
                    ))}
                  </TableBody>
                </Table>
              </div>
            )}
          </CardContent>
        </Card>
      </div>
    </AdminLayout>
  );
}
