import { FileText, Pencil, ShieldCheck, UserCheck, X } from 'lucide-react';

import { useCallback, useEffect, useRef, useState } from 'react';

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

import { AdminDataTable } from '@/Components/admin/AdminDataTable';
import { PerPageSelector } from '@/Components/admin/PerPageSelector';
import PageHeader from '@/Components/layout/PageHeader';
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from '@/Components/ui/breadcrumb';
import { Button } from '@/Components/ui/button';
import { ExportButton } from '@/Components/ui/export-button';
import { Input } from '@/Components/ui/input';
import { Label } from '@/Components/ui/label';
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from '@/Components/ui/select';
import { Switch } from '@/Components/ui/switch';
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 { formatDate } from '@/lib/format';
import type { AdminAuditLogsIndexProps } from '@/types/admin';

export default function AdminAuditLogsIndex({
  logs,
  eventTypes,
  filters,
  impersonation_count,
  adminUsers,
}: AdminAuditLogsIndexProps) {
  const [from, setFrom] = useState(filters.from ?? '');
  const [to, setTo] = useState(filters.to ?? '');
  const [userId, setUserId] = useState(filters.user_id ?? '');
  const {
    updateFilter,
    handlePage,
    clearFilters: baseClearFilters,
  } = useAdminFilters({
    route: '/admin/audit-logs',
    filters,
  });

  const debounceRef = useRef<ReturnType<typeof setTimeout>>();
  useEffect(() => () => clearTimeout(debounceRef.current), []);

  const debouncedUpdate = useCallback(
    (updates: Record<string, string | undefined>) => {
      clearTimeout(debounceRef.current);
      debounceRef.current = setTimeout(() => updateFilter(updates), 300);
    },
    [updateFilter],
  );

  const handleUserIdChange = (value: string) => {
    setUserId(value);
    debouncedUpdate({ user_id: value || undefined });
  };
  const handleFromChange = (value: string) => {
    setFrom(value);
    updateFilter({ from: value || undefined });
  };
  const handleToChange = (value: string) => {
    setTo(value);
    updateFilter({ to: value || undefined });
  };

  const clearFilters = () => {
    setFrom('');
    setTo('');
    setUserId('');
    baseClearFilters();
  };
  const isNavigating = useNavigationState();
  const userIdInputRef = useRef<HTMLInputElement>(null);

  useAdminKeyboardShortcuts({
    onSearch: () => userIdInputRef.current?.focus(),
    onNextPage: logs.next_page_url ? () => handlePage(logs.current_page + 1) : undefined,
    onPrevPage: logs.current_page > 1 ? () => handlePage(logs.current_page - 1) : undefined,
  });

  const exportParams: Record<string, string> = {};
  if (filters.event) exportParams.event = filters.event;
  if (filters.user_id) exportParams.user_id = filters.user_id;
  if (filters.from) exportParams.from = filters.from;
  if (filters.to) exportParams.to = filters.to;
  if (filters.impersonation_only) exportParams.impersonation_only = filters.impersonation_only;
  if (filters.admin_actions_only) exportParams.admin_actions_only = filters.admin_actions_only;
  if (filters.operation) exportParams.operation = filters.operation;
  if (filters.mutations_only) exportParams.mutations_only = filters.mutations_only;

  const isMutationsOnly = filters.mutations_only === '1';

  return (
    <AdminLayout>
      <Head title="Admin - Audit Logs" />
      <div className="container pt-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Audit Logs</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>
      </div>
      <PageHeader
        title="Audit Logs"
        subtitle="System activity log"
        actions={<ExportButton href="/admin/audit-logs/export" params={exportParams} />}
      />

      <div className="container py-6 space-y-6">
        {impersonation_count > 0 && (
          <div className="flex items-center gap-2 text-sm text-muted-foreground">
            <UserCheck className="h-4 w-4" />
            <span>
              {impersonation_count} impersonation{' '}
              {impersonation_count === 1 ? 'session' : 'sessions'} in the last 30 days
            </span>
          </div>
        )}

        {/* Quick filter presets */}
        <div className="flex flex-wrap gap-2">
          <Button
            variant={
              filters.admin_actions_only === '1' && !filters.impersonation_only
                ? 'secondary'
                : 'outline'
            }
            size="sm"
            onClick={() => {
              setFrom('');
              setTo('');
              setUserId('');
              updateFilter({
                admin_actions_only: '1',
                impersonation_only: undefined,
                event: undefined,
                user_id: undefined,
                from: undefined,
                to: undefined,
              });
            }}
          >
            <ShieldCheck className="mr-1.5 h-3.5 w-3.5" />
            Admin activity
          </Button>
          <Button
            variant={filters.impersonation_only === '1' ? 'secondary' : 'outline'}
            size="sm"
            onClick={() => {
              setFrom('');
              setTo('');
              setUserId('');
              updateFilter({
                impersonation_only: '1',
                admin_actions_only: undefined,
                event: undefined,
                user_id: undefined,
                from: undefined,
                to: undefined,
                operation: undefined,
              });
            }}
          >
            <UserCheck className="mr-1.5 h-3.5 w-3.5" />
            Impersonation
          </Button>
          <Button
            variant={isMutationsOnly ? 'secondary' : 'outline'}
            size="sm"
            onClick={() => {
              setFrom('');
              setTo('');
              setUserId('');
              updateFilter({
                mutations_only: isMutationsOnly ? undefined : '1',
                impersonation_only: undefined,
                admin_actions_only: undefined,
                operation: undefined,
                event: undefined,
                user_id: undefined,
                from: undefined,
                to: undefined,
              });
            }}
          >
            <Pencil className="mr-1.5 h-3.5 w-3.5" />
            Mutations only
          </Button>
        </div>

        {/* Filters */}
        <fieldset className="flex flex-col sm:flex-row gap-3 flex-wrap items-center">
          <legend className="sr-only">Audit Log Filters</legend>
          <Select
            value={filters.event ?? 'all'}
            onValueChange={(value) => updateFilter({ event: value === 'all' ? undefined : value })}
          >
            <SelectTrigger className="w-full sm:w-50" aria-label="Filter by event type">
              <SelectValue placeholder="All events" />
            </SelectTrigger>
            <SelectContent>
              <SelectItem value="all">All Events</SelectItem>
              {eventTypes.map((event) => (
                <SelectItem key={event} value={event}>
                  {event}
                </SelectItem>
              ))}
            </SelectContent>
          </Select>

          {adminUsers.length > 0 && (
            <Select
              value={filters.user_id ?? 'all'}
              onValueChange={(value) => {
                handleUserIdChange(value === 'all' ? '' : value);
              }}
            >
              <SelectTrigger className="w-full sm:w-50" aria-label="Filter by admin actor">
                <SelectValue placeholder="All admins" />
              </SelectTrigger>
              <SelectContent>
                <SelectItem value="all">All admins</SelectItem>
                {adminUsers.map((admin) => (
                  <SelectItem key={admin.id} value={String(admin.id)}>
                    {admin.name}
                  </SelectItem>
                ))}
              </SelectContent>
            </Select>
          )}

          <div className="flex flex-col gap-1">
            <Input
              ref={userIdInputRef}
              type="text"
              inputMode="numeric"
              pattern="[0-9]*"
              placeholder="User ID"
              value={userId}
              onChange={(e) => handleUserIdChange(e.target.value)}
              className="w-30"
              aria-label="Filter by user ID"
            />
            <span className="text-xs text-muted-foreground">
              Numeric ID —{' '}
              <Link href="/admin/users" className="underline hover:text-foreground">
                find users
              </Link>
            </span>
          </div>

          <Input
            type="date"
            placeholder="From"
            value={from}
            onChange={(e) => handleFromChange(e.target.value)}
            className="w-full sm:w-40"
            aria-label="Filter from date"
          />
          <Input
            type="date"
            placeholder="To"
            value={to}
            onChange={(e) => handleToChange(e.target.value)}
            className="w-full sm:w-40"
            aria-label="Filter to date"
          />

          <div className="flex items-center gap-2">
            <Switch
              id="impersonation-only"
              checked={filters.impersonation_only === '1'}
              onCheckedChange={(checked) =>
                updateFilter({ impersonation_only: checked ? '1' : undefined })
              }
            />
            <Label htmlFor="impersonation-only">Impersonation only</Label>
          </div>

          <div className="flex items-center gap-2">
            <Switch
              id="admin-actions-only"
              checked={filters.admin_actions_only === '1'}
              onCheckedChange={(checked) =>
                updateFilter({ admin_actions_only: checked ? '1' : undefined })
              }
            />
            <Label htmlFor="admin-actions-only">Admin actions only</Label>
          </div>

          {(filters.event ||
            filters.user_id ||
            filters.from ||
            filters.to ||
            filters.impersonation_only ||
            filters.admin_actions_only ||
            filters.mutations_only ||
            filters.operation) && (
            <Button variant="ghost" size="sm" onClick={clearFilters}>
              <X className="mr-1 h-3.5 w-3.5" />
              Clear filters
            </Button>
          )}
          <div className="sm:ml-auto">
            <PerPageSelector
              value={filters.per_page ?? 50}
              onChange={(perPage) => updateFilter({ per_page: perPage })}
            />
          </div>
        </fieldset>

        <AdminDataTable
          isEmpty={logs.data.length === 0}
          isNavigating={isNavigating}
          pagination={logs}
          onPage={handlePage}
          paginationLabel="entries"
          emptyIcon={FileText}
          emptyTitle="No audit logs found"
          emptyDescription={
            filters.event ||
            filters.user_id ||
            filters.from ||
            filters.to ||
            filters.impersonation_only ||
            filters.admin_actions_only ||
            filters.mutations_only ||
            filters.operation
              ? 'No logs match your current filters. Try clearing them.'
              : 'No audit activity recorded yet.'
          }
          emptyAction={
            filters.event ||
            filters.user_id ||
            filters.from ||
            filters.to ||
            filters.impersonation_only ||
            filters.admin_actions_only ||
            filters.mutations_only ||
            filters.operation ? (
              <Button variant="outline" size="sm" onClick={clearFilters}>
                Clear filters
              </Button>
            ) : undefined
          }
        >
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead>Event</TableHead>
                <TableHead>User</TableHead>
                <TableHead>IP</TableHead>
                <TableHead>Date</TableHead>
                <TableHead className="w-[80px]" />
              </TableRow>
            </TableHeader>
            <TableBody>
              {logs.data.map((log) => (
                <TableRow key={log.id}>
                  <TableCell className="max-w-xs">
                    <span
                      className="truncate block font-mono text-sm font-medium"
                      title={log.event ?? ''}
                    >
                      {log.event ?? '—'}
                    </span>
                  </TableCell>
                  <TableCell className="text-sm max-w-[160px]">
                    {log.user_name ? (
                      <Link
                        href={`/admin/users/${log.user_id}`}
                        className="font-medium hover:underline truncate block"
                        title={log.user_name}
                      >
                        {log.user_name}
                      </Link>
                    ) : (
                      <span className="text-muted-foreground">System</span>
                    )}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground font-mono max-w-50 truncate">
                    {log.ip}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {formatDate(log.created_at)}
                  </TableCell>
                  <TableCell>
                    <Button variant="ghost" size="sm" asChild>
                      <Link href={`/admin/audit-logs/${log.id}`}>View</Link>
                    </Button>
                  </TableCell>
                </TableRow>
              ))}
            </TableBody>
          </Table>
        </AdminDataTable>
      </div>
    </AdminLayout>
  );
}
