import { Search } from 'lucide-react';

import { useEffect } from 'react';

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


import SiteNav from '@/Components/Navigation/SiteNav';
import { Badge } from '@/Components/ui/badge';
import { Button } from '@/Components/ui/button';
import { EmptyState } from '@/Components/ui/empty-state';
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from '@/Components/ui/table';
import DashboardLayout from '@/Layouts/DashboardLayout';
import { trackProductEvent } from '@/lib/analytics';
import { CANNIBALIZATION_VIEWED } from '@/lib/event-catalog';
import { formatDateOnly, formatNumber, formatPercent } from '@/lib/format';
import type { SiteBasic } from '@/types';

interface CannibalizationRun {
  id: number;
  status: string;
  completed_at: string | null;
}

interface CannibalizationCase {
  id: number;
  query_cluster: string;
  competing_pages_count: number;
  lead_volatility_score: number;
  impact_score: number;
  confidence_score: number;
  primary_page_url: string | null;
  status: string;
  lifecycle_status: string;
  dismissed_at: string | null;
  created_at: string;
}

interface Page {
  id: number;
  page_url: string;
  is_primary: boolean;
  impressions_share: number;
  clicks_share: number;
  avg_position: number;
  metrics_summary: Record<string, unknown> | null;
}

interface Query {
  id: number;
  query: string;
  total_impressions: number;
  total_clicks: number;
  pages_count: number;
  lead_page_switches: number;
}

interface Feedback {
  id: number;
  reason: string;
  notes: string | null;
  created_at: string;
}

interface Props {
  site: SiteBasic;
  cannibalizationRun: CannibalizationRun;
  case: CannibalizationCase;
  pages: Page[];
  queries: Query[];
  feedback: Feedback[];
}

function statusBadge(status: string) {
  const variants: Record<string, 'default' | 'secondary' | 'outline'> = {
    open: 'default',
    closed: 'secondary',
    dismissed: 'outline',
  };
  return variants[status] || 'default';
}

function impactBadge(score: number) {
  if (score >= 70) return { variant: 'destructive' as const, label: 'High Impact' };
  if (score >= 40) return { variant: 'default' as const, label: 'Medium Impact' };
  return { variant: 'secondary' as const, label: 'Low Impact' };
}

function volatilityBadge(score: number) {
  if (score >= 0.7) return { variant: 'destructive' as const, label: 'High Volatility' };
  if (score >= 0.4) return { variant: 'default' as const, label: 'Medium Volatility' };
  return { variant: 'secondary' as const, label: 'Low Volatility' };
}

