import { Search, TrendingDown } 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 { 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, formatNumber } from '@/lib/format';
import type { PaginatedResponse } from '@/types';

interface FreshnessRecRow {
  id: number;
  page_url: string;
  action_type: string | null;
  impact_score: string | null;
  urgency_score: string | null;
  freshness_score: string | null;
  status: string;
  page_decay_run_id: number | null;
  site_id: number | null;
  site_name: string | null;
  site_domain: string | null;
  created_at: string;
}

interface Props {
  recommendations: PaginatedResponse<FreshnessRecRow>;
  filters: {
    search?: string;
    status?: string;
    action_type?: string;
    sort?: string;
    dir?: string;
  };
  stats: {
    total: number;
    pending: number;
  };
}

const statusVariant = (status: string): 'default' | 'secondary' | 'outline' | 'destructive' => {
  if (status === 'pending') return 'secondary';
  if (status === 'applied') return 'default';
  if (status === 'rejected') return 'destructive';
  return 'outline';
};

export default function AdminFreshnessRecommendationsIndex({
  recommendations,
  filters,
  stats,
}: Props) {
  const searchInputRef = useRef<HTMLInputElement>(null);
  const { search, setSearch, updateFilter, handleSort, handlePage } = useAdminFilters({
    route: '/admin/freshness-recommendations',
    filters,
  });
  const isNavigating = useNavigationState();

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

  return (
    <AdminLayout>
      <Head title="Admin - Freshness Recommendations" />
      <div className="container pt-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Freshness Recommendations</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>
      </div>
      <PageHeader
        title="Freshness Recommendations"
        subtitle={`${formatNumber(stats.total)} total · ${formatNumber(stats.pending)} pending`}
        actions={
          <ExportButton
            href={route('admin.freshness-recommendations.export')}
            params={{
              ...(filters.search ? { search: filters.search } : {}),
              ...(filters.status ? { status: filters.status } : {}),
              ...(filters.action_type ? { action_type: filters.action_type } : {}),
            }}
          />
        }
      />

      <div className="container py-8 space-y-4">
        <fieldset className="flex flex-col sm:flex-row gap-3">
          <legend className="sr-only">Freshness Recommendation Filters</legend>
          <div className="relative flex-1 max-w-sm">
            <Search className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
            <Input
              ref={searchInputRef}
              placeholder="Search by page URL..."
              value={search}
              onChange={(e) => setSearch(e.target.value)}
              className="pl-9"
              aria-label="Search by page URL"
            />
          </div>
          <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>
              <SelectItem value="pending">Pending</SelectItem>
              <SelectItem value="reviewed">Reviewed</SelectItem>
              <SelectItem value="approved">Approved</SelectItem>
              <SelectItem value="rejected">Rejected</SelectItem>
              <SelectItem value="applied">Applied</SelectItem>
            </SelectContent>
          </Select>
        </fieldset>

        <AdminDataTable
          isEmpty={recommendations.data.length === 0}
          isNavigating={isNavigating}
          pagination={recommendations}
          onPage={handlePage}
          paginationLabel="recommendations"
          emptyIcon={TrendingDown}
          emptyTitle="No freshness recommendations found"
          emptyDescription="Content freshness recommendations will appear here after page decay analysis runs."
        >
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead>Page URL</TableHead>
                <TableHead>Site</TableHead>
                <TableHead>Action Type</TableHead>
                <SortHeader
                  column="impact_score"
                  label="Impact"
                  currentSort={filters.sort}
                  currentDir={filters.dir}
                  onSort={handleSort}
                />
                <SortHeader
                  column="urgency_score"
                  label="Urgency"
                  currentSort={filters.sort}
                  currentDir={filters.dir}
                  onSort={handleSort}
                />
                <TableHead>Status</TableHead>
                <SortHeader
                  column="created_at"
                  label="Created"
                  currentSort={filters.sort}
                  currentDir={filters.dir}
                  onSort={handleSort}
                />
                <TableHead className="w-16" />
              </TableRow>
            </TableHeader>
            <TableBody>
              {recommendations.data.map((rec) => (
                <TableRow key={rec.id}>
                  <TableCell
                    className="max-w-[240px] truncate text-xs font-mono"
                    title={rec.page_url}
                  >
                    {rec.page_url}
                  </TableCell>
                  <TableCell>
                    {rec.site_id ? (
                      <div className="space-y-0.5">
                        <Link href={`/admin/sites/${rec.site_id}`} className="hover:underline">
                          <p className="text-sm font-medium text-primary">{rec.site_name ?? '—'}</p>
                          <p className="text-xs text-muted-foreground">{rec.site_domain}</p>
                        </Link>
                        {rec.page_decay_run_id && (
                          <Link
                            href={`/admin/page-decay-runs`}
                            className="text-xs text-muted-foreground hover:underline"
                          >
                            Decay Run #{rec.page_decay_run_id}
                          </Link>
                        )}
                      </div>
                    ) : (
                      <p className="text-sm text-muted-foreground">—</p>
                    )}
                  </TableCell>
                  <TableCell className="text-sm">
                    {rec.action_type?.replace(/_/g, ' ') ?? '—'}
                  </TableCell>
                  <TableCell className="text-sm">
                    {rec.impact_score != null ? Number(rec.impact_score).toFixed(1) : '—'}
                  </TableCell>
                  <TableCell className="text-sm">
                    {rec.urgency_score != null ? Number(rec.urgency_score).toFixed(1) : '—'}
                  </TableCell>
                  <TableCell>
                    <Badge variant={statusVariant(rec.status)}>{rec.status}</Badge>
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {formatRelativeTime(rec.created_at)}
                  </TableCell>
                  <TableCell>
                    <Link
                      href={`/admin/freshness-recommendations/${rec.id}`}
                      className="text-xs text-primary hover:underline"
                    >
                      View →
                    </Link>
                  </TableCell>
                </TableRow>
              ))}
            </TableBody>
          </Table>
        </AdminDataTable>
      </div>
    </AdminLayout>
  );
}
