import { Database, Search } 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 {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from '@/Components/ui/breadcrumb';
import { ExportButton } from '@/Components/ui/export-button';
import { Input } from '@/Components/ui/input';
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 { formatNumber } from '@/lib/format';
import type { PaginatedResponse } from '@/types';

interface GscMetricRow {
  id: number;
  site_id: number;
  site_name: string | null;
  site_domain: string | null;
  date: string;
  page_url: string;
  clicks: number;
  impressions: number;
  ctr: number;
  position: number;
}

interface Stats {
  total_rows: number;
  sites_with_data: number;
  date_min: string | null;
  date_max: string | null;
}

interface Props {
  metrics: PaginatedResponse<GscMetricRow>;
  stats: Stats;
  filters: {
    search?: string;
    date_from?: string;
    date_to?: string;
    sort?: string;
    dir?: string;
    per_page?: number;
  };
}

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

  const exportParams: Record<string, string> = {};
  if (filters.search) exportParams.search = filters.search;
  if (filters.date_from) exportParams.date_from = filters.date_from;
  if (filters.date_to) exportParams.date_to = filters.date_to;

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

  return (
    <AdminLayout>
      <Head title="Admin - GSC Page Metrics" />
      <div className="container pt-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>GSC Page Metrics</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>
      </div>
      <PageHeader
        title="GSC Page Metrics"
        subtitle="Row-level inspection of Google Search Console page metric data"
        actions={<ExportButton href={route('admin.gsc-metrics.export')} params={exportParams} />}
      />

      <div className="container py-8 space-y-4">
        <div className="grid grid-cols-2 gap-4 sm:grid-cols-4">
          <div className="rounded-lg border bg-card p-4">
            <div className="flex items-center gap-2 text-muted-foreground mb-1">
              <Database className="h-4 w-4" />
              <span className="text-xs font-medium">Total Rows</span>
            </div>
            <p className="text-2xl font-bold">{formatNumber(stats.total_rows)}</p>
          </div>
          <div className="rounded-lg border bg-card p-4">
            <div className="text-xs font-medium text-muted-foreground mb-1">Sites With Data</div>
            <p className="text-2xl font-bold">{stats.sites_with_data}</p>
          </div>
          <div className="rounded-lg border bg-card p-4">
            <div className="text-xs font-medium text-muted-foreground mb-1">Earliest Date</div>
            <p className="text-lg font-semibold">{stats.date_min ?? '—'}</p>
          </div>
          <div className="rounded-lg border bg-card p-4">
            <div className="text-xs font-medium text-muted-foreground mb-1">Latest Date</div>
            <p className="text-lg font-semibold">{stats.date_max ?? '—'}</p>
          </div>
        </div>

        <fieldset className="flex flex-col sm:flex-row gap-3 sm:items-center">
          <legend className="sr-only">GSC Metric Filters</legend>
          <Input
            ref={searchInputRef}
            placeholder="Search by page URL, site, or domain..."
            value={search}
            onChange={(e) => setSearch(e.target.value)}
            className="max-w-sm"
            aria-label="Search GSC metrics"
          />
          <Input
            type="date"
            value={filters.date_from ?? ''}
            onChange={(e) => updateFilter({ date_from: e.target.value || undefined })}
            className="w-[160px]"
            aria-label="Filter from date"
          />
          <Input
            type="date"
            value={filters.date_to ?? ''}
            onChange={(e) => updateFilter({ date_to: e.target.value || undefined })}
            className="w-[160px]"
            aria-label="Filter to date"
          />
          <div className="sm:ml-auto">
            <PerPageSelector
              value={filters.per_page ?? 50}
              onChange={(perPage) => updateFilter({ per_page: perPage })}
            />
          </div>
        </fieldset>

        <ChartErrorBoundary label="Unable to load GSC metrics table">
          <AdminDataTable
            isEmpty={metrics.data.length === 0}
            isNavigating={isNavigating}
            isLoading={isNavigating}
            pagination={metrics}
            onPage={handlePage}
            paginationLabel="rows"
            emptyIcon={Search}
            emptyTitle="No GSC metrics found"
            emptyDescription="GSC page metrics will appear here after data is synced."
          >
            <Table>
              <TableHeader>
                <TableRow>
                  <TableHead>Site</TableHead>
                  <SortHeader
                    column="date"
                    label="Date"
                    currentSort={filters.sort}
                    currentDir={filters.dir}
                    onSort={handleSort}
                  />
                  <TableHead className="max-w-xs">Page URL</TableHead>
                  <SortHeader
                    column="clicks"
                    label="Clicks"
                    currentSort={filters.sort}
                    currentDir={filters.dir}
                    onSort={handleSort}
                  />
                  <SortHeader
                    column="impressions"
                    label="Impr."
                    currentSort={filters.sort}
                    currentDir={filters.dir}
                    onSort={handleSort}
                  />
                  <SortHeader
                    column="ctr"
                    label="CTR %"
                    currentSort={filters.sort}
                    currentDir={filters.dir}
                    onSort={handleSort}
                  />
                  <SortHeader
                    column="position"
                    label="Position"
                    currentSort={filters.sort}
                    currentDir={filters.dir}
                    onSort={handleSort}
                  />
                </TableRow>
              </TableHeader>
              <TableBody>
                {metrics.data.map((row) => (
                  <TableRow key={row.id}>
                    <TableCell>
                      <div className="font-medium text-sm">{row.site_name ?? '—'}</div>
                      {row.site_domain && (
                        <div className="text-xs text-muted-foreground">{row.site_domain}</div>
                      )}
                    </TableCell>
                    <TableCell className="font-mono text-xs text-muted-foreground whitespace-nowrap">
                      {row.date}
                    </TableCell>
                    <TableCell className="max-w-xs">
                      <span
                        className="text-xs text-muted-foreground truncate block"
                        title={row.page_url}
                      >
                        {row.page_url}
                      </span>
                    </TableCell>
                    <TableCell className="text-sm font-medium">{formatNumber(row.clicks)}</TableCell>
                    <TableCell className="text-sm text-muted-foreground">
                      {formatNumber(row.impressions)}
                    </TableCell>
                    <TableCell className="text-sm text-muted-foreground">{row.ctr}%</TableCell>
                    <TableCell className="text-sm text-muted-foreground">{row.position}</TableCell>
                  </TableRow>
                ))}
              </TableBody>
            </Table>
          </AdminDataTable>
        </ChartErrorBoundary>
      </div>
    </AdminLayout>
  );
}
