import { ArrowLeft, TrendingUp } from 'lucide-react';

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

import { Badge } from '@/Components/ui/badge';
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from '@/Components/ui/breadcrumb';
import { Button } from '@/Components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/Components/ui/card';
import AdminLayout from '@/Layouts/AdminLayout';
import { formatDateTime, formatNumber } from '@/lib/format';

interface KeywordOpportunityDetail {
  id: number;
  opportunity_type: string;
  query: string;
  page_url: string | null;
  position: number | null;
  impressions: number | null;
  clicks: number | null;
  ctr: number | null;
  expected_ctr: number | null;
  impact_score: number | null;
  confidence_score: number | null;
  lifecycle_status: string | null;
  metadata: Record<string, unknown> | null;
  status: string | null;
  dismissed_at: string | null;
  site_id: number | null;
  site_name: string | null;
  site_domain: string | null;
  keyword_opportunity_run_id: number | null;
  created_at: string;
}

interface Props {
  opportunity: KeywordOpportunityDetail;
}

const typeVariant = (type: string): 'default' | 'secondary' | 'outline' => {
  if (type === 'striking_distance' || type === 'rising_query') return 'default';
  if (type === 'ctr_gap') return 'secondary';
  return 'outline';
};

export default function AdminKeywordOpportunityShow({ opportunity }: Props) {
  const formatPercent = (val: number | null) =>
    val != null ? `${(val * 100).toFixed(2)}%` : '—';

  return (
    <AdminLayout>
      <Head title={`Admin - Keyword Opportunity #${opportunity.id}`} />

      <div className="container py-6 space-y-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href={route('admin.keyword-opportunities.index')}>Keyword Opportunities</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>#{opportunity.id}</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>

        <div className="flex items-start gap-3">
          <TrendingUp className="h-5 w-5 text-muted-foreground mt-0.5" />
          <div className="flex-1">
            <div className="flex items-center gap-2 flex-wrap">
              <h1 className="text-xl font-semibold">{opportunity.query}</h1>
              <Badge variant={typeVariant(opportunity.opportunity_type)}>
                {opportunity.opportunity_type.replace(/_/g, ' ')}
              </Badge>
              {opportunity.lifecycle_status && (
                <Badge variant="outline">{opportunity.lifecycle_status}</Badge>
              )}
            </div>
            {opportunity.page_url && (
              <p className="text-sm text-muted-foreground font-mono truncate mt-1">{opportunity.page_url}</p>
            )}
          </div>
        </div>

        <div className="grid gap-6 md:grid-cols-2">
          <Card>
            <CardHeader>
              <CardTitle className="text-sm font-medium">Site</CardTitle>
            </CardHeader>
            <CardContent className="space-y-3 text-sm">
              {opportunity.site_id ? (
                <div>
                  <p className="text-xs text-muted-foreground">Site</p>
                  <Link href={route('admin.sites.show', { site: opportunity.site_id })} className="text-primary hover:underline font-medium">
                    {opportunity.site_name ?? '—'}
                  </Link>
                  {opportunity.site_domain && (
                    <p className="text-xs text-muted-foreground">{opportunity.site_domain}</p>
                  )}
                </div>
              ) : (
                <p className="text-muted-foreground">No site</p>
              )}
              <div>
                <p className="text-xs text-muted-foreground">Created</p>
                <p>{formatDateTime(opportunity.created_at)}</p>
              </div>
              {opportunity.dismissed_at && (
                <div>
                  <p className="text-xs text-muted-foreground">Dismissed</p>
                  <p>{formatDateTime(opportunity.dismissed_at)}</p>
                </div>
              )}
            </CardContent>
          </Card>

          <Card>
            <CardHeader>
              <CardTitle className="text-sm font-medium">GSC Metrics</CardTitle>
            </CardHeader>
            <CardContent className="space-y-2 text-sm">
              {[
                { label: 'Position', value: opportunity.position != null ? Number(opportunity.position).toFixed(1) : '—' },
                { label: 'Impressions', value: opportunity.impressions != null ? formatNumber(opportunity.impressions) : '—' },
                { label: 'Clicks', value: opportunity.clicks != null ? formatNumber(opportunity.clicks) : '—' },
                { label: 'CTR', value: formatPercent(opportunity.ctr) },
                { label: 'Expected CTR', value: formatPercent(opportunity.expected_ctr) },
                { label: 'Impact Score', value: opportunity.impact_score != null ? Number(opportunity.impact_score).toFixed(2) : '—' },
                { label: 'Confidence', value: opportunity.confidence_score != null ? Number(opportunity.confidence_score).toFixed(2) : '—' },
              ].map(({ label, value }) => (
                <div key={label} className="flex justify-between">
                  <span className="text-muted-foreground">{label}</span>
                  <span className="font-mono">{value}</span>
                </div>
              ))}
            </CardContent>
          </Card>

          {opportunity.metadata && Object.keys(opportunity.metadata).length > 0 && (
            <Card className="md:col-span-2">
              <CardHeader>
                <CardTitle className="text-sm font-medium">Metadata</CardTitle>
              </CardHeader>
              <CardContent>
                <pre className="text-xs bg-muted p-3 rounded-md overflow-auto max-h-48">
                  {JSON.stringify(opportunity.metadata, null, 2)}
                </pre>
              </CardContent>
            </Card>
          )}
        </div>

        <Button variant="outline" asChild>
          <Link href={route('admin.keyword-opportunities.index')}>
            <ArrowLeft className="mr-2 h-4 w-4" />
            Back to Keyword Opportunities
          </Link>
        </Button>
      </div>
    </AdminLayout>
  );
}
