import { Palette } 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 {
  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';
import type { PaginatedResponse } from '@/types';

interface UserBrandingRow {
  id: number;
  user_id: number;
  user_name: string | null;
  user_email: string | null;
  company_name: string | null;
  primary_color: string | null;
  secondary_color: string | null;
  custom_domain: string | null;
  is_domain_verified: boolean;
  remove_rankwiz_branding: boolean;
  logo_path: string | null;
  created_at: string;
}

interface Stats {
  total: number;
  with_custom_domain: number;
  domain_verified: number;
  remove_branding: number;
}

interface Props {
  brandings: PaginatedResponse<UserBrandingRow>;
  stats: Stats;
  filters: { search?: string; sort?: string; dir?: string };
}

export default function AdminUserBrandingsIndex({ brandings, stats, filters }: Props) {
  const searchInputRef = useRef<HTMLInputElement>(null);
  const { search, setSearch, handleSort, handlePage } = useAdminFilters({
    route: '/admin/user-brandings',
    filters,
  });
  const isNavigating = useNavigationState();
  const exportParams: Record<string, string> = {};
  if (filters.search) exportParams.search = filters.search;

  useAdminKeyboardShortcuts({ onSearch: () => searchInputRef.current?.focus() });

  return (
    <AdminLayout>
      <Head title="Admin - User Brandings" />
      <div className="container pt-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild><Link href="/admin">Admin</Link></BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>User Brandings</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>
      </div>
      <PageHeader
        title="User Brandings"
        subtitle="White-label branding configurations across all users"
        actions={<ExportButton href={route('admin.user-brandings.export')} params={exportParams} />}
      />

      <div className="container py-8 space-y-6">
        <dl className="grid grid-cols-2 sm:grid-cols-4 gap-4">
          <div className="rounded-lg border bg-card p-4">
            <dt className="text-xs text-muted-foreground uppercase tracking-wide">Total</dt>
            <dd className="mt-1 text-2xl font-semibold">{stats.total}</dd>
          </div>
          <div className="rounded-lg border bg-card p-4">
            <dt className="text-xs text-muted-foreground uppercase tracking-wide">Custom Domain</dt>
            <dd className="mt-1 text-2xl font-semibold">{stats.with_custom_domain}</dd>
          </div>
          <div className="rounded-lg border bg-card p-4">
            <dt className="text-xs text-muted-foreground uppercase tracking-wide">Domain Verified</dt>
            <dd className="mt-1 text-2xl font-semibold">{stats.domain_verified}</dd>
          </div>
          <div className="rounded-lg border bg-card p-4">
            <dt className="text-xs text-muted-foreground uppercase tracking-wide">Removed Branding</dt>
            <dd className="mt-1 text-2xl font-semibold">{stats.remove_branding}</dd>
          </div>
        </dl>

        <fieldset className="flex flex-col sm:flex-row gap-3">
          <legend className="sr-only">Filters</legend>
          <Input
            ref={searchInputRef}
            placeholder="Search by company, domain, or user..."
            value={search}
            onChange={(e) => setSearch(e.target.value)}
            className="max-w-sm"
            aria-label="Search user brandings"
          />
        </fieldset>

        <AdminDataTable
          isEmpty={brandings.data.length === 0}
          isNavigating={isNavigating}
          pagination={brandings}
          onPage={handlePage}
          paginationLabel="brandings"
          emptyIcon={Palette}
          emptyTitle="No user brandings"
          emptyDescription="Users who configure white-label branding will appear here."
        >
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead>ID</TableHead>
                <TableHead>User</TableHead>
                <SortHeader column="company_name" label="Company" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
                <TableHead>Colors</TableHead>
                <TableHead>Custom Domain</TableHead>
                <TableHead>Flags</TableHead>
                <SortHeader column="created_at" label="Created" currentSort={filters.sort} currentDir={filters.dir} onSort={handleSort} />
              </TableRow>
            </TableHeader>
            <TableBody>
              {brandings.data.map((branding) => (
                <TableRow key={branding.id}>
                  <TableCell className="font-mono text-xs text-muted-foreground">#{branding.id}</TableCell>
                  <TableCell>
                    <div className="font-medium">{branding.user_name ?? '—'}</div>
                    {branding.user_email && <div className="text-xs text-muted-foreground">{branding.user_email}</div>}
                  </TableCell>
                  <TableCell>
                    <div className="font-medium">{branding.company_name ?? <span className="text-muted-foreground">—</span>}</div>
                  </TableCell>
                  <TableCell>
                    <div className="flex gap-1.5 items-center">
                      {branding.primary_color && (
                        <span
                          className="inline-block w-4 h-4 rounded-full border border-border"
                          style={{ backgroundColor: branding.primary_color }}
                          title={`Primary: ${branding.primary_color}`}
                          aria-label={`Primary color ${branding.primary_color}`}
                        />
                      )}
                      {branding.secondary_color && (
                        <span
                          className="inline-block w-4 h-4 rounded-full border border-border"
                          style={{ backgroundColor: branding.secondary_color }}
                          title={`Secondary: ${branding.secondary_color}`}
                          aria-label={`Secondary color ${branding.secondary_color}`}
                        />
                      )}
                      {!branding.primary_color && !branding.secondary_color && <span className="text-muted-foreground text-sm">—</span>}
                    </div>
                  </TableCell>
                  <TableCell>
                    {branding.custom_domain ? (
                      <div>
                        <div className="text-sm">{branding.custom_domain}</div>
                        {branding.is_domain_verified && (
                          <Badge variant="success" className="mt-0.5 text-[10px] h-4">Verified</Badge>
                        )}
                      </div>
                    ) : (
                      <span className="text-muted-foreground text-sm">—</span>
                    )}
                  </TableCell>
                  <TableCell>
                    {branding.remove_rankwiz_branding && (
                      <Badge variant="secondary" className="text-[10px] h-5">No branding</Badge>
                    )}
                    {branding.logo_path && (
                      <Badge variant="outline" className="text-[10px] h-5 ml-1">Logo</Badge>
                    )}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">{formatRelativeTime(branding.created_at)}</TableCell>
                </TableRow>
              ))}
            </TableBody>
          </Table>
        </AdminDataTable>
      </div>
    </AdminLayout>
  );
}
