import { FileText, Lightbulb, Tag } from 'lucide-react';


import { useEffect, useState } from 'react';

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

import SiteNav from '@/Components/Navigation/SiteNav';
import { Badge } from '@/Components/ui/badge';
import { Button } from '@/Components/ui/button';
import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogFooter,
  DialogHeader,
  DialogTitle,
} from '@/Components/ui/dialog';
import { EmptyState } from '@/Components/ui/empty-state';
import { Input } from '@/Components/ui/input';
import { Label } from '@/Components/ui/label';
import { LoadingButton } from '@/Components/ui/loading-button';
import { Textarea } from '@/Components/ui/textarea';
import DashboardLayout from '@/Layouts/DashboardLayout';
import { trackEvent } from '@/lib/analytics';
import { TOPIC_CLUSTERS_DETAIL_VIEWED } from '@/lib/event-catalog';
import { formatNumber } from '@/lib/format';
import type { SiteBasic } from '@/types';

interface TopicCluster {
  id: number;
  name: string;
  total_demand: number;
  coverage_percentage: number;
  hub_page_url: string | null;
  metadata: Record<string, unknown> | null;
}

interface ClusterMember {
  id: number;
  member_type: string;
  member_value: string;
  clicks: number;
  impressions: number;
  position: number;
  is_hub: boolean;
}

interface TopicEntity {
  id: number;
  entity_text: string;
  entity_type: string;
  demand_volume: number;
  coverage_strength: number;
  source: string;
}

interface GapSuggestion {
  id: number;
  suggestion_type: string;
  missing_entity_id: number | null;
  missing_entity_text: string | null;
  target_page_url: string | null;
  impact_score: number;
  confidence_score: number;
  effort_score: number;
  risk_score: number;
  title: string;
  reasoning: string;
  evidence: Record<string, unknown> | null;
  status: string;
}

interface Props {
  site: SiteBasic;
  cluster: TopicCluster;
  members: ClusterMember[];
  entities: TopicEntity[];
  gapSuggestions: GapSuggestion[];
}

function suggestionTypeLabel(type: string): string {
  switch (type) {
    case 'expand_existing':
      return 'Expand Existing';
    case 'create_new':
      return 'Create New';
    default:
      return type;
  }
}

function statusBadgeVariant(status: string): 'default' | 'secondary' | 'destructive' | 'outline' {
  switch (status) {
    case 'accepted':
      return 'default';
    case 'pending':
      return 'secondary';
    case 'rejected':
      return 'destructive';
    default:
      return 'outline';
  }
}

