import { DocumentRenderer } from '@/components/document-editor/document-renderer';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import AppLayout from '@/layouts/app-layout';
import { type BreadcrumbItem } from '@/types';
import { Head, Link, router, usePage } from '@inertiajs/react';
import { ArrowLeft, CopyPlus, Download, Pencil, Printer } from 'lucide-react';

interface PublicDocumentLike {
    uuid: string;
    token: string;
    title: string;
    category: string | null;
    mode: 'html' | 'pdf';
    source_pdf_url: string | null;
    body_html: string | null;
    recipient_name: string;
    recipient_email: string;
    status: string;
    sent_at: string | null;
    viewed_at: string | null;
    signed_at: string | null;
    sender_signature_url: string | null;
    sender_stamp_url: string | null;
    recipient_signature_url: string | null;
    recipient_stamp_url: string | null;
    final_pdf_url: string | null;
    expires_at: string | null;
    created_at: string | null;
    id: number;
}

interface PageProps {
    document: PublicDocumentLike;
}

const STATUS_LABELS: Record<string, string> = {
    draft: 'Brouillon',
    sent: 'Envoyé',
    viewed: 'Vu',
    signed: 'Signé',
    expired: 'Expiré',
    cancelled: 'Annulé',
};

const STATUS_COLORS: Record<string, string> = {
    draft: 'bg-gray-100 text-gray-700',
    sent: 'bg-blue-100 text-blue-700',
    viewed: 'bg-amber-100 text-amber-700',
    signed: 'bg-emerald-100 text-emerald-700',
    expired: 'bg-rose-100 text-rose-700',
    cancelled: 'bg-rose-100 text-rose-700',
};

export default function DocumentsShow() {
    const { document } = usePage<PageProps>().props;

    const breadcrumbs: BreadcrumbItem[] = [
        { title: 'Documents', href: '/crm/documents' },
        { title: document.title, href: '#' },
    ];

    const isSigned = document.status === 'signed';
    const isLocked = ['signed', 'cancelled', 'expired'].includes(document.status);

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={`${document.title} — Aperçu`} />
            <div className="flex h-full flex-1 flex-col gap-4 p-3 sm:p-4 lg:p-6">
                {/* Header */}
                <div className="flex flex-wrap items-center justify-between gap-3 print:hidden">
                    <div className="flex items-center gap-3">
                        <Link href={route('crm.documents.index')}>
                            <Button type="button" variant="ghost" size="sm">
                                <ArrowLeft className="mr-1 h-4 w-4" />
                                Retour
                            </Button>
                        </Link>
                        <div>
                            <h1 className="text-2xl font-semibold">{document.title}</h1>
                            <div className="mt-1 flex flex-wrap items-center gap-2 text-sm">
                                <span
                                    className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${STATUS_COLORS[document.status] ?? STATUS_COLORS.draft}`}
                                >
                                    {STATUS_LABELS[document.status] ?? document.status}
                                </span>
                                <span className="text-muted-foreground">
                                    Destinataire :{' '}
                                    <span className="font-medium text-foreground">{document.recipient_name}</span>{' '}
                                    <span className="text-xs">({document.recipient_email})</span>
                                </span>
                            </div>
                        </div>
                    </div>
                    <div className="flex items-center gap-2">
                        {document.final_pdf_url && (
                            <a href={document.final_pdf_url} download>
                                <Button type="button" variant="outline">
                                    <Download className="mr-1 h-4 w-4" />
                                    Télécharger PDF signé
                                </Button>
                            </a>
                        )}
                        <Button
                            type="button"
                            variant="outline"
                            onClick={() => {
                                // PDF-mode: open the PDF itself (print from the viewer).
                                // HTML-mode: open a dedicated shell-less print page that
                                // auto-fires the print dialog — the live app shell
                                // (sidebar/scroll containers) made window.print() unreliable.
                                const pdfUrl = document.final_pdf_url || document.source_pdf_url;
                                if (document.mode === 'pdf' && pdfUrl) {
                                    window.open(pdfUrl, '_blank', 'noopener');
                                    return;
                                }
                                window.open(route('crm.documents.print', document.id), '_blank', 'noopener');
                            }}
                        >
                            <Printer className="mr-1 h-4 w-4" />
                            Imprimer
                        </Button>
                        <Button
                            type="button"
                            variant="outline"
                            onClick={() => router.post(route('crm.documents.duplicate', document.id))}
                        >
                            <CopyPlus className="mr-1 h-4 w-4" />
                            Dupliquer
                        </Button>
                        {!isLocked && (
                            <Link href={route('crm.documents.edit', document.id)}>
                                <Button type="button">
                                    <Pencil className="mr-1 h-4 w-4" />
                                    Modifier
                                </Button>
                            </Link>
                        )}
                    </div>
                </div>

                {/* Lifecycle timeline */}
                <Card className="print:hidden">
                    <CardContent className="grid grid-cols-2 gap-3 p-4 text-sm sm:grid-cols-4">
                        <TimelineCell label="Créé le" value={document.created_at} />
                        <TimelineCell label="Envoyé le" value={document.sent_at} />
                        <TimelineCell label="Vu le" value={document.viewed_at} />
                        <TimelineCell label="Signé le" value={document.signed_at} highlight={isSigned} />
                    </CardContent>
                </Card>

                {/* Document body (read-only) */}
                <Card className="overflow-hidden print:rounded-none print:border-0 print:shadow-none">
                    <CardHeader className="print:hidden">
                        <CardTitle>Aperçu du document</CardTitle>
                    </CardHeader>
                    <CardContent className="p-0">
                        {document.mode === 'pdf' && document.source_pdf_url ? (
                            <iframe
                                src={`${document.source_pdf_url}#toolbar=1&navpanes=0`}
                                title={document.title}
                                className="h-[80vh] w-full bg-white"
                            />
                        ) : (
                            <DocumentRenderer
                                html={document.body_html ?? ''}
                                senderSignatureUrl={document.sender_signature_url}
                                senderStampUrl={document.sender_stamp_url}
                                recipientSignatureUrl={document.recipient_signature_url}
                                recipientStampUrl={document.recipient_stamp_url}
                                recipientSignedAt={document.signed_at}
                                /* No recipientPad → slots become passive images */
                                locked
                            />
                        )}
                    </CardContent>
                </Card>

                {/* Signature recap */}
                <Card className="print:hidden">
                    <CardHeader>
                        <CardTitle>Signatures</CardTitle>
                    </CardHeader>
                    <CardContent>
                        <div className="grid grid-cols-1 gap-4 md:grid-cols-2">
                            <SignatureCell
                                label="Conciergerie (TLL)"
                                signatureUrl={document.sender_signature_url}
                                stampUrl={document.sender_stamp_url}
                                date={null}
                            />
                            <SignatureCell
                                label={`Partenaire — ${document.recipient_name}`}
                                signatureUrl={document.recipient_signature_url}
                                stampUrl={document.recipient_stamp_url}
                                date={document.signed_at}
                            />
                        </div>
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}

