import { ActivityLogSidebar } from '@admin/components/activity-log/ActivityLogSidebar';
import { useModelActivityLog } from '@admin/components/activity-log/useModelActivityLog';
import HeadingSmall from '@admin/components/heading-small';
import { Button } from '@admin/components/ui/button';
import { Card, CardContent } from '@admin/components/ui/card';
import { Switch } from '@admin/components/ui/switch';
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;
    status: number;
    description?: string;
    module?: {
        id: number;
        status: number;
    };
};

// Skeleton Loader Components
const SkeletonCard = () => (
    <Card className="animate-pulse bg-muted/20 px-0">
        <CardContent className="">
            <div className="flex h-full flex-col space-y-4">
                <div className="space-y-4">
                    <div className="flex items-center justify-between">
                        <div className="space-y-2">
                            <div className="h-5 w-32 rounded bg-gray-200"></div>
                        </div>
                        <div className="h-6 w-11 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-96 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 { profile_settings } = usePage().props as any;
    const activityLogCtl = useModelActivityLog();

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

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

    // Only include settings with module.status === 1
    const activeSettings = profile_settings.filter((s: DashboardSetting) => s.module?.status === 1);

    // Local state
    const [settings, setSettings] = useState<DashboardSetting[]>(activeSettings);

    // Toggle switch => update "status"
    const handleStatusToggle = (id: number) => {
        setSettings((prev) => prev.map((s) => (s.id === id ? { ...s, status: s.status ? 0 : 1 } : s)));
    };

    const onSubmit = (e: React.FormEvent) => {
        e.preventDefault();

        // Only send id + status
        const payload = settings.map((s) => ({
            id: s.id,
            status: s.status,
        }));

        router.post(
            route('settings.profile.widget.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 Profile Settings..." />
                <SettingsLayout tab={'platform'}>
                    <div className="space-y-6">
                        <Card className="px-5 py-3">
                            <div className="mb-4 flex items-start justify-between">
                                <SkeletonHeading />
                                <SkeletonButton />
                            </div>

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

                                <div className="flex justify-start">
                                    <SkeletonSubmitButton />
                                </div>
                            </CardContent>
                        </Card>
                    </div>
                </SettingsLayout>
            </>
        );
    }

    return (
        <>
            <Head title="Profile Settings" />
            <SettingsLayout tab={'platform'}>
                <div className="space-y-6">
                    <Card className="px-5 py-3">
                        <div className="mb-3 flex items-center justify-between border-b">
                            <HeadingSmall title="Profile Settings" description="Manage visibility and options for platform elements" />

                            <Button
                                variant="outline"
                                size="sm"
                                onClick={() =>
                                    activityLogCtl.show({
                                        modelClass: 'ProfileSettings',
                                        title: 'Profile Settings Activity',
                                        action: 'profile_settings_updated',
                                    })
                                }
                            >
                                <Activity className="mr-1 h-4 w-4" /> Activity
                            </Button>
                        </div>

                        <CardContent className="px-0">
                            <form onSubmit={onSubmit}>
                                <div className="mb-8 grid grid-cols-1 gap-6 md:grid-cols-3 2xl:grid-cols-4">
                                    {settings.map((setting) => {
                                        return (
                                            <Card key={setting.id} className="py-2">
                                                <CardContent className="px-0">
                                                    <div className="flex h-full flex-col space-y-4">
                                                        <div className="space-y-4">
                                                            <div className="flex items-center justify-between">
                                                                <div>
                                                                    <h3 className="mb-1 font-semibold">{setting.name}</h3>
                                                                </div>
                                                                <Switch
                                                                    id={`status-${setting.id}`}
                                                                    checked={!!setting.status}
                                                                    onCheckedChange={() => handleStatusToggle(setting.id)}
                                                                />
                                                            </div>
                                                        </div>
                                                    </div>
                                                </CardContent>
                                            </Card>
                                        );
                                    })}
                                </div>

                                <div className="flex justify-start">
                                    <Button className="bg-success hover:bg-brand-800" 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: 'Profile Settings', href: '#' },
        ]}
        title="Profile Settings"
    >
        {page}
    </AppLayout>
);
