import { Radio } from 'lucide-react';

import { useRef } from 'react';

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

import { AdminDataTable } from '@/Components/admin/AdminDataTable';
import { ChartErrorBoundary } from '@/Components/admin/ChartErrorBoundary';
import { PerPageSelector } from '@/Components/admin/PerPageSelector';
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 IncomingWebhookRow {
  id: number;
  provider: string;
  external_id: string | null;
  event_type: string | null;
  status: string;
  created_at: string;
  updated_at: string;
}

interface Props {
  webhooks: PaginatedResponse<IncomingWebhookRow>;
  filters: {
    search?: string;
    status?: string;
    provider?: string;
    sort?: string;
    dir?: string;
    per_page?: number;
  };
  statuses: string[];
  providers: string[];
}

function statusVariant(status: string): 'default' | 'secondary' | 'destructive' | 'outline' {
  switch (status) {
    case 'processed': return 'default';
    case 'processing': return 'secondary';
    case 'failed': return 'destructive';
    default: return 'outline';
  }
}

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

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

  return (
    <AdminLayout>
      <Head title="Admin - Incoming Webhooks" />
      <div className="container pt-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Incoming Webhooks</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>
      </div>
      <PageHeader
        title="Incoming Webhooks"
        subtitle="Incoming webhook events received from external providers"
        actions={<ExportButton href={route('admin.incoming-webhooks.export')} params={exportParams} />}
      />

      <div className="container py-8 space-y-4">
        <fieldset className="flex flex-col sm:flex-row gap-3 sm:items-center flex-wrap">
          <legend className="sr-only">Incoming Webhook Filters</legend>
          <Input
            ref={searchInputRef}
            placeholder="Search by provider, event type, or ID..."
            value={search}
            onChange={(e) => setSearch(e.target.value)}
            className="max-w-sm"
            aria-label="Search incoming webhooks"
          />
          <Select
            value={filters.status ?? 'all'}
            onValueChange={(v) => updateFilter({ status: v === 'all' ? undefined : v })}
          >
            <SelectTrigger className="w-[160px]" 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}</SelectItem>
              ))}
            </SelectContent>
          </Select>
          {providers.length > 0 && (
            <Select
              value={filters.provider ?? 'all'}
              onValueChange={(v) => updateFilter({ provider: v === 'all' ? undefined : v })}
            >
              <SelectTrigger className="w-[160px]" aria-label="Filter by provider">
                <SelectValue placeholder="All Providers" />
              </SelectTrigger>
              <SelectContent>
                <SelectItem value="all">All Providers</SelectItem>
                {providers.map((p) => (
                  <SelectItem key={p} value={p}>{p}</SelectItem>
                ))}
              </SelectContent>
            </Select>
          )}
          <div className="sm:ml-auto">
            <PerPageSelector
              value={filters.per_page ?? 50}
              onChange={(perPage) => updateFilter({ per_page: perPage })}
            />
          </div>
        </fieldset>

        <ChartErrorBoundary label="Unable to load incoming webhooks table">
          <AdminDataTable
            isEmpty={webhooks.data.length === 0}
            isNavigating={isNavigating}
            isLoading={isNavigating}
            pagination={webhooks}
            onPage={handlePage}
            paginationLabel="webhooks"
            emptyIcon={Radio}
            emptyTitle="No incoming webhooks found"
            emptyDescription="Incoming webhook events will appear here once received from external providers."
          >
            <Table>
              <TableHeader>
                <TableRow>
                  <TableHead>ID</TableHead>
                  <SortHeader column="provider" label="Provider" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
                  <TableHead>External ID</TableHead>
                  <TableHead>Event Type</TableHead>
                  <SortHeader column="status" label="Status" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
                  <SortHeader column="created_at" label="Received" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
                </TableRow>
              </TableHeader>
              <TableBody>
                {webhooks.data.map((webhook) => (
                  <TableRow key={webhook.id}>
                    <TableCell className="font-mono text-xs text-muted-foreground">#{webhook.id}</TableCell>
                    <TableCell>
                      <span className="font-medium text-sm">{webhook.provider}</span>
                    </TableCell>
                    <TableCell className="font-mono text-xs text-muted-foreground">
                      {webhook.external_id ?? '—'}
                    </TableCell>
                    <TableCell className="text-sm">
                      {webhook.event_type ?? '—'}
                    </TableCell>
                    <TableCell>
                      <Badge variant={statusVariant(webhook.status)}>{webhook.status}</Badge>
                    </TableCell>
                    <TableCell className="text-sm text-muted-foreground">
                      {formatRelativeTime(webhook.created_at)}
                    </TableCell>
                  </TableRow>
                ))}
              </TableBody>
            </Table>
          </AdminDataTable>
        </ChartErrorBoundary>
      </div>
    </AdminLayout>
  );
}