function TimelineCell({ label, value, highlight }: { label: string; value: string | null; highlight?: boolean }) {
    return (
        <div className={`rounded-md border p-3 ${highlight ? 'border-emerald-300 bg-emerald-50' : 'bg-white'}`}>
            <p className="text-xs uppercase tracking-wide text-muted-foreground">{label}</p>
            <p className={`mt-0.5 text-sm font-medium ${highlight ? 'text-emerald-800' : ''}`}>
                {formatDateFr(value)}
            </p>
        </div>
    );
}

function SignatureCell({
    label,
    signatureUrl,
    stampUrl,
    date,
}: {
    label: string;
    signatureUrl: string | null;
    stampUrl: string | null;
    date: string | null;
}) {
    return (
        <div className="rounded-md border bg-white p-4">
            <p className="mb-3 text-sm font-medium">{label}</p>
            <div className="flex h-44 items-center justify-center gap-4">
                {signatureUrl ? (
                    <img src={signatureUrl} alt={label} className="max-h-32 max-w-[55%] object-contain" />
                ) : (
                    <span className="text-sm italic text-muted-foreground">Non signé</span>
                )}
                {stampUrl && <img src={stampUrl} alt="Cachet" className="max-h-32 max-w-[45%] object-contain" />}
            </div>
            {date && (
                <p className="mt-3 text-center text-xs text-muted-foreground">
                    Signé le {formatDateFr(date)}
                </p>
            )}
        </div>
    );
}

function formatDateFr(value: string | null): string {
    if (!value) return '—';
    const d = new Date(value);
    if (Number.isNaN(d.getTime())) return '—';
    const dd = String(d.getDate()).padStart(2, '0');
    const mm = String(d.getMonth() + 1).padStart(2, '0');
    const yyyy = d.getFullYear();
    const hh = String(d.getHours()).padStart(2, '0');
    const mi = String(d.getMinutes()).padStart(2, '0');
    return `${dd}/${mm}/${yyyy} ${hh}:${mi}`;
}