export default function CannibalizationShow({
  site,
  cannibalizationRun: _cannibalizationRun,
  case: cannibalizationCase,
  pages,
  queries,
  feedback,
}: Props) {
  const impact = impactBadge(cannibalizationCase.impact_score);
  const volatility = volatilityBadge(cannibalizationCase.lead_volatility_score);

  useEffect(() => {
    trackProductEvent(CANNIBALIZATION_VIEWED, { site_id: String(site.id), is_detail_view: true });
  }, [site.id, cannibalizationCase.id]);

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

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

        <div className="flex items-center gap-3 mb-2">
          <Button variant="outline" size="sm" asChild>
            <Link href={route('cannibalization.index', site.id)}>
              &larr; Back to Cannibalization Cases
            </Link>
          </Button>
        </div>

        <div className="flex items-center gap-3 mb-1">
          <h1 className="text-2xl font-bold tracking-tight">{cannibalizationCase.query_cluster}</h1>
          <Badge variant={statusBadge(cannibalizationCase.status)}>
            {cannibalizationCase.status}
          </Badge>
          <Badge variant={impact.variant}>{impact.label}</Badge>
          <Badge variant={volatility.variant}>{volatility.label}</Badge>
        </div>
        <p className="text-sm text-muted-foreground mb-6">
          {cannibalizationCase.competing_pages_count} competing pages
        </p>

        <div className="grid gap-6 lg:grid-cols-2 mb-6">
          <div className="rounded-lg border bg-card p-4">
            <h2 className="text-lg font-semibold mb-3">Case Overview</h2>
            <dl className="grid grid-cols-2 gap-x-6 gap-y-3 text-sm">
              <div>
                <dt className="text-muted-foreground">Impact Score</dt>
                <dd className="font-medium">{cannibalizationCase.impact_score}/100</dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Confidence Score</dt>
                <dd className="font-medium">
                  {formatPercent(cannibalizationCase.confidence_score / 100)}
                </dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Volatility Score</dt>
                <dd className="font-medium">
                  {cannibalizationCase.lead_volatility_score.toFixed(2)}
                </dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Competing Pages</dt>
                <dd className="font-medium">{cannibalizationCase.competing_pages_count}</dd>
              </div>
              {cannibalizationCase.primary_page_url && (
                <div className="col-span-2">
                  <dt className="text-muted-foreground mb-1">Primary Page</dt>
                  <dd className="font-medium text-xs break-all">
                    {cannibalizationCase.primary_page_url}
                  </dd>
                </div>
              )}
            </dl>
          </div>

          <div className="rounded-lg border bg-card p-4">
            <h2 className="text-lg font-semibold mb-3">Queries ({queries.length})</h2>
            {queries.length === 0 ? (
              <EmptyState
                icon={Search}
                title="No queries found"
                description="No competing queries were detected for this cannibalization case."
                size="sm"
              />
            ) : (
              <div className="space-y-2">
                {queries.slice(0, 5).map((query) => (
                  <div key={query.id} className="text-sm">
                    <div className="font-medium">{query.query}</div>
                    <div className="text-muted-foreground text-xs">
                      {formatNumber(query.total_clicks)} clicks, {query.pages_count} pages,{' '}
                      {query.lead_page_switches} switches
                    </div>
                  </div>
                ))}
                {queries.length > 5 && (
                  <p className="text-xs text-muted-foreground">
                    +{queries.length - 5} more queries
                  </p>
                )}
              </div>
            )}
          </div>
        </div>

        <div className="rounded-lg border bg-card p-4 mb-6">
          <h2 className="text-lg font-semibold mb-3">Competing Pages</h2>
          <div className="overflow-x-auto">
            <Table>
              <TableHeader>
                <TableRow>
                  <TableHead>Page URL</TableHead>
                  <TableHead className="text-right">Impressions Share</TableHead>
                  <TableHead className="text-right">Clicks Share</TableHead>
                  <TableHead className="text-right">Avg Position</TableHead>
                  <TableHead className="text-center">Primary</TableHead>
                </TableRow>
              </TableHeader>
              <TableBody>
                {pages.map((page) => (
                  <TableRow key={page.id}>
                    <TableCell className="font-medium text-xs max-w-md truncate">
                      {page.page_url}
                    </TableCell>
                    <TableCell className="text-right">
                      {formatPercent(page.impressions_share)}
                    </TableCell>
                    <TableCell className="text-right">{formatPercent(page.clicks_share)}</TableCell>
                    <TableCell className="text-right">{page.avg_position.toFixed(1)}</TableCell>
                    <TableCell className="text-center">
                      {page.is_primary && (
                        <Badge variant="secondary" className="text-xs">
                          Primary
                        </Badge>
                      )}
                    </TableCell>
                  </TableRow>
                ))}
              </TableBody>
            </Table>
          </div>
        </div>

        {feedback.length > 0 && (
          <div className="rounded-lg border bg-card p-4 mb-6">
            <h2 className="text-lg font-semibold mb-3">Feedback</h2>
            <div className="space-y-3">
              {feedback.map((fb) => (
                <div key={fb.id} className="text-sm">
                  <div className="flex items-center gap-2 mb-1">
                    <Badge variant="outline">{fb.reason}</Badge>
                    <span className="text-xs text-muted-foreground">
                      {formatDateOnly(fb.created_at)}
                    </span>
                  </div>
                  {fb.notes && <p className="text-muted-foreground">{fb.notes}</p>}
                </div>
              ))}
            </div>
          </div>
        )}
      </div>
    </>
  );
}

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