import { MessageSquare } from 'lucide-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 {
  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 OpportunityFeedbackRow {
  id: number;
  site_id: number | null;
  site_name: string | null;
  site_domain: string | null;
  user_id: number | null;
  user_name: string | null;
  user_email: string | null;
  opportunity_type: string;
  opportunity_id: number;
  feedback_type: string;
  notes: string | null;
  resolved_at: string | null;
  created_at: string;
}

interface Props {
  feedback: PaginatedResponse<OpportunityFeedbackRow>;
  filters: {
    feedback_type?: string;
    opportunity_type?: string;
    sort?: string;
    dir?: string;
  };
  feedback_types: string[];
  opportunity_types: string[];
  stats: {
    total: number;
    resolved: number;
  };
}

function getOpportunityAdminUrl(type: string, id: number): string | null {
  if (type === 'recommendation') return `/admin/recommendations/${id}`;
  if (type === 'freshness') return `/admin/freshness-recommendations/${id}`;
  return null;
}

export default function AdminOpportunityFeedbackIndex({
  feedback,
  filters,
  feedback_types,
  opportunity_types,
  stats,
}: Props) {
  const { updateFilter, handleSort, handlePage } = useAdminFilters({
    route: '/admin/opportunity-feedback',
    filters,
  });
  const isNavigating = useNavigationState();

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

  return (
    <AdminLayout>
      <Head title="Admin - Opportunity Feedback" />
      <div className="container pt-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Opportunity Feedback</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>
      </div>
      <PageHeader
        title="Opportunity Feedback"
        subtitle={`${formatNumber(stats.total)} total · ${formatNumber(stats.resolved)} resolved`}
        actions={
          <ExportButton
            href={route('admin.opportunity-feedback.export')}
            params={{
              ...(filters.feedback_type ? { feedback_type: filters.feedback_type } : {}),
              ...(filters.opportunity_type ? { opportunity_type: filters.opportunity_type } : {}),
            }}
          />
        }
      />

      <div className="container py-8 space-y-4">
        <fieldset className="flex flex-col sm:flex-row gap-3 flex-wrap">
          <legend className="sr-only">Opportunity Feedback Filters</legend>
          {feedback_types.length > 0 && (
            <Select
              value={filters.feedback_type ?? 'all'}
              onValueChange={(v) => updateFilter({ feedback_type: v === 'all' ? undefined : v })}
            >
              <SelectTrigger className="w-[200px]" aria-label="Filter by feedback type">
                <SelectValue placeholder="All Feedback Types" />
              </SelectTrigger>
              <SelectContent>
                <SelectItem value="all">All Feedback Types</SelectItem>
                {feedback_types.map((ft) => (
                  <SelectItem key={ft} value={ft}>
                    {ft.replace(/_/g, ' ')}
                  </SelectItem>
                ))}
              </SelectContent>
            </Select>
          )}
          {opportunity_types.length > 0 && (
            <Select
              value={filters.opportunity_type ?? 'all'}
              onValueChange={(v) =>
                updateFilter({ opportunity_type: v === 'all' ? undefined : v })
              }
            >
              <SelectTrigger className="w-[220px]" aria-label="Filter by opportunity type">
                <SelectValue placeholder="All Opportunity Types" />
              </SelectTrigger>
              <SelectContent>
                <SelectItem value="all">All Opportunity Types</SelectItem>
                {opportunity_types.map((ot) => (
                  <SelectItem key={ot} value={ot}>
                    {ot.replace(/_/g, ' ')}
                  </SelectItem>
                ))}
              </SelectContent>
            </Select>
          )}
        </fieldset>

        <AdminDataTable
          isEmpty={feedback.data.length === 0}
          isNavigating={isNavigating}
          pagination={feedback}
          onPage={handlePage}
          paginationLabel="feedback entries"
          emptyIcon={MessageSquare}
          emptyTitle="No opportunity feedback found"
          emptyDescription="User feedback on opportunities will appear here."
        >
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead>Site</TableHead>
                <TableHead>User</TableHead>
                <TableHead>Opportunity Type</TableHead>
                <TableHead>Feedback</TableHead>
                <TableHead>Notes</TableHead>
                <TableHead>Resolved</TableHead>
                <SortHeader
                  column="created_at"
                  label="Created"
                  currentSort={filters.sort}
                  currentDir={filters.dir}
                  onSort={handleSort}
                />
              </TableRow>
            </TableHeader>
            <TableBody>
              {feedback.data.map((item) => (
                <TableRow key={item.id}>
                  <TableCell>
                    {item.site_id ? (
                      <Link href={`/admin/sites/${item.site_id}`} className="hover:underline">
                        <p className="text-sm font-medium text-primary">{item.site_name ?? '—'}</p>
                        <p className="text-xs text-muted-foreground">{item.site_domain}</p>
                      </Link>
                    ) : (
                      <p className="text-sm text-muted-foreground">—</p>
                    )}
                  </TableCell>
                  <TableCell className="text-sm">
                    {item.user_id ? (
                      <Link href={`/admin/users/${item.user_id}`} className="hover:underline">
                        {item.user_name ?? item.user_email ?? `#${item.user_id}`}
                      </Link>
                    ) : (
                      <span className="text-muted-foreground">—</span>
                    )}
                  </TableCell>
                  <TableCell className="text-sm">
                    {(() => {
                      const url = getOpportunityAdminUrl(item.opportunity_type, item.opportunity_id);
                      return url ? (
                        <div>
                          <span>{item.opportunity_type.replace(/_/g, ' ')}</span>
                          <Link
                            href={url}
                            className="block text-xs text-primary hover:underline"
                          >
                            #{item.opportunity_id} →
                          </Link>
                        </div>
                      ) : (
                        <div>
                          <span>{item.opportunity_type.replace(/_/g, ' ')}</span>
                          <span className="block text-xs text-muted-foreground">
                            #{item.opportunity_id}
                          </span>
                        </div>
                      );
                    })()}
                  </TableCell>
                  <TableCell>
                    <Badge variant="secondary">{item.feedback_type.replace(/_/g, ' ')}</Badge>
                  </TableCell>
                  <TableCell
                    className="max-w-[200px] truncate text-sm text-muted-foreground"
                    title={item.notes ?? undefined}
                  >
                    {item.notes ?? '—'}
                  </TableCell>
                  <TableCell>
                    {item.resolved_at ? (
                      <Badge variant="outline" className="text-xs">
                        {formatRelativeTime(item.resolved_at)}
                      </Badge>
                    ) : (
                      <span className="text-muted-foreground text-sm">—</span>
                    )}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {formatRelativeTime(item.created_at)}
                  </TableCell>
                </TableRow>
              ))}
            </TableBody>
          </Table>
        </AdminDataTable>
      </div>
    </AdminLayout>
  );
}
