import { ActivityLogSidebar } from '@admin/components/activity-log/ActivityLogSidebar';
import { useModelActivityLog } from '@admin/components/activity-log/useModelActivityLog';
import { Form } from '@admin/components/form';
import HeadingSmall from '@admin/components/heading-small';
import { Button } from '@admin/components/ui/button';
import { Card, CardContent } from '@admin/components/ui/card';
import AdminLayout from '@admin/layouts/admin/admin-layout';
import { Head, router } from '@inertiajs/react';
import { BreadcrumbItem } from '@admin/types';
import { Activity, Save } from 'lucide-react';
import { ReactNode, useState, useEffect } from 'react';
import { useFormContext } from 'react-hook-form';
import { Switch } from "@admin/components/ui/switch";

interface Module {
    id: number;
    name: string;
    is_active: boolean;
    type:string;
}

interface Props {
    data: Module[];
}

// Skeleton Loader Components
const SkeletonModuleCard = () => (
    <Card className="overflow-hidden rounded-lg border bg-card p-0 animate-pulse">
        <div className="flex items-center justify-between bg-muted/40 p-3">
            <div className="h-5 w-32 bg-gray-200 rounded"></div>
            <div className="flex items-center gap-2">
                <div className="h-4 w-16 bg-gray-200 rounded"></div>
                <div className="h-4 w-4 bg-gray-200 rounded"></div>
            </div>
        </div>
    </Card>
);

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

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

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

// Module Card Component
const ModuleCard = ({ module }: { module: Module }) => {
    const { watch, setValue } = useFormContext();
    const isDefaultType = module.type === "default";
    const moduleStatus = isDefaultType ? true : watch(`appSettings.${module.id}.is_active`);

    return (
        <Card key={module.id} className="overflow-hidden rounded-lg border p-0">
            <div className="flex items-center justify-between bg-muted/40 p-3">
                <h3 className="font-semibold">{module.name}</h3>
                {!isDefaultType && (
                    <Switch
                        checked={!!moduleStatus}
                        onCheckedChange={(val) =>
                            setValue(`appSettings.${module.id}.is_active`, val)
                        }
                    />
                )}
            </div>
        </Card>
    );
};


// Main Index Component
export default function Index({ data }: Props) {
    const [isLoading, setIsLoading] = useState(true);
    const activityLogCtl = useModelActivityLog();

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

    // Default values for react-hook-form
    const defaultValues = {
        appSettings: data
            .filter(mod => mod.name !== "System")
            .reduce((acc: Record<string, any>, mod) => {
                acc[mod.id] = { is_active: mod.is_active };
                return acc;
            }, {}),
    };

    // Submit handler
    const submitHandler = async (formData: any) => {
        const payload = Object.entries(formData.appSettings).map(([id, module]: any) => ({
            id: Number(id),
            is_active: !!module.is_active,
        }));

        router.post(route('developer.app.management.update'), { appSettings: payload }, {
            onStart: () => setIsLoading(true),
            onSuccess: () => setTimeout(() => setIsLoading(false), 500),
            onError: () => setIsLoading(false),
        });
    };

    // Skeleton Loader
    if (isLoading) {
        return (
            <>
                <Head title="Loading App Settings..." />
                <div className="space-y-6 p-4">
                    <Card className="rounded-lg border px-5 py-3">
                        <div className="flex w-full items-start justify-between">
                            <SkeletonHeading />
                            <SkeletonButton />
                        </div>
                        <CardContent className="px-0 py-4">
                            <div className="grid gap-4 lg:grid-cols-3">
                                {[...Array(3)].map((_, index) => (
                                    <SkeletonModuleCard key={index} />
                                ))}
                            </div>
                            <div className="mt-6 flex justify-start">
                                <SkeletonSubmitButton />
                            </div>
                        </CardContent>
                    </Card>
                </div>
            </>
        );
    }

    return (
        <>
            <Head title="App Settings" />
            <div className="space-y-6 p-4">
                <Card className="rounded-lg border px-5 py-3">
                    <div className="flex w-full items-start justify-between">
                        <HeadingSmall
                            title="App Settings"
                            description="Customize which modules are available in your application"
                        />

                        <Button
                            variant="outline"
                            size="sm"
                            onClick={() =>
                                activityLogCtl.show({
                                    modelClass: 'Setting',
                                    title: 'App Modules Activity',
                                    action: 'app_modules_updated',
                                })
                            }
                        >
                            <Activity className="mr-1 h-4 w-4" /> Activity
                        </Button>
                    </div>
                    <CardContent className="px-0 py-4">
                        <Form defaultValues={defaultValues} submitHandler={submitHandler}>
                            <div className="grid gap-4 lg:grid-cols-3">
                                {data.map(module => (
                                    <ModuleCard key={module.id} module={module} />
                                ))}
                            </div>

                            <div className="mt-6 flex justify-start">
                                <Button type="submit" className="gap-2">
                                    <Save className="h-4 w-4" />
                                    Save Changes
                                </Button>
                            </div>
                        </Form>
                    </CardContent>
                </Card>
            </div>

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

const breadcrumbs: BreadcrumbItem[] = [
    { title: 'Dashboard', href: route('admin.dashboard.main') },
    { title: 'Developer', href: '#' },
    { title: 'App Settings', href: route('admin.developer.app.management.edit') },
];

Index.layout = (page: ReactNode) => (
    <AdminLayout breadcrumbs={breadcrumbs}>
        {page}
    </AdminLayout>
);
