import { Radio, Search } from 'lucide-react';

import { useRef } from 'react';

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

import { AdminDataTable } from '@/Components/admin/AdminDataTable';
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 { Button } from '@/Components/ui/button';
import { ConfirmDialog } from '@/Components/ui/confirm-dialog';
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';

interface WebhookEndpointRow {
  id: number;
  url: string;
  active: boolean;
  user_name: string | null;
  user_email: string | null;
  deleted_at: string | null;
  created_at: string;
}

interface PaginatedEndpoints {
  data: WebhookEndpointRow[];
  current_page: number;
  last_page: number;
  from: number | null;
  to: number | null;
  total: number;
}

interface Props {
  endpoints: PaginatedEndpoints;
  filters: { trashed: string; search?: string; active?: string; sort?: string; dir?: string };
}

export default function WebhookEndpointsIndex({ endpoints, filters }: Props) {
  const isNavigating = useNavigationState();
  const searchRef = useRef<HTMLInputElement>(null);

  const { search, setSearch, updateFilter, handleSort, handlePage } = useAdminFilters({
    route: route('admin.webhook-endpoints.index'),
    filters,
  });

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

  return (
    <AdminLayout>
      <Head title="Webhook Endpoints" />
      <div className="container py-6 space-y-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Webhook Endpoints</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>
        <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
          <PageHeader title="Webhook Endpoints" description="Moderate user webhook endpoints — toggle active status or remove problematic endpoints." />
          <div className="flex flex-wrap items-center gap-2">
            <a
              href={route('admin.webhook-endpoints.export')}
              className="inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground"
            >
              Export CSV
            </a>
          </div>
        </div>
        <div className="flex flex-wrap items-center gap-2">
          <div className="relative">
            <Search className="absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" />
            <Input
              ref={searchRef}
              placeholder="Search endpoints…"
              value={search}
              onChange={(e) => setSearch(e.target.value)}
              className="pl-9 w-52"
              aria-label="Search webhook endpoints"
            />
          </div>
          <Select
            value={filters.active ?? 'all'}
            onValueChange={(value) => updateFilter({ active: value === 'all' ? undefined : value })}
          >
            <SelectTrigger className="w-32">
              <SelectValue placeholder="All Status" />
            </SelectTrigger>
            <SelectContent>
              <SelectItem value="all">All Status</SelectItem>
              <SelectItem value="1">Active</SelectItem>
              <SelectItem value="0">Inactive</SelectItem>
            </SelectContent>
          </Select>
          <Select
            value={filters.trashed ?? 'without'}
            onValueChange={(value) => updateFilter({ trashed: value })}
          >
            <SelectTrigger className="w-36">
              <SelectValue />
            </SelectTrigger>
            <SelectContent>
              <SelectItem value="without">Not Deleted</SelectItem>
              <SelectItem value="only">Deleted Only</SelectItem>
              <SelectItem value="with">All</SelectItem>
            </SelectContent>
          </Select>
        </div>

        <AdminDataTable
          isEmpty={endpoints.data.length === 0}
          isNavigating={isNavigating}
          pagination={endpoints}
          onPage={handlePage}
          paginationLabel="webhook endpoints"
          emptyIcon={Radio}
          emptyTitle="No webhook endpoints found"
          emptyDescription={
            filters.trashed === 'only'
              ? 'No deleted webhook endpoints.'
              : 'No webhook endpoints in the system yet.'
          }
        >
          <Table>
            <TableHeader>
              <TableRow>
                <SortHeader column="url" label="URL" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
                <TableHead>User</TableHead>
                <TableHead>Status</TableHead>
                <SortHeader column="created_at" label="Created" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
                {filters.trashed !== 'without' && <TableHead>Deleted</TableHead>}
                <TableHead className="w-[200px]">Actions</TableHead>
              </TableRow>
            </TableHeader>
            <TableBody>
              {endpoints.data.map((endpoint) => (
                <TableRow key={endpoint.id}>
                  <TableCell className="font-medium max-w-xs truncate" title={endpoint.url}>
                    {endpoint.url}
                    {endpoint.deleted_at && (
                      <Badge variant="destructive" className="ml-2">
                        Deleted
                      </Badge>
                    )}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {endpoint.user_name ?? '—'}
                    {endpoint.user_email && (
                      <div className="text-xs text-muted-foreground truncate">{endpoint.user_email}</div>
                    )}
                  </TableCell>
                  <TableCell>
                    <Badge variant={endpoint.active ? 'default' : 'secondary'}>
                      {endpoint.active ? 'Active' : 'Inactive'}
                    </Badge>
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {formatRelativeTime(endpoint.created_at)}
                  </TableCell>
                  {filters.trashed !== 'without' && (
                    <TableCell className="text-sm text-muted-foreground">
                      {endpoint.deleted_at ? formatRelativeTime(endpoint.deleted_at) : '—'}
                    </TableCell>
                  )}
                  <TableCell>
                    <div className="flex items-center gap-2">
                      {!endpoint.deleted_at && (
                        <ConfirmDialog
                          trigger={
                            <Button variant="outline" size="sm">
                              {endpoint.active ? 'Deactivate' : 'Activate'}
                            </Button>
                          }
                          title={endpoint.active ? 'Deactivate webhook?' : 'Activate webhook?'}
                          description={
                            endpoint.active
                              ? `This will stop deliveries to "${endpoint.url}".`
                              : `This will resume deliveries to "${endpoint.url}".`
                          }
                          confirmLabel={endpoint.active ? 'Deactivate' : 'Activate'}
                          onConfirm={() => router.patch(route('admin.webhook-endpoints.toggle-active', endpoint.id))}
                        />
                      )}
                      {!endpoint.deleted_at && (
                        <ConfirmDialog
                          trigger={
                            <Button variant="ghost" size="sm" className="text-destructive hover:text-destructive">
                              Delete
                            </Button>
                          }
                          title="Delete webhook endpoint?"
                          description={`"${endpoint.url}" will be deleted and can be restored later.`}
                          confirmLabel="Delete"
                          variant="destructive"
                          onConfirm={() => router.delete(route('admin.webhook-endpoints.destroy', endpoint.id))}
                        />
                      )}
                      {endpoint.deleted_at && (
                        <ConfirmDialog
                          trigger={
                            <Button variant="outline" size="sm">
                              Restore
                            </Button>
                          }
                          title="Restore webhook endpoint?"
                          description={`"${endpoint.url}" will be restored.`}
                          confirmLabel="Restore"
                          onConfirm={() => router.post(route('admin.webhook-endpoints.restore', endpoint.id))}
                        />
                      )}
                    </div>
                  </TableCell>
                </TableRow>
              ))}
            </TableBody>
          </Table>
        </AdminDataTable>
      </div>
    </AdminLayout>
  );
}
