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

import { AdminLayout } from '@/layouts/admin-layout';

type FAQ = {
    question: string;
    answer: string;
};

type GeneratedContent = {
    title?: string | null;
    summary?: string | null;
    body?: string | null;
    seo_title?: string | null;
    meta_description?: string | null;
    keywords?: string[];
    faqs?: FAQ[];
    warnings?: string[];
};

type AISuggestionDetail = {
    id: number;
    title: string | null;
    request_type_label: string;
    status: string;
    status_label: string;
    subject_type_label: string | null;
    subject_label: string | null;
    model: string | null;
    user: string | null;
    created_at: string | null;
    reviewed_at: string | null;
    applied_at: string | null;
    applied_by: string | null;
    prompt: string;
    input_snapshot: Record<string, unknown>;
    generated_content: GeneratedContent;
    can_apply: boolean;
    apply_fields: string[];
};

type AIContentShowProps = {
    suggestion: AISuggestionDetail;
};

export default function AIContentShow({ suggestion }: AIContentShowProps) {
    const generated = suggestion.generated_content || {};

    const markReviewed = () => {
        router.patch(`/admin/ai-content/${suggestion.id}/review`);
    };

    const archive = () => {
        router.patch(`/admin/ai-content/${suggestion.id}/archive`);
    };

    const applySuggestion = () => {
        if (
            !window.confirm(
                'Apply this reviewed suggestion to its linked product or article? Existing mapped fields will be overwritten.',
            )
        ) {
            return;
        }

        router.patch(`/admin/ai-content/${suggestion.id}/apply`);
    };

    const deleteSuggestion = () => {
        if (!window.confirm('Delete this AI content suggestion?')) {
            return;
        }

        router.delete(`/admin/ai-content/${suggestion.id}`);
    };

    return (
        <AdminLayout>
            <Head title={suggestion.title || 'AI Content Suggestion'} />

            <div className="space-y-5">
                <div className="flex flex-wrap items-start justify-between gap-3">
                    <div>
                        <Link
                            href="/admin/ai-content"
                            className="text-sm font-medium text-slate-600 hover:text-[#0a1530] dark:text-[#d7c7ff] dark:hover:text-[#efe8ff]"
                        >
                            Back to AI content
                        </Link>
                        <h1 className="mt-2 text-2xl font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                            {suggestion.title || 'AI Content Suggestion'}
                        </h1>
                        <p className="mt-1 text-sm text-slate-600 dark:text-[#c7bde8]">
                            {suggestion.request_type_label} generated by{' '}
                            {suggestion.user || 'Unknown'} on{' '}
                            {suggestion.created_at || '-'}.
                        </p>
                    </div>
                    <div className="flex flex-wrap gap-2">
                        <StatusBadge
                            status={suggestion.status}
                            label={suggestion.status_label}
                        />
                        <button
                            type="button"
                            onClick={markReviewed}
                            disabled={suggestion.status !== 'draft'}
                            className="rounded-lg border border-emerald-200 px-3 py-2 text-sm font-semibold text-emerald-700 hover:bg-emerald-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-emerald-400/40 dark:text-emerald-200 dark:hover:bg-emerald-400/10"
                        >
                            Mark Reviewed
                        </button>
                        <button
                            type="button"
                            onClick={applySuggestion}
                            disabled={!suggestion.can_apply}
                            className="rounded-lg border border-sky-200 px-3 py-2 text-sm font-semibold text-sky-700 hover:bg-sky-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-sky-400/40 dark:text-sky-200 dark:hover:bg-sky-400/10"
                        >
                            Apply Reviewed
                        </button>
                        <button
                            type="button"
                            onClick={archive}
                            disabled={suggestion.status === 'archived'}
                            className="rounded-lg border border-slate-300 px-3 py-2 text-sm font-semibold text-slate-700 hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                        >
                            Archive
                        </button>
                        <button
                            type="button"
                            onClick={deleteSuggestion}
                            className="rounded-lg border border-rose-200 px-3 py-2 text-sm font-semibold text-rose-700 hover:bg-rose-50"
                        >
                            Delete
                        </button>
                    </div>
                </div>

                <div className="rounded-xl border border-amber-200 bg-amber-50 p-4 text-sm text-amber-900 dark:border-amber-500/40 dark:bg-amber-500/10 dark:text-amber-100">
                    AI output is never applied automatically. Mark it reviewed
                    after checking accuracy, then use Apply Reviewed to update
                    only the mapped fields on the linked product or article.
                    Applying does not publish draft products or articles.
                </div>

                <section className="grid gap-4 lg:grid-cols-3">
                    <InfoCard
                        label="Subject"
                        value={suggestion.subject_label || 'Standalone context'}
                        detail={suggestion.subject_type_label || undefined}
                    />
                    <InfoCard label="Model" value={suggestion.model || '-'} />
                    <InfoCard
                        label="Reviewed"
                        value={suggestion.reviewed_at || 'Not reviewed'}
                    />
                    <InfoCard
                        label="Applied"
                        value={suggestion.applied_at || 'Not applied'}
                        detail={
                            suggestion.applied_by
                                ? `By ${suggestion.applied_by}`
                                : undefined
                        }
                    />
                    <InfoCard
                        label="Mapped Fields"
                        value={
                            suggestion.apply_fields.length > 0
                                ? suggestion.apply_fields.join(', ')
                                : 'No supported apply fields'
                        }
                    />
                </section>

                <section className="grid gap-4 xl:grid-cols-[1.5fr_1fr]">
                    <div className="space-y-4">
                        <ContentBlock
                            label="Suggested Title"
                            value={generated.title}
                        />
                        <ContentBlock
                            label="Summary / Short Description"
                            value={generated.summary}
                        />
                        <ContentBlock
                            label="Body"
                            value={generated.body}
                            large
                        />
                        <ContentBlock
                            label="SEO Title"
                            value={generated.seo_title}
                        />
                        <ContentBlock
                            label="Meta Description"
                            value={generated.meta_description}
                        />
                    </div>

                    <div className="space-y-4">
                        <ListBlock
                            label="Keywords"
                            items={generated.keywords || []}
                        />
                        <FAQBlock faqs={generated.faqs || []} />
                        <ListBlock
                            label="Warnings For Review"
                            items={generated.warnings || []}
                            warning
                        />
                    </div>
                </section>

                <section className="grid gap-4 xl:grid-cols-2">
                    <ContentBlock
                        label="Prompt Sent To AI"
                        value={suggestion.prompt}
                        large
                    />
                    <ContentBlock
                        label="Context Snapshot"
                        value={JSON.stringify(
                            suggestion.input_snapshot,
                            null,
                            2,
                        )}
                        large
                        mono
                    />
                </section>
            </div>
        </AdminLayout>
    );
}

