import { ActivityLogSidebar } from '@admin/components/activity-log/ActivityLogSidebar';
import { useModelActivityLog } from '@admin/components/activity-log/useModelActivityLog';
import { DataTable } from '@admin/components/datatable';
import { SkeletonTableWithStateCard } from '@admin/components/skeleton';
import StatisticCardLarge from '@admin/components/dashboard/StatisticCardLarge';
import { Package, packageTableColumns } from '@admin/components/tableColumns/packageTableColumns';
import { Button } from '@admin/components/ui/button';
import AdminLayout from '@admin/layouts/admin/admin-layout';
import { fetchDatatable } from '@admin/lib/datatable-fetch';
import { bgColor } from '@admin/lib/Icon-bg-Color';
import { Head, router } from '@inertiajs/react';
import { List, Plus } from 'lucide-react';
import { useEffect, useState } from 'react';
import { toast } from 'sonner';

interface PackageSummaryItem {
    title: string;
    value: number;
}

export default function PackagesIndexAddon() {
    const [clientData, setClientData] = useState<any>({});
    const [summary, setSummary] = useState<PackageSummaryItem[]>([]);
    const [isLoading, setIsLoading] = useState(true);
    const [maxColumns, setMaxColumns] = useState(6);

    const activityLogCtl = useModelActivityLog();

    useEffect(() => {
        refetchPackages();
        const updateColumns = () => {
            const width = window.innerWidth;
            if (width < 640) setMaxColumns(1);
            else if (width < 768) setMaxColumns(2);
            else if (width < 1024) setMaxColumns(3);
            else if (width < 1280) setMaxColumns(4);
            else if (width < 1536) setMaxColumns(5);
            else setMaxColumns(6);
        };

        updateColumns();
        window.addEventListener('resize', updateColumns);
        return () => window.removeEventListener('resize', updateColumns);
    }, []);

    const refetchPackages = async () => {
        const url = route('admin.packages-addon.index');
        const queryParams = clientData?.queryParams || { per_page: 10, page: 1 };
        const json = await fetchDatatable<Package>(url, queryParams);
        setClientData({
            data: json.data,
            meta: json.meta,
            queryParams: queryParams,
            links: {
                prev: json.meta.current_page > 1 ? '' : null,
                next: json.meta.current_page < json.meta.last_page ? '' : null,
            },
        });

        if ((json as any).packageSummary) {
            setSummary((json as any).packageSummary as any);
        }
        setIsLoading(false);
    };

    const handleToggleStatus = (packageId: number) => {
        router.patch(
            route('admin.packages.toggle-status', packageId),
            {},
            {
                preserveScroll: true,
                onSuccess: () => {
                    toast.success('Add-On Package status updated');
                    refetchPackages();
                },
                onError: () => toast.error('Failed to update add-on package status'),
            },
        );
    };

    const handleViewPackage = (pkg: Package) => {
        router.visit(route('admin.packages.show', pkg.id));
    };

    const handleEditPackage = (pkg: Package) => {
        router.visit(route('admin.packages.edit', pkg.id));
    };

    const handleCreateAddonPackage = () => {
        router.visit(route('admin.packages-addon.create'));
    };

    const handleActivitySidebar = () => {
        return activityLogCtl.show({ modelClass: 'Package', title: 'Add-On Package Model Activity' });
    };

    const dataColumns = packageTableColumns({
        handleViewPackage,
        handleEditPackage,
        handleToggleStatus,
    });

    if (isLoading) {
        return (
            <>
                <Head title="Loading Add-On Packages..." />
                <SkeletonTableWithStateCard
                    showBreadcrumbs={true}
                    showActionButtons={true}
                    showStats={true}
                    statCount={4}
                    showTable={true}
                    tableRows={6}
                    animation="pulse"
                />
            </>
        );
    }

    return (
        <AdminLayout breadcrumbs={[{ title: 'Add On Package Management', href: route('admin.packages-addon.index') }]}>
            <Head title="Add-On Packages" />
            <div className="no-scrollbar rounded-xl p-4">
                <div className="">
                    <div className="mb-6 flex flex-col items-start justify-between gap-4 sm:flex-row sm:items-center">
                        <div className="grid grid-cols-1 gap-1">
                            <h2 className="text-xl font-bold sm:text-2xl">Add On Package Management</h2>
                            <div className="flex items-center text-sm text-gray-600">
                                <span>Administration</span>
                                <span className="mx-2">›</span>
                                <span>Packages</span>
                            </div>
                        </div>
                        <div className="flex flex-wrap gap-2 sm:gap-4">
                            <Button
                                className="bg-gray-600 text-white hover:bg-gray-700"
                                size="sm"
                                onClick={() => router.visit(route('admin.packages.index'))}
                            >
                                <div className="flex items-center gap-2">
                                    <List className="size-4" />
                                    <span className="hidden sm:inline">View All Packages</span>
                                </div>
                            </Button>
                            <Button
                                variant="secondary"
                                size="sm"
                                onClick={handleCreateAddonPackage}
                            >
                                <div className="flex items-center gap-2">
                                    <Plus className="size-4" />
                                    <span className="hidden sm:inline">Create Add-On Package</span>
                                </div>
                            </Button>
                        </div>
                    </div>

                    {summary.length > 0 && (
                        <div
                            className="mb-4 grid gap-4"
                            style={{
                                gridTemplateColumns: `repeat(${Math.min(summary?.length || 0, maxColumns)}, 1fr)`,
                            }}
                        >
                            {summary?.map((s: PackageSummaryItem, idx: number) => {
                                const { icon: Icon } = bgColor(s?.title);
                                return (
                                    <div key={idx}>
                                        <StatisticCardLarge
                                            title={s?.title || ''}
                                            value={s.value}
                                            iconbg={bgColor(s?.title).bg}
                                            icon={Icon as any}
                                            iconColor={bgColor(s?.title).icons}
                                        />
                                    </div>
                                );
                            })}
                        </div>
                    )}

                    <div className="w-full">
                        <DataTable
                            columns={dataColumns}
                            data={clientData?.data}
                            paginatedData={clientData}
                            tableKey="addon-packages-table"
                            enableRowClick={false}
                            fullHeight={false}
                            onNavigate={async (params) => {
                                const url = route('admin.packages-addon.index');
                                const json = await fetchDatatable<Package>(url, params);
                                setClientData({
                                    data: json.data,
                                    meta: json.meta,
                                    queryParams: params,
                                    links: {
                                        prev: json.meta.current_page > 1 ? '' : null,
                                        next: json.meta.current_page < json.meta.last_page ? '' : null,
                                    },
                                });
                                if ((json as any).packageSummary) {
                                    setSummary((json as any).packageSummary as any);
                                }
                            }}
                            handleActivitySidebar={handleActivitySidebar}
                        />
                    </div>
                </div>
            </div>

            <ActivityLogSidebar
                open={activityLogCtl.open}
                onOpenChange={activityLogCtl.setOpen}
                modelClass={activityLogCtl.modelClass}
                modelId={activityLogCtl.modelId}
                title={activityLogCtl.title}
            />
        </AdminLayout>
    );
}
