import { Activity, CheckCircle, Layers, Package, XCircle } from 'lucide-react';

import { useRef } from 'react';

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

import { AdminDataTable } from '@/Components/admin/AdminDataTable';
import { AdminStatsGrid, type StatCard } from '@/Components/admin/AdminStatsGrid';
import { SortHeader } from '@/Components/admin/SortHeader';
import PageHeader from '@/Components/layout/PageHeader';
import { Badge } from '@/Components/ui/badge';
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 {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from '@/Components/ui/select';
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 } from '@/lib/format';
import type { PaginatedResponse } from '@/types';

interface BatchJobRow {
  id: number;
  site_id: number | null;
  site_name: string | null;
  site_domain: string | null;
  user_id: number | null;
  user_email: string | null;
  status: string;
  total_jobs: number;
  completed_jobs: number;
  failed_jobs: number;
  progress_percent: number;
  total_actual_cost: string | null;
  started_at: string | null;
  completed_at: string | null;
  created_at: string;
}

interface Props {
  jobs: PaginatedResponse<BatchJobRow>;
  stats: {
    total: number;
    processing: number;
    completed: number;
    failed: number;
    pending: number;
  };
  filters: {
    search?: string;
    status?: string;
    sort?: string;
    dir?: string;
  };
  statuses: string[];
}

const STATUS_VARIANTS: Record<string, 'default' | 'secondary' | 'success' | 'destructive' | 'warning' | 'outline'> = {
  pending: 'secondary',
  processing: 'warning',
  completed: 'success',
  failed: 'destructive',
  cancelled: 'outline',
};

export default function AdminBatchJobsIndex({ jobs, stats, filters, statuses }: Props) {
  const searchInputRef = useRef<HTMLInputElement>(null);
  const { search, setSearch, updateFilter, handleSort, handlePage } = useAdminFilters({
    route: '/admin/batch-jobs',
    filters,
  });
  const isNavigating = useNavigationState();
  const exportParams: Record<string, string> = {};
  if (filters.search) exportParams.search = filters.search;
  if (filters.status) exportParams.status = filters.status;

  useAdminKeyboardShortcuts({
    onSearch: () => searchInputRef.current?.focus(),
    onNextPage: jobs.current_page < jobs.last_page ? () => handlePage(jobs.current_page + 1) : undefined,
    onPrevPage: jobs.current_page > 1 ? () => handlePage(jobs.current_page - 1) : undefined,
  });

  const statCards: StatCard[] = [
    { title: 'Total', value: stats.total, icon: Layers },
    {
      title: 'Processing',
      value: stats.processing,
      icon: Activity,
      valueClassName: stats.processing > 0 ? 'text-primary' : '',
    },
    { title: 'Completed', value: stats.completed, icon: CheckCircle },
    {
      title: 'Failed',
      value: stats.failed,
      icon: XCircle,
      valueClassName: stats.failed > 0 ? 'text-destructive' : '',
    },
  ];

  return (
    <AdminLayout>
      <Head title="Admin - Batch Jobs" />
      <div className="container pt-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Batch Jobs</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>
      </div>
      <PageHeader
        title="Batch Jobs"
        subtitle="Batch AI generation job history across all sites"
        actions={<ExportButton href={route('admin.batch-jobs.export')} params={exportParams} />}
      />

      <div className="container py-8 space-y-4">
        <AdminStatsGrid stats={statCards} />

        <fieldset className="flex flex-col sm:flex-row gap-3">
          <legend className="sr-only">Batch Job Filters</legend>
          <Input
            ref={searchInputRef}
            placeholder="Search by site or user email..."
            value={search}
            onChange={(e) => setSearch(e.target.value)}
            className="max-w-sm"
            aria-label="Search batch jobs"
          />
          <Select
            value={filters.status ?? 'all'}
            onValueChange={(v) => updateFilter({ status: v === 'all' ? undefined : v })}
          >
            <SelectTrigger className="w-[180px]" aria-label="Filter by status">
              <SelectValue placeholder="All Statuses" />
            </SelectTrigger>
            <SelectContent>
              <SelectItem value="all">All Statuses</SelectItem>
              {statuses.map((s) => (
                <SelectItem key={s} value={s}>
                  {s.charAt(0).toUpperCase() + s.slice(1)}
                </SelectItem>
              ))}
            </SelectContent>
          </Select>
        </fieldset>

        <AdminDataTable
          isEmpty={jobs.data.length === 0}
          isNavigating={isNavigating}
          pagination={jobs}
          onPage={handlePage}
          paginationLabel="batch jobs"
          emptyIcon={Package}
          emptyTitle="No batch jobs found"
          emptyDescription="Batch AI generation jobs will appear here."
        >
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead>ID</TableHead>
                <TableHead>Site</TableHead>
                <TableHead>User</TableHead>
                <SortHeader column="status" label="Status" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
                <TableHead>Progress</TableHead>
                <TableHead>Cost</TableHead>
                <SortHeader column="created_at" label="Created" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
                <TableHead className="w-16" />
              </TableRow>
            </TableHeader>
            <TableBody>
              {jobs.data.map((job) => (
                <TableRow key={job.id}>
                  <TableCell className="font-mono text-xs text-muted-foreground">#{job.id}</TableCell>
                  <TableCell>
                    {job.site_id ? (
                      <Link href={`/admin/sites/${job.site_id}`} className="font-medium hover:underline">
                        {job.site_name ?? '—'}
                      </Link>
                    ) : (
                      <div className="font-medium">{job.site_name ?? '—'}</div>
                    )}
                    {job.site_domain && (
                      <div className="text-xs text-muted-foreground">{job.site_domain}</div>
                    )}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {job.user_id ? (
                      <Link href={`/admin/users/${job.user_id}`} className="hover:underline">
                        {job.user_email ?? '—'}
                      </Link>
                    ) : (
                      job.user_email ?? '—'
                    )}
                  </TableCell>
                  <TableCell>
                    <Badge variant={STATUS_VARIANTS[job.status] ?? 'secondary'}>{job.status}</Badge>
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    <div>{job.completed_jobs}/{job.total_jobs}</div>
                    {job.failed_jobs > 0 && (
                      <div className="text-xs text-destructive">({job.failed_jobs} failed)</div>
                    )}
                    <div className="text-xs text-muted-foreground">{job.progress_percent}%</div>
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {job.total_actual_cost ? `$${Number(job.total_actual_cost).toFixed(4)}` : '—'}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {formatRelativeTime(job.created_at)}
                  </TableCell>
                  <TableCell>
                    <Link
                      href={route('admin.batch-jobs.show', { batchJob: job.id })}
                      className="text-xs text-primary hover:underline"
                    >
                      View
                    </Link>
                  </TableCell>
                </TableRow>
              ))}
            </TableBody>
          </Table>
        </AdminDataTable>
      </div>
    </AdminLayout>
  );
}