function InfoCard({
    label,
    value,
    detail,
}: {
    label: string;
    value: string;
    detail?: string;
}) {
    return (
        <div className="rounded-xl border border-slate-200 bg-slate-50 p-4 dark:border-[#3c2b68] dark:bg-[#160f2d]">
            <p className="text-xs font-semibold tracking-wide text-slate-500 uppercase dark:text-[#bcaee6]">
                {label}
            </p>
            <p className="mt-1 text-sm font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                {value}
            </p>
            {detail ? (
                <p className="mt-1 text-xs text-slate-500 dark:text-[#bcaee6]">
                    {detail}
                </p>
            ) : null}
        </div>
    );
}

function ContentBlock({
    label,
    value,
    large = false,
    mono = false,
}: {
    label: string;
    value?: string | null;
    large?: boolean;
    mono?: boolean;
}) {
    return (
        <div className="rounded-xl border border-slate-200 bg-white p-4 dark:border-[#3c2b68] dark:bg-[#211740]">
            <div className="mb-2 flex items-center justify-between gap-3">
                <h2 className="text-sm font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                    {label}
                </h2>
                <span className="text-xs text-slate-500 dark:text-[#bcaee6]">
                    Copy manually
                </span>
            </div>
            <textarea
                readOnly
                value={value || ''}
                rows={large ? 14 : 4}
                className={`w-full rounded-lg border border-slate-200 bg-slate-50 px-3 py-2 text-sm text-[#0a1530] outline-none dark:border-[#3c2b68] dark:bg-[#160f2d] dark:text-[#efe8ff] ${mono ? 'font-mono' : ''}`}
            />
        </div>
    );
}

