import { DataTable } from '@admin/components/datatable';
import { SkeletonTableWithStateCard } from '@admin/components/skeleton';
import StatisticCardLarge from '@admin/components/dashboard/StatisticCardLarge';
import { Subscription, subscriptionTableColumns } from '@admin/components/tableColumns/subscriptionTableColumns';
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 { Plus } from 'lucide-react';
import { useEffect, useState } from 'react';
import { toast } from 'sonner';

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

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

    useEffect(() => {
        refetchSubscriptions();
        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 refetchSubscriptions = async () => {
        const url = route('admin.subscriptions.index');
        const queryParams = clientData?.queryParams || { per_page: 10, page: 1 };
        const json = await fetchDatatable<Subscription>(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).subscriptionSummary) {
            setSummary((json as any).subscriptionSummary as any);
        }
        setIsLoading(false);
    };

    const handleViewSubscription = (subscription: Subscription) => {
        router.visit(route('admin.subscriptions.show', subscription.id));
    };

    const handleEditSubscription = (subscription: Subscription) => {
        router.visit(route('admin.subscriptions.edit', subscription.id));
    };

    const handlePaymentSubscription = (subscription: Subscription) => {
        router.visit(route('admin.transactions.payment', subscription.id));
    };

    const handleCreateSubscription = () => {
        router.visit(route('admin.subscriptions.create'));
    };

    const dataColumns = subscriptionTableColumns({
        handleViewSubscription,
        handleEditSubscription,
        handlePaymentSubscription,
    });

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

    return (
        <AdminLayout breadcrumbs={[{ title: 'Subscription Management', href: route('admin.subscriptions.index') }]}>
            <Head title="Subscriptions" />
            <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">Subscription Management</h2>
                            <div className="flex items-center text-sm text-gray-600">
                                <span>Administration</span>
                                <span className="mx-2">›</span>
                                <span>Subscriptions</span>
                            </div>
                        </div>
                        <div className="flex flex-wrap gap-2 sm:gap-4">
                            <Button className="bg-success text-white hover:bg-brand-800" size="sm" onClick={handleCreateSubscription}>
                                <div className="flex items-center gap-2">
                                    <Plus className="size-4" />
                                    <span className="hidden sm:inline">Create Subscription</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: SubscriptionSummaryItem, idx: number) => {
                                const { icon: Icon } = bgColor(String(s?.title));
                                return (
                                    <div key={idx}>
                                        <StatisticCardLarge
                                            title={String(s?.title || '')}
                                            value={s.value}
                                            iconbg={bgColor(String(s?.title)).bg}
                                            icon={Icon as any}
                                            iconColor={bgColor(String(s?.title)).icons}
                                        />
                                    </div>
                                );
                            })}
                        </div>
                    )}

                    <div className="w-full">
                        <DataTable
                            columns={dataColumns}
                            data={clientData?.data}
                            paginatedData={clientData}
                            tableKey="subscriptions-table"
                            enableRowClick={false}
                            fullHeight={false}
                            onNavigate={async (params) => {
                                const url = route('admin.subscriptions.index');
                                const json = await fetchDatatable<Subscription>(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,
                                    },
                                });
                            }}
                        />
                    </div>
                </div>
            </div>
        </AdminLayout>
    );
}
