import { DataTable } from '@admin/components/datatable';
import { SkeletonTableWithStateCard } from '@admin/components/skeleton';
import StatisticCardLarge from '@admin/components/dashboard/StatisticCardLarge';
import { Transaction, transactionTableColumns } from '@admin/components/tableColumns/transactionTableColumns';
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 } from '@inertiajs/react';
import { useEffect, useState } from 'react';

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

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

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

    const dataColumns = transactionTableColumns();

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

    return (
        <AdminLayout breadcrumbs={[{ title: 'Transaction Management', href: route('admin.transactions.index') }]}>
            <Head title="Transactions" />
            <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">Transaction Management</h2>
                            <div className="flex items-center text-sm text-gray-600">
                                <span>Administration</span>
                                <span className="mx-2">›</span>
                                <span>Transactions</span>
                            </div>
                        </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: TransactionSummaryItem, 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="overflow-x-auto">
                        <DataTable
                            columns={dataColumns}
                            data={clientData?.data}
                            paginatedData={clientData}
                            tableKey="transactions-table"
                            enableRowClick={false}
                            fullHeight={false}
                            onNavigate={async (params) => {
                                const url = route('admin.transactions.index');
                                const json = await fetchDatatable<Transaction>(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>
    );
}
