import { ThumbsDown, ThumbsUp } from 'lucide-react';

import { useEffect, useState } from 'react';

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

import PublishDraftModal from '@/Components/Ai/PublishDraftModal';
import SiteNav from '@/Components/Navigation/SiteNav';
import DraftPreview from '@/Components/Recommendations/DraftPreview';
import { Alert, AlertDescription } from '@/Components/ui/alert';
import { Badge } from '@/Components/ui/badge';
import { Button } from '@/Components/ui/button';
import { Textarea } from '@/Components/ui/textarea';
import DashboardLayout from '@/Layouts/DashboardLayout';
import { trackProductEvent } from '@/lib/analytics';
import { formatDateTime } from '@/lib/format';
import { sanitizeHtml } from '@/lib/sanitize';
import type { SiteBasic } from '@/types';

interface PublishLog {
  id: number;
  publish_type: string;
  status: string;
  created_at: string;
  error: string | null;
}

interface Draft {
  id: number;
  content: string;
  token_usage: { prompt_tokens: number; completion_tokens: number } | null;
  created_at: string;
  publish_status?: string;
  publish_type?: string;
  published_at?: string;
  publish_error?: string;
  quality_rating?: number | null;
  aiJob: {
    id: number;
    model: string;
  };
  recommendation: {
    id: number;
    page_url: string;
    title: string;
    action_type: string;
    wp_post_content: string | null;
    wp_post_id?: string;
    wp_modified_at?: string | null;
  } | null;
  publish_logs?: PublishLog[];
}

interface Props {
  site: SiteBasic;
  draft: Draft;
}

function publishStatusVariant(
  status: string,
): 'default' | 'secondary' | 'destructive' | 'outline' | 'success' {
  switch (status) {
    case 'published':
      return 'success';
    case 'sending':
    case 'queued':
      return 'secondary';
    case 'failed':
      return 'destructive';
    case 'not_published':
    default:
      return 'outline';
  }
}

function publishStatusLabel(status: string): string {
  switch (status) {
    case 'not_published':
      return 'Not Published';
    case 'queued':
      return 'Queued';
    case 'sending':
      return 'Sending';
    case 'published':
      return 'Published';
    case 'failed':
      return 'Failed';
    default:
      return status;
  }
}

