import { Network } from 'lucide-react';

import { useRef } from 'react';

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

import { AdminDataTable } from '@/Components/admin/AdminDataTable';
import { SortHeader } from '@/Components/admin/SortHeader';
import PageHeader from '@/Components/layout/PageHeader';
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from '@/Components/ui/breadcrumb';
import { ExportButton } from '@/Components/ui/export-button';
import { Input } from '@/Components/ui/input';
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from '@/Components/ui/table';
import { useAdminFilters } from '@/hooks/useAdminFilters';
import { useAdminKeyboardShortcuts } from '@/hooks/useAdminKeyboardShortcuts';
import { useNavigationState } from '@/hooks/useNavigationState';
import AdminLayout from '@/Layouts/AdminLayout';
import { formatRelativeTime, formatNumber } from '@/lib/format';
import type { PaginatedResponse } from '@/types';

interface TopicClusterRow {
  id: number;
  name: string;
  site_name: string | null;
  site_domain: string | null;
  topic_cluster_run_id: number;
  total_demand: number;
  coverage_percentage: number | null;
  hub_page_url: string | null;
  created_at: string;
}

interface Props {
  clusters: PaginatedResponse<TopicClusterRow>;
  filters: { search?: string; run_id?: string; sort?: string; dir?: string };
}

export default function AdminTopicClustersIndex({ clusters, filters }: Props) {
  const searchInputRef = useRef<HTMLInputElement>(null);
  const { search, setSearch, handleSort, handlePage } = useAdminFilters({
    route: '/admin/topic-clusters',
    filters,
  });
  const isNavigating = useNavigationState();
  const exportParams: Record<string, string> = {};
  if (filters.search) exportParams.search = filters.search;
  if (filters.run_id) exportParams.run_id = filters.run_id;

  useAdminKeyboardShortcuts({ onSearch: () => searchInputRef.current?.focus() });

  return (
    <AdminLayout>
      <Head title="Admin - Topic Clusters" />
      <div className="container pt-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild><Link href="/admin">Admin</Link></BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbLink asChild><Link href="/admin/topic-cluster-runs">Topic Cluster Runs</Link></BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Topic Clusters</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>
      </div>
      <PageHeader
        title="Topic Clusters"
        subtitle="Individual topic clusters across all clustering runs"
        actions={<ExportButton href={route('admin.topic-clusters.export')} params={exportParams} />}
      />

      <div className="container py-8 space-y-4">
        <fieldset className="flex flex-col sm:flex-row gap-3">
          <legend className="sr-only">Filters</legend>
          <Input
            ref={searchInputRef}
            placeholder="Search by cluster name or site..."
            value={search}
            onChange={(e) => setSearch(e.target.value)}
            className="max-w-sm"
            aria-label="Search topic clusters"
          />
        </fieldset>

        <AdminDataTable
          isEmpty={clusters.data.length === 0}
          isNavigating={isNavigating}
          pagination={clusters}
          onPage={handlePage}
          paginationLabel="clusters"
          emptyIcon={Network}
          emptyTitle="No topic clusters"
          emptyDescription="Topic clusters will appear here after clustering runs complete."
        >
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead>ID</TableHead>
                <TableHead>Cluster Name</TableHead>
                <TableHead>Site</TableHead>
                <TableHead>Run</TableHead>
                <SortHeader column="total_demand" label="Demand" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
                <SortHeader column="coverage_percentage" label="Coverage" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
                <TableHead>Hub URL</TableHead>
                <SortHeader column="created_at" label="Created" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
              </TableRow>
            </TableHeader>
            <TableBody>
              {clusters.data.map((cluster) => (
                <TableRow key={cluster.id}>
                  <TableCell className="font-mono text-xs text-muted-foreground">#{cluster.id}</TableCell>
                  <TableCell>
                    <div className="font-medium max-w-[200px] truncate" title={cluster.name}>
                      {cluster.name}
                    </div>
                  </TableCell>
                  <TableCell>
                    <div className="font-medium">{cluster.site_name ?? '—'}</div>
                    {cluster.site_domain && <div className="text-xs text-muted-foreground">{cluster.site_domain}</div>}
                  </TableCell>
                  <TableCell>
                    <Link
                      href={`/admin/topic-cluster-runs?id=${cluster.topic_cluster_run_id}`}
                      className="font-mono text-xs text-muted-foreground hover:text-foreground"
                    >
                      #{cluster.topic_cluster_run_id}
                    </Link>
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">{formatNumber(cluster.total_demand)}</TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {cluster.coverage_percentage !== null ? `${cluster.coverage_percentage.toFixed(1)}%` : '—'}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground max-w-[160px] truncate" title={cluster.hub_page_url ?? undefined}>
                    {cluster.hub_page_url ?? '—'}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">{formatRelativeTime(cluster.created_at)}</TableCell>
                </TableRow>
              ))}
            </TableBody>
          </Table>
        </AdminDataTable>
      </div>
    </AdminLayout>
  );
}