function ListBlock({
    label,
    items,
    warning = false,
}: {
    label: string;
    items: string[];
    warning?: boolean;
}) {
    return (
        <div className="rounded-xl border border-slate-200 bg-white p-4 dark:border-[#3c2b68] dark:bg-[#211740]">
            <h2 className="text-sm font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                {label}
            </h2>
            {items.length > 0 ? (
                <div className="mt-3 flex flex-wrap gap-2">
                    {items.map((item) => (
                        <span
                            key={item}
                            className={
                                warning
                                    ? 'rounded-full border border-amber-200 bg-amber-50 px-3 py-1 text-xs font-medium text-amber-800 dark:border-amber-400/40 dark:bg-amber-400/10 dark:text-amber-100'
                                    : 'rounded-full border border-sky-200 bg-sky-50 px-3 py-1 text-xs font-medium text-sky-800 dark:border-sky-400/40 dark:bg-sky-400/10 dark:text-sky-100'
                            }
                        >
                            {item}
                        </span>
                    ))}
                </div>
            ) : (
                <p className="mt-3 text-sm text-slate-500 dark:text-[#bcaee6]">
                    No items generated.
                </p>
            )}
        </div>
    );
}

function FAQBlock({ faqs }: { faqs: FAQ[] }) {
    return (
        <div className="rounded-xl border border-slate-200 bg-white p-4 dark:border-[#3c2b68] dark:bg-[#211740]">
            <h2 className="text-sm font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                FAQs
            </h2>
            {faqs.length > 0 ? (
                <div className="mt-3 space-y-3">
                    {faqs.map((faq) => (
                        <div
                            key={`${faq.question}-${faq.answer}`}
                            className="rounded-lg border border-slate-200 bg-slate-50 p-3 dark:border-[#3c2b68] dark:bg-[#160f2d]"
                        >
                            <p className="text-sm font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                                {faq.question}
                            </p>
                            <p className="mt-1 text-sm text-slate-700 dark:text-[#c7bde8]">
                                {faq.answer}
                            </p>
                        </div>
                    ))}
                </div>
            ) : (
                <p className="mt-3 text-sm text-slate-500 dark:text-[#bcaee6]">
                    No FAQs generated.
                </p>
            )}
        </div>
    );
}

function StatusBadge({ status, label }: { status: string; label: string }) {
    const classes =
        status === 'reviewed'
            ? 'border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-400/40 dark:bg-emerald-400/10 dark:text-emerald-200'
            : status === 'applied'
              ? 'border-sky-200 bg-sky-50 text-sky-700 dark:border-sky-400/40 dark:bg-sky-400/10 dark:text-sky-200'
              : status === 'archived'
                ? 'border-slate-200 bg-slate-50 text-slate-600 dark:border-slate-400/40 dark:bg-slate-400/10 dark:text-slate-200'
                : 'border-amber-200 bg-amber-50 text-amber-700 dark:border-amber-400/40 dark:bg-amber-400/10 dark:text-amber-200';

    return (
        <span
            className={`rounded-lg border px-3 py-2 text-sm font-semibold ${classes}`}
        >
            {label}
        </span>
    );
}
