import { ActivityLogSidebar } from '@admin/components/activity-log/ActivityLogSidebar';
import { useModelActivityLog } from '@admin/components/activity-log/useModelActivityLog';
import Form from '@admin/components/form/Form';
import FormField from '@admin/components/form/FormField';
import HeadingSmall from '@admin/components/heading-small';
import { Button } from '@admin/components/ui/button';
import { Card, CardContent } from '@admin/components/ui/card';
import AppLayout from '@admin/layouts/app-layout';
import SettingsLayout from '@admin/layouts/settings/layout';
import { Head, router, usePage } from '@inertiajs/react';
import { Activity, Save } from 'lucide-react';
import { ReactNode, useEffect, useState } from 'react';

type DashboardSetting = {
    id: number;
    module_id: number;
    name: string;
    description: string;
    status: number;
    show_on_module_dashboard: number;
    is_available_to_platform: number;
    show_on_platform: number;
    created_at?: string;
    updated_at?: string;
};

// Skeleton Loader Components
const SkeletonCard = () => (
    <Card className="animate-pulse overflow-hidden rounded-lg border py-0">
        <CardContent className="h-full px-0 py-4 pb-0">
            <div className="flex h-full flex-col">
                {/* Header with title and toggle */}
                <div className="flex items-start justify-between gap-4">
                    <div className="flex min-h-[4rem] min-w-0 flex-1 flex-col">
                        <div className="mb-2 h-6 w-32 rounded bg-gray-200"></div>
                        <div className="h-3 w-48 rounded bg-gray-200"></div>
                    </div>
                    <div className="flex-shrink-0 pt-1">
                        <div className="h-6 w-12 rounded-full bg-gray-200"></div>
                    </div>
                </div>
            </div>
        </CardContent>
    </Card>
);

const SkeletonHeading = () => (
    <div className="space-y-2">
        <div className="h-6 w-48 animate-pulse rounded bg-gray-200"></div>
        <div className="h-4 w-64 animate-pulse rounded bg-gray-200"></div>
    </div>
);

const SkeletonButton = () => <div className="h-9 w-24 animate-pulse rounded bg-gray-200"></div>;

const SkeletonSubmitButton = () => <div className="h-10 w-32 animate-pulse rounded bg-gray-200"></div>;

export default function Edit() {
    const [isLoading, setIsLoading] = useState(true);
    const { dashboard_settings } = usePage().props as any;
    const settings = dashboard_settings as DashboardSetting[];
    const activityLogCtl = useModelActivityLog();

    // Show skeleton for 1 second
    useEffect(() => {
        const timer = setTimeout(() => {
            setIsLoading(false);
        }, 500);

        return () => clearTimeout(timer);
    }, []);

    // Prepare default values for the form (only status now)
    const defaultValues = settings.reduce((acc: any, setting: DashboardSetting) => {
        acc[`status_${setting.id}`] = !!setting.status;
        return acc;
    }, {});

    const handleSubmit = (data: any) => {
        // Transform form data back to expected format
        const payload = settings.map((setting: DashboardSetting) => ({
            id: setting.id,
            status: data[`status_${setting.id}`] ? 1 : 0,
        }));

        router.post(
            route('settings.dashboard.update'),
            { settings: payload },
            {
                onStart: () => {
                    setIsLoading(true); // show skeleton while request is running
                },
                onSuccess: () => {
                    setTimeout(() => {
                        setIsLoading(false);
                    }, 500);
                    // ✅ hide skeleton after success
                },
                onError: () => {
                    setIsLoading(false); // also hide if failed
                },
            },
        );
    };

    // Skeleton Loader
    if (isLoading) {
        return (
            <>
                <Head title="Loading Dashboard Settings..." />
                <SettingsLayout tab={'platform'}>
                    <div className="space-y-6">
                        <Card className="rounded-lg border px-5 py-3">
                            <div className="mb-4 flex items-start justify-between">
                                <SkeletonHeading />
                                <SkeletonButton />
                            </div>

                            <CardContent className="px-0">
                                <div className="space-y-6">
                                    <div className="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
                                        {[...Array(6)].map((_, index) => (
                                            <SkeletonCard key={index} />
                                        ))}
                                    </div>

                                    <div className="flex justify-start border-gray-200 pt-4">
                                        <SkeletonSubmitButton />
                                    </div>
                                </div>
                            </CardContent>
                        </Card>
                    </div>
                </SettingsLayout>
            </>
        );
    }

    return (
        <>
            <Head title="Dashboard Settings" />
            <SettingsLayout tab={'platform'}>
                <div className="space-y-6">
                    <Card className="rounded-lg border px-5 py-3">
                        <div className="mb-3 flex items-center justify-between border-b">
                            <HeadingSmall title="Dashboard Settings" description="Configure how you set Elements" />
                            <Button
                                variant="outline"
                                size="sm"
                                onClick={() =>
                                    activityLogCtl.show({
                                        modelClass: 'DashboardSettings',
                                        title: 'Dashboard Settings Activity',
                                        action: 'dashboard_settings_updated',
                                    })
                                }
                            >
                                <Activity className="mr-1 h-4 w-4" /> Activity
                            </Button>
                        </div>

                        <CardContent className="px-0">
                            <Form defaultValues={defaultValues} submitHandler={handleSubmit} formClassNames="space-y-6">
                                <div className="grid grid-cols-1 gap-6 md:grid-cols-3 2xl:grid-cols-4">
                                    {settings.map((setting: DashboardSetting) => {
                                        return (
                                            <Card key={setting.id} className="overflow-hidden rounded-lg border p-3 py-2 transition-all">
                                                <CardContent className="h-full px-0">
                                                    <div className="flex h-full flex-col">
                                                        {/* Header with title and toggle */}
                                                        <div className="mb-1 flex items-start justify-between gap-4">
                                                            <div className="flex min-h-[4rem] min-w-0 flex-1 flex-col">
                                                                <h3 className="line-clamp-1 text-lg font-semibold text-primary">{setting.name}</h3>
                                                                <p
                                                                    title={setting.description}
                                                                    className="mt-1 line-clamp-2 flex-1 text-sm leading-tight text-gray-500"
                                                                >
                                                                    {setting.description}
                                                                </p>
                                                            </div>
                                                            <div className="flex-shrink-0 pt-1">
                                                                <FormField
                                                                    type="toggle"
                                                                    name={`status_${setting.id}`}
                                                                    toggleLabel=""
                                                                    className="data-[state=checked]:bg-success"
                                                                />
                                                            </div>
                                                        </div>
                                                    </div>
                                                </CardContent>
                                            </Card>
                                        );
                                    })}
                                </div>

                                <div className="flex justify-start border-gray-200 pt-4">
                                    <Button className="bg-success px-8 py-2 hover:bg-success/90" type="submit">
                                        <Save className="h-4 w-4" />
                                        Save Changes
                                    </Button>
                                </div>
                            </Form>
                        </CardContent>
                    </Card>
                </div>
            </SettingsLayout>

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

Edit.layout = (page: ReactNode) => (
    <AppLayout
        breadcrumbs={[
            { title: 'Home', href: '/' },
            { title: 'Settings', href: '#' },
            { title: 'Dashboard Settings', href: '#' },
        ]}
        title="Dashboard Settings"
    >
        {page}
    </AppLayout>
);