export default function TopicClusterShow({
  site,
  cluster,
  members,
  entities,
  gapSuggestions,
}: Props) {
  useEffect(() => {
    trackEvent(TOPIC_CLUSTERS_DETAIL_VIEWED, { site_id: String(site.id) });
  }, [site.id]);

  const pageMembers = members.filter((m) => m.member_type === 'page');
  const queryMembers = members.filter((m) => m.member_type === 'query');

  const [isGenerateBriefModalOpen, setIsGenerateBriefModalOpen] = useState(false);
  const { data, setData, post, processing, reset, errors } = useForm({
    target_keyword: cluster.name || '',
    custom_instructions: '',
    source_type: 'TopicCluster',
    source_id: cluster.id,
  });

  const handleGenerateBrief = (e: React.FormEvent) => {
    e.preventDefault();
    post(route('content-briefs.store', site.id), {
      onSuccess: () => {
        setIsGenerateBriefModalOpen(false);
        reset();
      },
    });
  };

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

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

        <div className="flex items-center justify-between gap-3 mb-2">
          <Button variant="outline" size="sm" asChild>
            <Link href={route('topic-clusters.index', site.id)}>&larr; Back to Topic Clusters</Link>
          </Button>
          <Button variant="default" size="sm" onClick={() => setIsGenerateBriefModalOpen(true)}>
            <FileText className="mr-2 h-4 w-4" />
            Generate Brief
          </Button>
        </div>

        <div className="flex items-center gap-3 mb-1">
          <h1 className="text-2xl font-bold tracking-tight">{cluster.name}</h1>
        </div>
        {cluster.hub_page_url && (
          <p className="text-sm text-muted-foreground mb-6">
            <span className="font-medium">Hub Page:</span> {cluster.hub_page_url}
          </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">Cluster Overview</h2>
            <dl className="grid grid-cols-2 gap-x-6 gap-y-3 text-sm">
              <div>
                <dt className="text-muted-foreground">Total Demand</dt>
                <dd className="font-medium">{formatNumber(cluster.total_demand)}</dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Coverage</dt>
                <dd className="font-medium">{cluster.coverage_percentage.toFixed(1)}%</dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Pages</dt>
                <dd className="font-medium">{pageMembers.length}</dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Queries</dt>
                <dd className="font-medium">{queryMembers.length}</dd>
              </div>
            </dl>
          </div>

          <div className="rounded-lg border bg-card p-4">
            <h2 className="text-lg font-semibold mb-3">Content Intelligence</h2>
            <dl className="grid grid-cols-2 gap-x-6 gap-y-3 text-sm">
              <div>
                <dt className="text-muted-foreground">Entities</dt>
                <dd className="font-medium">{entities.length}</dd>
              </div>
              <div>
                <dt className="text-muted-foreground">Gap Suggestions</dt>
                <dd className="font-medium">{gapSuggestions.length}</dd>
              </div>
              <div className="col-span-2">
                <dt className="text-muted-foreground">Status</dt>
                <dd>
                  <Badge variant={cluster.coverage_percentage >= 70 ? 'default' : 'secondary'}>
                    {cluster.coverage_percentage >= 70
                      ? 'High Coverage'
                      : cluster.coverage_percentage < 30
                        ? 'Low Coverage'
                        : 'Medium Coverage'}
                  </Badge>
                </dd>
              </div>
            </dl>
          </div>
        </div>

        <div className="space-y-6">
          {/* Entities Section */}
          <div className="rounded-lg border bg-card p-4">
            <h2 className="text-lg font-semibold mb-3">Topic Entities</h2>
            {entities.length === 0 ? (
              <EmptyState
                icon={Tag}
                title="No entities found"
                description="No topic entities were extracted for this cluster."
                size="sm"
              />
            ) : (
              <div className="space-y-2">
                {entities.map((entity) => (
                  <div
                    key={entity.id}
                    className="flex items-center justify-between rounded-md border bg-background p-3"
                  >
                    <div className="flex-1">
                      <div className="flex items-center gap-2">
                        <span className="font-medium text-sm">{entity.entity_text}</span>
                        <Badge variant="outline" className="text-xs">
                          {entity.entity_type}
                        </Badge>
                      </div>
                      <div className="flex items-center gap-4 mt-1 text-xs text-muted-foreground">
                        <span>Demand: {formatNumber(entity.demand_volume)}</span>
                        <span>Coverage: {entity.coverage_strength.toFixed(1)}%</span>
                        <span>Source: {entity.source}</span>
                      </div>
                    </div>
                    <div>
                      {entity.coverage_strength < 30 ? (
                        <Badge variant="destructive">Low Coverage</Badge>
                      ) : entity.coverage_strength >= 70 ? (
                        <Badge variant="default">High Coverage</Badge>
                      ) : (
                        <Badge variant="secondary">Medium Coverage</Badge>
                      )}
                    </div>
                  </div>
                ))}
              </div>
            )}
          </div>

          {/* Gap Suggestions Section */}
          <div className="rounded-lg border bg-card p-4">
            <h2 className="text-lg font-semibold mb-3">Gap Suggestions</h2>
            {gapSuggestions.length === 0 ? (
              <EmptyState
                icon={Lightbulb}
                title="No gap suggestions"
                description="No content gap suggestions were identified for this cluster."
                size="sm"
              />
            ) : (
              <div className="space-y-3">
                {gapSuggestions.map((suggestion) => (
                  <div key={suggestion.id} className="rounded-md border bg-background p-4">
                    <div className="flex items-start justify-between mb-2">
                      <div className="flex-1">
                        <div className="flex items-center gap-2 mb-1">
                          <h3 className="font-semibold text-sm">{suggestion.title}</h3>
                          <Badge variant="secondary">
                            {suggestionTypeLabel(suggestion.suggestion_type)}
                          </Badge>
                          <Badge variant={statusBadgeVariant(suggestion.status)}>
                            {suggestion.status}
                          </Badge>
                        </div>
                        {suggestion.missing_entity_text && (
                          <p className="text-xs text-muted-foreground mb-2">
                            Missing Entity: {suggestion.missing_entity_text}
                          </p>
                        )}
                        {suggestion.target_page_url && (
                          <p className="text-xs text-muted-foreground mb-2">
                            Target Page: {suggestion.target_page_url}
                          </p>
                        )}
                      </div>
                    </div>

                    <p className="text-sm text-muted-foreground mb-3">{suggestion.reasoning}</p>

                    <div className="flex items-center gap-4 text-xs">
                      <div>
                        <span className="text-muted-foreground">Impact: </span>
                        <span className="font-medium">
                          {Math.round(suggestion.impact_score)}/100
                        </span>
                      </div>
                      <div>
                        <span className="text-muted-foreground">Confidence: </span>
                        <span className="font-medium">
                          {Math.round(suggestion.confidence_score * 100)}%
                        </span>
                      </div>
                      <div>
                        <span className="text-muted-foreground">Effort: </span>
                        <span className="font-medium">
                          {(suggestion.effort_score * 100).toFixed(0)}%
                        </span>
                      </div>
                      <div>
                        <span className="text-muted-foreground">Risk: </span>
                        <span className="font-medium">
                          {(suggestion.risk_score * 100).toFixed(0)}%
                        </span>
                      </div>
                    </div>
                  </div>
                ))}
              </div>
            )}
          </div>

          {/* Members Section */}
          <div className="rounded-lg border bg-card p-4">
            <h2 className="text-lg font-semibold mb-3">Cluster Members</h2>

            {pageMembers.length > 0 && (
              <div className="mb-4">
                <h3 className="text-sm font-semibold mb-2 text-muted-foreground">
                  Pages ({pageMembers.length})
                </h3>
                <div className="space-y-2">
                  {pageMembers.map((member) => (
                    <div
                      key={member.id}
                      className="flex items-center justify-between rounded-md border bg-background p-3"
                    >
                      <div className="flex-1">
                        <div className="flex items-center gap-2">
                          <span className="text-sm font-medium">{member.member_value}</span>
                          {member.is_hub && (
                            <Badge variant="default" className="text-xs">
                              Hub
                            </Badge>
                          )}
                        </div>
                        <div className="flex items-center gap-4 mt-1 text-xs text-muted-foreground">
                          <span>Clicks: {formatNumber(member.clicks)}</span>
                          <span>Impressions: {formatNumber(member.impressions)}</span>
                          <span>Position: {member.position.toFixed(1)}</span>
                        </div>
                      </div>
                    </div>
                  ))}
                </div>
              </div>
            )}

            {queryMembers.length > 0 && (
              <div>
                <h3 className="text-sm font-semibold mb-2 text-muted-foreground">
                  Queries ({queryMembers.length})
                </h3>
                <div className="space-y-2">
                  {queryMembers.map((member) => (
                    <div
                      key={member.id}
                      className="flex items-center justify-between rounded-md border bg-background p-3"
                    >
                      <div className="flex-1">
                        <span className="text-sm font-medium">{member.member_value}</span>
                        <div className="flex items-center gap-4 mt-1 text-xs text-muted-foreground">
                          <span>Clicks: {formatNumber(member.clicks)}</span>
                          <span>Impressions: {formatNumber(member.impressions)}</span>
                          <span>Position: {member.position.toFixed(1)}</span>
                        </div>
                      </div>
                    </div>
                  ))}
                </div>
              </div>
            )}

            {pageMembers.length === 0 && queryMembers.length === 0 && (
              <EmptyState
                icon={FileText}
                title="No cluster members"
                description="No pages or queries are assigned to this cluster."
                size="sm"
              />
            )}
          </div>
        </div>
      </div>

      {/* Generate Brief Modal */}
      <Dialog open={isGenerateBriefModalOpen} onOpenChange={setIsGenerateBriefModalOpen}>
        <DialogContent className="sm:max-w-md">
          <DialogHeader>
            <DialogTitle>Generate Content Brief</DialogTitle>
            <DialogDescription>
              Create a comprehensive content brief for this topic cluster using AI.
            </DialogDescription>
          </DialogHeader>
          <form onSubmit={handleGenerateBrief} className="space-y-4">
            <div>
              <Label htmlFor="target_keyword">Target Keyword</Label>
              <Input
                id="target_keyword"
                type="text"
                value={data.target_keyword}
                onChange={(e) => setData('target_keyword', e.target.value)}
                placeholder="Enter target keyword or topic"
                required
                className="mt-1"
              />
              {errors.target_keyword && (
                <p className="text-sm text-destructive mt-1">{errors.target_keyword}</p>
              )}
            </div>

            <div>
              <Label htmlFor="custom_instructions">Custom Instructions (Optional)</Label>
              <Textarea
                id="custom_instructions"
                value={data.custom_instructions}
                onChange={(e) => setData('custom_instructions', e.target.value)}
                placeholder="Add any specific instructions for the brief (e.g., tone, audience, focus areas)"
                rows={4}
                className="mt-1"
              />
              {errors.custom_instructions && (
                <p className="text-sm text-destructive mt-1">{errors.custom_instructions}</p>
              )}
            </div>

            <div className="rounded-lg border bg-muted/50 p-3">
              <p className="text-sm font-medium mb-2">Brief will include:</p>
              <ul className="text-xs text-muted-foreground space-y-1 list-disc list-inside">
                <li>Recommended H1 and H2 structure</li>
                <li>Key entities and topics to cover</li>
                <li>Target word count range</li>
                <li>Internal linking suggestions</li>
                <li>Audience context and competitive positioning</li>
              </ul>
            </div>

            <div className="rounded-lg border bg-muted/50 p-3">
              <p className="text-sm font-medium mb-2">Estimated Cost:</p>
              <p className="text-xs text-muted-foreground">
                ~1,300 tokens (~$0.04 for GPT-4, ~$0.001 for GPT-3.5-turbo)
              </p>
            </div>

            <DialogFooter>
              <Button
                type="button"
                variant="outline"
                onClick={() => setIsGenerateBriefModalOpen(false)}
                disabled={processing}
              >
                Cancel
              </Button>
              <LoadingButton loading={processing}>Generate Brief</LoadingButton>
            </DialogFooter>
          </form>
        </DialogContent>
      </Dialog>
    </>
  );
}

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