import { Head, Link, router } from '@inertiajs/react';
import {
    ClipboardDocumentIcon,
    EyeIcon,
    FolderIcon,
    MagnifyingGlassIcon,
    PencilSquareIcon,
    PlusCircleIcon,
    TrashIcon,
} from '@heroicons/react/24/outline';
import { FormEvent, useState } from 'react';
import { toast } from 'sonner';
import { Pagination } from '@/components/pagination';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import {
    create,
    destroy,
    edit,
    index,
    preview,
    show,
} from '@/routes/documents';
import type {
    DocumentIframe,
    PaginatedData,
} from '@/types';

type Props = {
    documentIframes: PaginatedData<DocumentIframe>;
    filters: {
        search: string;
    };
};

export default function DocumentsIndex({
    documentIframes,
    filters,
}: Props) {
    const [search, setSearch] = useState(filters.search);

    const submitSearch = (event: FormEvent<HTMLFormElement>) => {
        event.preventDefault();

        router.get(
            index().url,
            { search },
            {
                preserveState: true,
                replace: true,
            },
        );
    };

    const clearSearch = () => {
        setSearch('');

        router.get(
            index().url,
            {},
            {
                preserveState: true,
                replace: true,
            },
        );
    };

    const copyEmbedUrl = async (url: string) => {
        try {
            await navigator.clipboard.writeText(url);
            toast.success('Link del iframe copiado.');
        } catch {
            toast.error('No fue posible copiar el link.');
        }
    };

    const deleteDocumentIframe = (
        documentIframe: DocumentIframe,
    ) => {
        const confirmed = window.confirm(
            `¿Seguro que deseas eliminar "${documentIframe.name}"?`,
        );

        if (!confirmed) {
            return;
        }

        router.delete(destroy(documentIframe.public_id).url, {
            preserveScroll: true,
        });
    };

    return (
        <>
            <Head title="Documentos" />

            <div className="flex flex-1 flex-col gap-8 p-4 md:p-6">
                <div>
                    <h1 className="text-2xl font-semibold">
                        Documentos
                    </h1>

                    <p className="mt-1 text-sm text-muted-foreground">
                        Administra los iframes de documentos que serán
                        integrados en el sitio web.
                    </p>
                </div>

                <form
                    onSubmit={submitSearch}
                    className="flex flex-col gap-3 sm:flex-row"
                >
                    <div className="relative flex-1">
                        <MagnifyingGlassIcon className="absolute top-1/2 left-3 size-5 -translate-y-1/2 text-muted-foreground" />

                        <Input
                            value={search}
                            onChange={(event) =>
                                setSearch(event.target.value)
                            }
                            placeholder="Buscar iframe por nombre..."
                            className="pl-10"
                        />
                    </div>

                    <Button type="submit">Buscar</Button>

                    {filters.search && (
                        <Button
                            type="button"
                            variant="outline"
                            onClick={clearSearch}
                        >
                            Limpiar
                        </Button>
                    )}
                </form>

                <div className="grid grid-cols-1 gap-6 sm:grid-cols-2 xl:grid-cols-3">
                    <Link
                        href={create()}
                        className="group flex min-h-64 flex-col items-center justify-center rounded-2xl border-2 border-dashed border-border p-6 text-center transition hover:border-primary hover:bg-accent"
                    >
                        <PlusCircleIcon className="size-16 text-muted-foreground transition group-hover:text-primary" />

                        <h2 className="mt-4 font-semibold">
                            Crear iframe de documentos
                        </h2>
                    </Link>

                    {documentIframes.data.map((documentIframe) => (
                        <article
                            key={documentIframe.public_id}
                            className="flex min-h-64 flex-col rounded-2xl border border-border bg-card p-6 shadow-sm"
                        >
                            <Link
                                href={show(documentIframe.public_id)}
                                className="flex flex-1 flex-col items-center justify-center text-center"
                            >
                                <div className="flex size-20 items-center justify-center rounded-2xl bg-primary/10">
                                    <FolderIcon className="size-11 text-primary" />
                                </div>

                                <h2 className="mt-4 text-lg font-semibold">
                                    {documentIframe.name}
                                </h2>

                                <span className="mt-2 rounded-full bg-secondary px-3 py-1 text-xs font-medium text-secondary-foreground">
                                    {documentIframe.view_label}
                                </span>
                            </Link>

                            <div className="mt-6 flex items-center justify-center gap-2 border-t border-border pt-4">
                                <Button
                                    variant="ghost"
                                    size="icon"
                                    asChild
                                    title="Vista previa"
                                >
                                    <Link
                                        href={preview(
                                            documentIframe.public_id,
                                        )}
                                    >
                                        <EyeIcon className="size-5" />
                                    </Link>
                                </Button>

                                <Button
                                    variant="ghost"
                                    size="icon"
                                    asChild
                                    title="Editar"
                                >
                                    <Link
                                        href={edit(
                                            documentIframe.public_id,
                                        )}
                                    >
                                        <PencilSquareIcon className="size-5" />
                                    </Link>
                                </Button>

                                <Button
                                    type="button"
                                    variant="ghost"
                                    size="icon"
                                    title="Copiar link"
                                    onClick={() =>
                                        void copyEmbedUrl(
                                            documentIframe.embed_url,
                                        )
                                    }
                                >
                                    <ClipboardDocumentIcon className="size-5" />
                                </Button>

                                <Button
                                    type="button"
                                    variant="ghost"
                                    size="icon"
                                    title="Eliminar"
                                    onClick={() =>
                                        deleteDocumentIframe(
                                            documentIframe,
                                        )
                                    }
                                >
                                    <TrashIcon className="size-5 text-destructive" />
                                </Button>
                            </div>
                        </article>
                    ))}
                </div>

                {documentIframes.data.length === 0 &&
                    filters.search && (
                        <div className="rounded-xl border border-border bg-muted/40 p-8 text-center">
                            <p className="text-sm text-muted-foreground">
                                No se encontraron iframes con la búsqueda
                                &quot;{filters.search}&quot;.
                            </p>
                        </div>
                    )}

                <Pagination {...documentIframes} />
            </div>
        </>
    );
}

DocumentsIndex.layout = {
    breadcrumbs: [
        {
            title: 'Documentos',
            href: index(),
        },
    ],
};