import Card from '@/Components/Card';
import { Badge } from '@/Components/ui/badge';
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import DocumentFilters from '@/Pages/Document/DocumentFilters';
import DocumentViewAction from '@/Pages/Document/DocumentViewAction';
import { ALL_TYPES_VALUE, formatFileSize } from '@/Pages/Document/documentFile';
import { Document, DocumentType, User } from '@/types';
import { Head, router, usePage } from '@inertiajs/react';
import { useState } from 'react';

interface PatientListProps {
    documents: Document[];
    documentTypes: DocumentType[];
    patient: User;
}

export default function PatientList({
    documents,
    documentTypes,
    patient,
}: PatientListProps) {
    const user = usePage().props.auth.user;
    const { filters } = usePage().props;
    const [search, setSearch] = useState(filters?.search || '');
    const [typeId, setTypeId] = useState(
        filters?.document_type_id || ALL_TYPES_VALUE,
    );

    // Search and type filter travel together, so that changing one does not
    // reset the other.
    const reload = (params: { search: string; typeId: string }) => {
        router.get(
            route('patient-documents', { patient: patient.id }),
            {
                search: params.search,
                document_type_id:
                    params.typeId === ALL_TYPES_VALUE ? '' : params.typeId,
            },
            {
                preserveState: true,
                preserveScroll: true,
                replace: true, // Prevent duplicate history entries
            },
        );
    };

    const handleSearchChange = (value: string) => {
        setSearch(value);
        reload({ search: value, typeId });
    };

    const handleTypeChange = (value: string) => {
        setTypeId(value);
        reload({ search, typeId: value });
    };

    const isFiltering = search !== '' || typeId !== ALL_TYPES_VALUE;

    const documentCards = documents.map((patientDocument) => (
        <Card
            key={patientDocument.id}
            className="flex items-center justify-between gap-4 bg-white p-4 text-black"
        >
            <div className="min-w-0">
                <div className="truncate font-medium">
                    {patientDocument.name}
                </div>
                <div className="mt-1 flex items-center gap-2 text-sm text-zinc-500">
                    <Badge variant="secondary">
                        {patientDocument.type.name}
                    </Badge>
                    <span>{formatFileSize(patientDocument.size)}</span>
                    <span>
                        {new Date(
                            patientDocument.created_at,
                        ).toLocaleDateString('it')}
                    </span>
                </div>
            </div>
            <DocumentViewAction document={patientDocument} />
        </Card>
    ));

    const backLinkLabel =
        patient.id === user.id
            ? 'Dashboard'
            : `${patient.name} ${patient.surname}`;

    return (
        <AuthenticatedLayout
            backLink={route('dashboard.personal', { target: patient.id })}
            backLinkLabel={backLinkLabel}
        >
            <Head title="Documenti" />

            <div className="py-2">
                <div className="mx-auto max-w-7xl sm:px-6 lg:px-8">
                    <div className="overflow-hidden sm:rounded-lg">
                        <div className="p-6 text-gray-900">
                            <div className="scroll-m-20 text-4xl font-light tracking-tight lg:text-5xl">
                                Documenti
                            </div>
                            <div className="container mx-auto py-10">
                                <DocumentFilters
                                    search={search}
                                    typeId={typeId}
                                    documentTypes={documentTypes}
                                    onSearchChange={handleSearchChange}
                                    onTypeChange={handleTypeChange}
                                />
                                <div className="flex flex-col gap-4">
                                    {documentCards.length ? (
                                        documentCards
                                    ) : (
                                        <div className="text-center">
                                            {isFiltering
                                                ? 'Nessun risultato.'
                                                : 'Nessun documento disponibile.'}
                                        </div>
                                    )}
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </AuthenticatedLayout>
    );
}
