import { BarChart2, Search, TrendingUp } 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';

interface KeywordOpportunityRow {
  id: number;
  site_id: number | null;
  site_name: string | null;
  site_domain: string | null;
  opportunity_type: string;
  query: string;
  page_url: string | null;
  impact_score: string | null;
  lifecycle_status: string | null;
  created_at: string;
}

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

interface Stats {
  total: number;
  striking_distance: number;
  ctr_gap: number;
  rising_query: number;
}

interface Props {
  opportunities: PaginatedOpportunities;
  filters: { opportunity_type: string; lifecycle_status: string; search?: string; sort?: string; dir?: string };
  stats: Stats;
}

const opportunityTypeVariant = (type: string): 'default' | 'secondary' | 'outline' => {
  switch (type) {
    case 'striking_distance':
      return 'default';
    case 'ctr_gap':
      return 'secondary';
    case 'rising_query':
      return 'default';
    default:
      return 'outline';
  }
};

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

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

  const statCards: StatCard[] = [
    { title: 'Total', value: stats.total, icon: TrendingUp },
    { title: 'Striking Distance', value: stats.striking_distance, icon: BarChart2 },
    { title: 'CTR Gap', value: stats.ctr_gap, icon: BarChart2 },
    { title: 'Rising Queries', value: stats.rising_query, icon: TrendingUp },
  ];

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

  const currentPage = opportunities.current_page;
  const lastPage = opportunities.last_page;
  useAdminKeyboardShortcuts({
    onNextPage: currentPage < lastPage ? () => handlePage(currentPage + 1) : undefined,
    onPrevPage: currentPage > 1 ? () => handlePage(currentPage - 1) : undefined,
  });

  return (
    <AdminLayout>
      <Head title="Keyword Opportunities" />
      <div className="container py-6 space-y-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Keyword Opportunities</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>

        <AdminStatsGrid stats={statCards} />

        <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
          <PageHeader
            title="Keyword Opportunities"
            description="Detected keyword opportunities across all sites."
            actions={
              <ExportButton
                href={route('admin.keyword-opportunities.export')}
                params={{
                  ...(filters.opportunity_type ? { opportunity_type: filters.opportunity_type } : {}),
                  ...(filters.lifecycle_status ? { lifecycle_status: filters.lifecycle_status } : {}),
                }}
              />
            }
          />
          <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 queries…"
                value={search}
                onChange={(e) => setSearch(e.target.value)}
                className="pl-9 w-48"
                aria-label="Search keyword opportunities"
              />
            </div>
            <Select
              value={filters.opportunity_type || 'all'}
              onValueChange={(value) => updateFilter({ opportunity_type: value === 'all' ? '' : value })}
            >
              <SelectTrigger className="w-48">
                <SelectValue placeholder="Opportunity type" />
              </SelectTrigger>
              <SelectContent>
                <SelectItem value="all">All Types</SelectItem>
                <SelectItem value="striking_distance">Striking Distance</SelectItem>
                <SelectItem value="ctr_gap">CTR Gap</SelectItem>
                <SelectItem value="rising_query">Rising Query</SelectItem>
                <SelectItem value="content_gap">Content Gap</SelectItem>
              </SelectContent>
            </Select>
            <Select
              value={filters.lifecycle_status || 'all'}
              onValueChange={(value) => updateFilter({ lifecycle_status: value === 'all' ? '' : value })}
            >
              <SelectTrigger className="w-40">
                <SelectValue placeholder="Lifecycle" />
              </SelectTrigger>
              <SelectContent>
                <SelectItem value="all">All Statuses</SelectItem>
                <SelectItem value="pending">Pending</SelectItem>
                <SelectItem value="active">Active</SelectItem>
                <SelectItem value="dismissed">Dismissed</SelectItem>
                <SelectItem value="applied">Applied</SelectItem>
              </SelectContent>
            </Select>
          </div>
        </div>

        <AdminDataTable
          isEmpty={opportunities.data.length === 0}
          isNavigating={isNavigating}
          pagination={opportunities}
          onPage={handlePage}
          paginationLabel="keyword opportunities"
          emptyIcon={TrendingUp}
          emptyTitle="No keyword opportunities found"
        >
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead>Query</TableHead>
                <TableHead>Type</TableHead>
                <TableHead>Site</TableHead>
                <TableHead>Page URL</TableHead>
                <SortHeader
                  column="impact_score"
                  label="Impact"
                  currentSort={filters.sort}
                  currentDir={filters.dir}
                  onSort={handleSort}
                />
                <TableHead>Lifecycle</TableHead>
                <SortHeader
                  column="created_at"
                  label="Created"
                  currentSort={filters.sort}
                  currentDir={filters.dir}
                  onSort={handleSort}
                />
                <TableHead className="w-16" />
              </TableRow>
            </TableHeader>
            <TableBody>
              {opportunities.data.map((opp) => (
                <TableRow key={opp.id}>
                  <TableCell className="font-medium">{opp.query}</TableCell>
                  <TableCell>
                    <Badge variant={opportunityTypeVariant(opp.opportunity_type)}>
                      {opp.opportunity_type.replace(/_/g, ' ')}
                    </Badge>
                  </TableCell>
                  <TableCell>
                    <div className="text-sm">
                      <div>{opp.site_name ?? '—'}</div>
                      <div className="text-muted-foreground">{opp.site_domain}</div>
                    </div>
                  </TableCell>
                  <TableCell className="max-w-40 truncate text-sm text-muted-foreground">
                    {opp.page_url ?? '—'}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {opp.impact_score !== null ? Number(opp.impact_score).toFixed(2) : '—'}
                  </TableCell>
                  <TableCell>
                    {opp.lifecycle_status ? (
                      <Badge variant="outline">{opp.lifecycle_status}</Badge>
                    ) : (
                      <span className="text-muted-foreground">—</span>
                    )}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {formatRelativeTime(opp.created_at)}
                  </TableCell>
                  <TableCell>
                    <Link
                      href={route('admin.keyword-opportunities.show', { keywordOpportunity: opp.id })}
                      className="text-xs text-primary hover:underline"
                    >
                      View →
                    </Link>
                  </TableCell>
                </TableRow>
              ))}
            </TableBody>
          </Table>
        </AdminDataTable>
      </div>
    </AdminLayout>
  );
}