export default function DraftShow({ site, draft }: Props) {
  const [isPublishModalOpen, setIsPublishModalOpen] = useState(false);
  const [rating, setRating] = useState<number | null>(draft.quality_rating ?? null);
  const [feedback, setFeedback] = useState('');
  const [showFeedbackInput, setShowFeedbackInput] = useState(false);
  const [isSubmittingRating, setIsSubmittingRating] = useState(false);

  useEffect(() => {
    trackProductEvent('draft_viewed', { draft_id: draft.id, site_id: String(site.id) });
  }, [draft.id, site.id]);

  const submitRating = (value: 1 | -1) => {
    setRating(value);
    setIsSubmittingRating(true);
    router.post(
      route('ai-drafts.rate', [site.id, draft.id]),
      { quality_rating: value, quality_feedback: feedback || null },
      {
        preserveScroll: true,
        onSuccess: () => setShowFeedbackInput(false),
        onFinish: () => setIsSubmittingRating(false),
      },
    );
  };

  const originalContent = draft.recommendation?.wp_post_content ?? '';
  const publishStatus = draft.publish_status ?? 'not_published';
  const canPublish =
    draft.recommendation?.wp_post_id && publishStatus !== 'sending' && publishStatus !== 'queued';

  return (
    <>
      <Head title={`${site.name} - Draft #${draft.id}`} />

      <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">
          <div className="flex items-center gap-2">
            {draft.recommendation && (
              <Button variant="outline" size="sm" asChild>
                <Link href={route('recommendations.index', site.id)}>
                  &larr; Back to Recommendations
                </Link>
              </Button>
            )}
            <Button variant="ghost" size="sm" asChild>
              <Link href={route('ai-jobs.show', [site.id, draft.aiJob.id])}>Back to Job</Link>
            </Button>
          </div>
          <div className="flex items-center gap-2">
            <Button variant="outline" size="sm" asChild>
              <Link href={route('content-editor.edit', [site.id, draft.id])}>Edit in Editor</Link>
            </Button>
            {canPublish && (
              <Button size="sm" onClick={() => setIsPublishModalOpen(true)}>
                Publish to WordPress
              </Button>
            )}
          </div>
        </div>

        <div className="flex items-center gap-3 mb-1">
          <h1 className="text-2xl font-bold tracking-tight">
            {draft.recommendation?.title ?? `Draft #${draft.id}`}
          </h1>
          <Badge variant={publishStatusVariant(publishStatus)}>
            {publishStatusLabel(publishStatus)}
          </Badge>
        </div>
        {draft.recommendation && (
          <p className="text-sm text-muted-foreground mb-6">{draft.recommendation.page_url}</p>
        )}

        {draft.publish_error && publishStatus === 'failed' && (
          <Alert variant="destructive" className="mb-6">
            <AlertDescription>
              <strong>Publishing Failed:</strong> {draft.publish_error}
            </AlertDescription>
          </Alert>
        )}

        {originalContent ? (
          <DraftPreview
            originalContent={originalContent}
            draftContent={draft.content}
            modelUsed={draft.aiJob.model}
            tokens={{
              prompt: draft.token_usage?.prompt_tokens ?? 0,
              completion: draft.token_usage?.completion_tokens ?? 0,
            }}
          />
        ) : (
          <div className="rounded-lg border border-primary/20 bg-primary/5 p-4">
            <h3 className="text-sm font-medium mb-2">AI Draft</h3>
            <div
              className="prose prose-sm dark:prose-invert max-w-none"
              dangerouslySetInnerHTML={{ __html: sanitizeHtml(draft.content) }}
            />
            {draft.token_usage && (
              <p className="mt-3 text-xs text-muted-foreground">
                {draft.token_usage.prompt_tokens + draft.token_usage.completion_tokens} tokens
                &bull; {draft.aiJob.model}
              </p>
            )}
          </div>
        )}

        {/* Draft quality rating */}
        <div className="mt-6 rounded-lg border bg-card p-4">
          <h3 className="text-sm font-medium mb-3">Rate this Draft</h3>
          <div className="flex items-center gap-3">
            <Button
              variant={rating === 1 ? 'default' : 'outline'}
              size="sm"
              onClick={() => {
                if (rating === 1) return;
                setShowFeedbackInput(false);
                submitRating(1);
              }}
              disabled={isSubmittingRating}
              aria-pressed={rating === 1}
              aria-label="Thumbs up — good draft"
            >
              <ThumbsUp className="h-4 w-4 mr-1.5" aria-hidden="true" />
              Good
            </Button>
            <Button
              variant={rating === -1 ? 'destructive' : 'outline'}
              size="sm"
              onClick={() => {
                setShowFeedbackInput(true);
                submitRating(-1);
              }}
              disabled={isSubmittingRating}
              aria-pressed={rating === -1}
              aria-label="Thumbs down — needs improvement"
            >
              <ThumbsDown className="h-4 w-4 mr-1.5" aria-hidden="true" />
              Needs work
            </Button>
            {rating !== null && !isSubmittingRating && (
              <span className="text-xs text-muted-foreground">
                {rating === 1 ? 'Thanks for the feedback!' : 'Sorry to hear that.'}
              </span>
            )}
          </div>
          {showFeedbackInput && rating === -1 && (
            <div className="mt-3 space-y-2">
              <Textarea
                placeholder="What could be improved? (optional)"
                value={feedback}
                onChange={(e) => setFeedback(e.target.value)}
                className="text-sm resize-none"
                rows={2}
              />
              {feedback.trim() && (
                <Button
                  size="sm"
                  variant="outline"
                  onClick={() => submitRating(-1)}
                  disabled={isSubmittingRating}
                >
                  Submit feedback
                </Button>
              )}
            </div>
          )}
        </div>

        {draft.publish_logs && draft.publish_logs.length > 0 && (
          <div className="mt-6 rounded-lg border bg-card p-4">
            <h3 className="text-sm font-medium mb-3">Publish History</h3>
            <div className="space-y-2">
              {draft.publish_logs.map((log) => (
                <div
                  key={log.id}
                  className="flex items-center justify-between text-sm border-b pb-2 last:border-b-0"
                >
                  <div className="flex items-center gap-2">
                    <Badge variant={publishStatusVariant(log.status)} className="text-xs">
                      {publishStatusLabel(log.status)}
                    </Badge>
                    <span className="text-muted-foreground">
                      {log.publish_type === 'draft' ? 'Saved as Draft' : 'Published Live'}
                    </span>
                    <span className="text-muted-foreground">&bull;</span>
                    <span className="text-muted-foreground">{formatDateTime(log.created_at)}</span>
                  </div>
                  {log.error && <span className="text-xs text-destructive">{log.error}</span>}
                </div>
              ))}
            </div>
          </div>
        )}

        {canPublish && draft.recommendation && (
          <PublishDraftModal
            open={isPublishModalOpen}
            onOpenChange={setIsPublishModalOpen}
            siteId={site.id}
            draftId={draft.id}
            recommendationId={draft.recommendation.id}
            wpPostId={draft.recommendation.wp_post_id ?? ''}
            wpModifiedAt={draft.recommendation.wp_modified_at ?? null}
            originalContent={originalContent}
            newContent={draft.content}
          />
        )}
      </div>
    </>
  );
}

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