import { Head, usePage } from '@inertiajs/react';
import { Upload } from 'lucide-react';
import { useCallback, useState } from 'react';
import { PageHeaderActions } from '@/components/page-header-actions';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
import {
    Dialog,
    DialogBody,
    DialogContent,
    DialogDescription,
    DialogIconClose,
    DialogHeader,
    DialogTitle,
} from '@/components/ui/dialog';
import { ClientDocumentSidePanel } from '@/features/documents/components/client-document-side-panel';
import { DocumentsActiveFilters } from '@/features/documents/components/documents-active-filters';
import { DocumentsTableToolbar } from '@/features/documents/components/documents-table-toolbar';
import { ClientDocumentUploadForm } from '@/features/documents/forms/client-document-upload-form';
import { useDocumentsListProcessingSync } from '@/features/documents/hooks/use-document-processing-sync';
import { useClientDocumentsFilters } from '@/features/documents/lib/use-client-documents-filters';
import { useClientDocumentsColumns } from '@/features/documents/table/client-documents-columns';
import { DocumentsTable } from '@/features/documents/table/documents-table';
import type { ClientDocumentsIndexPageProps } from '@/features/documents/types';

export default function ClientDocumentsIndexPage() {
    const { documents, filters: initialFilters, constraints, options, selected_document } =
        usePage<ClientDocumentsIndexPageProps>().props;
    const { filters, search, setSearch, isApplying, applyFilters, resetFilters, openDocumentModal, closeDocumentModal } =
        useClientDocumentsFilters(initialFilters);
    const [expandedDocumentId, setExpandedDocumentId] = useState<number | null>(null);
    const [uploadModalOpen, setUploadModalOpen] = useState(false);

    useDocumentsListProcessingSync(documents.data, ['documents', 'selected_document']);

    const onSort = useCallback(
        (column: 'accountant_status') => {
            const nextDirection = filters.sort_by === column && filters.sort_direction === 'asc' ? 'desc' : 'asc';

            applyFilters({
                page: 1,
                sort_by: column,
                sort_direction: nextDirection,
            });
        },
        [applyFilters, filters.sort_by, filters.sort_direction],
    );

    const onToggleExpand = useCallback((documentId: number) => {
        setExpandedDocumentId((current) => (current === documentId ? null : documentId));
    }, []);

    const columns = useClientDocumentsColumns(onSort, openDocumentModal, expandedDocumentId, onToggleExpand);

    return (
        <>
            <Head title="Documentele mele" />

            <section className="space-y-6">
                <PageHeaderActions
                    title="Documentele mele"
                    description="Vezi statusul documentelor incarcate de compania ta si deschide detaliile pentru cele procesate."
                    actions={
                        <Button type="button" onClick={() => setUploadModalOpen(true)}>
                            <Upload className="h-4 w-4" />
                            Incarca document
                        </Button>
                    }
                />

                <div className={selected_document ? 'grid gap-4 lg:grid-cols-[minmax(0,1.7fr)_minmax(360px,1fr)]' : 'grid grid-cols-1'}>
                    <Card>
                        <CardHeader className="space-y-4">
                            <DocumentsTableToolbar
                                search={search}
                                onSearchChange={setSearch}
                                onSearchSubmit={() =>
                                    applyFilters({
                                        page: 1,
                                        search,
                                    })
                                }
                                filters={filters}
                                clientOptions={options.clients}
                                uploaderOptions={options.uploaders}
                                onApplyFilters={applyFilters}
                                onResetFilters={resetFilters}
                                hidePipelineFilters
                            />

                            <DocumentsActiveFilters
                                search={search}
                                filters={filters}
                                clientOptions={options.clients}
                                uploaderOptions={options.uploaders}
                                onClearAll={resetFilters}
                                onRemoveSearch={() => {
                                    setSearch('');
                                    applyFilters({
                                        page: 1,
                                        search: '',
                                    });
                                }}
                                onRemoveClient={() =>
                                    applyFilters({
                                        page: 1,
                                        client_id: null,
                                    })
                                }
                                onRemoveUploader={() =>
                                    applyFilters({
                                        page: 1,
                                        uploaded_by_user_id: null,
                                    })
                                }
                                onRemoveAccountantStatus={() =>
                                    applyFilters({
                                        page: 1,
                                        accountant_status: '',
                                    })
                                }
                                onRemoveAiStatus={() =>
                                    applyFilters({
                                        page: 1,
                                        ai_status: '',
                                    })
                                }
                                onRemoveExtractionStatus={() =>
                                    applyFilters({
                                        page: 1,
                                        extraction_status: '',
                                    })
                                }
                                onRemoveUploadedFrom={() =>
                                    applyFilters({
                                        page: 1,
                                        uploaded_from: '',
                                    })
                                }
                                onRemoveUploadedTo={() =>
                                    applyFilters({
                                        page: 1,
                                        uploaded_to: '',
                                    })
                                }
                                hidePipelineFilters
                            />
                        </CardHeader>

                        <CardContent className="space-y-4">
                            <DocumentsTable
                                columns={columns}
                                data={documents.data}
                                pagination={documents.meta}
                                onPageChange={(page) => applyFilters({ page })}
                                isLoading={isApplying}
                                expandedDocumentId={expandedDocumentId}
                            />
                        </CardContent>
                    </Card>

                    {selected_document ? (
                        <ClientDocumentSidePanel
                            document={selected_document}
                            onClose={closeDocumentModal}
                        />
                    ) : null}
                </div>
            </section>

            <Dialog open={uploadModalOpen} onOpenChange={setUploadModalOpen}>
                <DialogContent className="max-w-2xl gap-0">
                    <DialogHeader>
                        <div className="flex items-start justify-between gap-3">
                            <div className="min-w-0">
                                <DialogTitle>Incarcare document</DialogTitle>
                                <DialogDescription>
                                    Incarca un document contabil in format PDF sau imagine. Dimensiune maxima:{' '}
                                    {constraints.max_file_size_mb}MB.
                                </DialogDescription>
                            </div>
                            <DialogIconClose />
                        </div>
                    </DialogHeader>

                    <DialogBody>
                    <ClientDocumentUploadForm
                        constraints={{
                            maxFileSizeMb: constraints.max_file_size_mb,
                            acceptedExtensions: constraints.accepted_extensions,
                        }}
                        renderInCard={false}
                        onSuccess={() => setUploadModalOpen(false)}
                    />
                    </DialogBody>
                </DialogContent>
            </Dialog>
        </>
    );
}
