import { useEffect, useState } from 'react';

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

import SiteNav from '@/Components/Navigation/SiteNav';
import GenerateDraftButton from '@/Components/Recommendations/GenerateDraftButton';
import StatusBadge from '@/Components/Recommendations/StatusBadge';
import StatusChangeModal from '@/Components/Recommendations/StatusChangeModal';
import MetricDelta from '@/Components/Shared/MetricDelta';
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from '@/Components/ui/breadcrumb';
import { Button } from '@/Components/ui/button';
import DashboardLayout from '@/Layouts/DashboardLayout';
import { trackProductEvent } from '@/lib/analytics';
import type { SiteBasic } from '@/types';

const ACTION_LABELS: Record<string, string> = {
  content_rewrite: 'AI Draft',
  noindex: 'Remove from Index',
  meta_tag_optimization: 'Meta Tag Optimisation',
  internal_linking: 'Internal Linking',
  thin_content: 'Thin Content',
};

function actionLabel(type: string): string {
  return ACTION_LABELS[type] ?? type;
}

interface Finding {
  id: number;
  page_url: string;
  delta_percent: number;
  direction: string;
  metric_before: number;
  metric_after: number;
  segment_type: string;
  supporting_data: Record<string, unknown> | null;
}

interface Recommendation {
  id: number;
  page_url: string;
  action_type: string;
  impact_score: number;
  confidence_score: number;
  title: string;
  reasoning: string;
  evidence: {
    clicks_before: number;
    clicks_after: number;
    delta_percent: number;
    position_before?: number;
    position_after?: number;
  };
  lifecycle_status: string;
  has_draft: boolean;
  latest_draft_id: number | null;
}

interface AnalysisRun {
  id: number;
  status: string;
  before_start: string;
  before_end: string;
  after_start: string;
  after_end: string;
}

interface Props {
  site: SiteBasic;
  recommendation: Recommendation;
  finding: Finding | null;
  analysis_run: AnalysisRun;
  ai_available?: boolean;
}

export default function RecommendationShow({
  site,
  recommendation,
  finding,
  analysis_run: analysisRun,
  ai_available: aiAvailable = false,
}: Props) {
  const [statusModalOpen, setStatusModalOpen] = useState(false);
  const evidence = recommendation.evidence;

  useEffect(() => {
    trackProductEvent('recommendation_detail_viewed', {
      recommendation_id: recommendation.id,
      action_type: recommendation.action_type,
      site_id: String(site.id),
    });
    // intentional: fire-once page-view event on mount; props are stable Inertia values
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

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

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

        <nav className="mb-4">
          <Breadcrumb>
            <BreadcrumbList>
              <BreadcrumbItem>
                <BreadcrumbLink asChild>
                  <Link href={route('analysis.recommendations.index', [site.id, analysisRun.id])}>
                    Recommendations
                  </Link>
                </BreadcrumbLink>
              </BreadcrumbItem>
              <BreadcrumbSeparator />
              <BreadcrumbItem>
                <BreadcrumbPage>{recommendation.title}</BreadcrumbPage>
              </BreadcrumbItem>
            </BreadcrumbList>
          </Breadcrumb>
        </nav>

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

        <div className="flex flex-wrap items-center gap-3 mb-1">
          <h1 className="text-2xl font-bold tracking-tight">{recommendation.title}</h1>
          <StatusBadge status={recommendation.lifecycle_status} />
          <span className="text-sm text-muted-foreground">
            {actionLabel(recommendation.action_type)}
          </span>
        </div>
        <div className="flex flex-wrap items-center gap-2 mb-6">
          <p className="text-sm text-muted-foreground">{recommendation.page_url}</p>
          <Button variant="outline" size="sm" onClick={() => setStatusModalOpen(true)}>
            Change Status
          </Button>
          {recommendation.action_type === 'content_rewrite' && (
            <GenerateDraftButton
              siteId={site.id}
              recommendationId={recommendation.id}
              aiAvailable={aiAvailable}
            />
          )}
        </div>

        <div className="grid gap-6 lg:grid-cols-2">
          <div className="rounded-lg border bg-card p-4">
            <h2 className="text-lg font-semibold mb-3">Reasoning</h2>
            <p className="text-sm text-muted-foreground">{recommendation.reasoning}</p>

            <div className="mt-4 flex items-center gap-4 text-sm">
              <div>
                <span className="text-muted-foreground">Impact: </span>
                <span className="font-medium">{recommendation.impact_score}/100</span>
              </div>
              <div>
                <span className="text-muted-foreground">Confidence: </span>
                <span className="font-medium">
                  {Math.round(recommendation.confidence_score * 100)}%
                </span>
              </div>
            </div>
          </div>

          <div className="rounded-lg border bg-card p-4">
            <h2 className="text-lg font-semibold mb-3">Evidence</h2>
            <dl className="grid grid-cols-2 gap-x-6 gap-y-3 text-sm">
              <div>
                <dt className="text-muted-foreground">Clicks (before)</dt>
                <dd className="font-medium">{evidence.clicks_before}</dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Clicks (after)</dt>
                <dd className="font-medium">{evidence.clicks_after}</dd>
              </div>
              <div className="col-span-2">
                <dt className="text-muted-foreground">Change</dt>
                <dd>
                  <MetricDelta value={evidence.delta_percent} format="percent" />
                </dd>
              </div>
              {evidence.position_before != null && (
                <>
                  <div>
                    <dt className="text-muted-foreground">Position (before)</dt>
                    <dd className="font-medium">{evidence.position_before}</dd>
                  </div>
                  <div>
                    <dt className="text-muted-foreground">Position (after)</dt>
                    <dd className="font-medium">{evidence.position_after}</dd>
                  </div>
                </>
              )}
            </dl>
          </div>
        </div>

        {finding && (
          <div className="mt-6 rounded-lg border bg-card p-4">
            <h2 className="text-lg font-semibold mb-3">Finding Details</h2>
            <dl className="grid grid-cols-2 gap-x-6 gap-y-3 text-sm sm:grid-cols-4">
              <div>
                <dt className="text-muted-foreground">Metric Before</dt>
                <dd className="font-medium">{finding.metric_before}</dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Metric After</dt>
                <dd className="font-medium">{finding.metric_after}</dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Delta</dt>
                <dd>
                  <MetricDelta value={finding.delta_percent} format="percent" />
                </dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Direction</dt>
                <dd className="font-medium capitalize">{finding.direction}</dd>
              </div>
            </dl>
          </div>
        )}

        {recommendation.has_draft && recommendation.latest_draft_id && (
          <div className="mt-6 flex items-center gap-2">
            <Button asChild>
              <Link href={route('ai-drafts.show', [site.id, recommendation.latest_draft_id])}>
                View Draft
              </Link>
            </Button>
            <Button variant="outline" asChild>
              <Link href={route('content-editor.edit', [site.id, recommendation.latest_draft_id])}>
                Edit Draft
              </Link>
            </Button>
          </div>
        )}
      </div>

      <StatusChangeModal
        open={statusModalOpen}
        onOpenChange={setStatusModalOpen}
        siteId={site.id}
        recommendationId={recommendation.id}
        currentStatus={recommendation.lifecycle_status}
      />
    </>
  );
}

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