import { toast } from 'sonner';

import { useEffect } from 'react';

import { Head, router } from '@inertiajs/react';


import SiteNav from '@/Components/Navigation/SiteNav';
import ClusterCard from '@/Components/TopicClusters/ClusterCard';
import { Button } from '@/Components/ui/button';
import { EmptyState } from '@/Components/ui/empty-state';
import DashboardLayout from '@/Layouts/DashboardLayout';
import { trackProductEvent } from '@/lib/analytics';
import { TOPIC_CLUSTERS_VIEWED } from '@/lib/event-catalog';
import type { SiteBasic } from '@/types';

interface TopicCluster {
  id: number;
  name: string;
  total_demand: number;
  coverage_percentage: number;
  hub_page_url: string | null;
  metadata: {
    representative_queries?: string[];
    [key: string]: unknown;
  };
  page_count: number;
  query_count: number;
  gap_count: number;
}

interface TopicClusterRun {
  id: number;
  status: string;
  started_at: string | null;
  completed_at: string | null;
  summary: Record<string, unknown> | null;
}

interface Props {
  site: SiteBasic;
  clusters: TopicCluster[];
  latestRun: TopicClusterRun | null;
  filters: { coverage: string | null; demand: string | null };
  counts: {
    total: number;
    high_coverage: number;
    low_coverage: number;
  };
}

export default function TopicClustersIndex({ site, clusters, latestRun, filters, counts }: Props) {
  useEffect(() => {
    trackProductEvent(TOPIC_CLUSTERS_VIEWED, { site_id: String(site.id) });
  }, [site.id]);

  const handleRecompute = () => {
    router.post(
      route('topic-clusters.recompute', site.id),
      {},
      {
        onSuccess: () => toast.success('Topic cluster analysis queued.'),
      },
    );
  };

  const handleFilterByCoverage = (coverage: string | null) => {
    router.get(
      route('topic-clusters.index', site.id),
      { coverage, demand: filters.demand },
      { preserveState: true, replace: true },
    );
  };

  const handleFilterByDemand = (demand: string) => {
    router.get(
      route('topic-clusters.index', site.id),
      { coverage: filters.coverage, demand },
      { preserveState: true, replace: true },
    );
  };

  return (
    <>
      <Head title={`${site.name} - Topic Clusters`} />

      <div className="container py-6">
        <SiteNav
          siteId={site.id}
          canAnalyze
          canRecommend
          canCannibalization
          canOpportunityMap
          canGeographic
          canDevice
        />

        <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4">
          <h1 className="text-2xl font-bold tracking-tight">Topic Coverage Gaps</h1>
          {latestRun && <Button onClick={handleRecompute}>Recompute Clusters</Button>}
        </div>

        {!latestRun && (
          <EmptyState
            title="No topic clusters"
            description="Run topic clustering to identify content gaps and opportunities."
            action={<Button onClick={handleRecompute}>Run Topic Clustering</Button>}
          />
        )}

        {latestRun && counts.total === 0 && (
          <EmptyState
            title="No clusters found"
            description="No topic clusters were identified. Your site may need more content or traffic data."
          />
        )}

        {latestRun && counts.total > 0 && (
          <>
            <div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between mb-4">
              <div className="flex flex-wrap items-center gap-2">
                <Button
                  variant={!filters.coverage ? 'default' : 'outline'}
                  size="sm"
                  onClick={() => handleFilterByCoverage(null)}
                >
                  All ({counts.total})
                </Button>
                <Button
                  variant={filters.coverage === 'high' ? 'default' : 'outline'}
                  size="sm"
                  onClick={() => handleFilterByCoverage('high')}
                >
                  High Coverage ({counts.high_coverage})
                </Button>
                <Button
                  variant={filters.coverage === 'low' ? 'default' : 'outline'}
                  size="sm"
                  onClick={() => handleFilterByCoverage('low')}
                >
                  Low Coverage ({counts.low_coverage})
                </Button>
              </div>

              <div className="flex items-center gap-2">
                <label htmlFor="demand-filter" className="text-sm font-medium">
                  Min Demand:
                </label>
                <select
                  id="demand-filter"
                  className="rounded-md border border-input bg-background px-3 py-1.5 text-sm"
                  value={filters.demand || ''}
                  onChange={(e) => handleFilterByDemand(e.target.value)}
                >
                  <option value="">All</option>
                  <option value="100">100+</option>
                  <option value="500">500+</option>
                  <option value="1000">1,000+</option>
                  <option value="5000">5,000+</option>
                </select>
              </div>
            </div>

            <div className="space-y-4">
              {clusters.map((cluster) => (
                <ClusterCard key={cluster.id} cluster={cluster} siteId={site.id} />
              ))}
            </div>

            {clusters.length === 0 && (
              <EmptyState
                title="No clusters match your filters"
                description="Try adjusting your filters to see more results."
                action={<Button onClick={() => handleFilterByCoverage(null)}>Clear Filters</Button>}
              />
            )}
          </>
        )}
      </div>
    </>
  );
}

TopicClustersIndex.layout = (page: React.ReactNode) => <DashboardLayout>{page}</DashboardLayout>;
