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, CardHeader } 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, Link, router } from '@inertiajs/react';
import { Activity, ExternalLink } from 'lucide-react';
// Removed in-page module switcher (Settings layout already handles module context)
import { ReactNode } from 'react';
// removed toast import (empty-state block deleted)

type EmailTemplateContent = {
    subject: string;
    header: string;
    body: string;
    footer: string;
    banner: string | null;
    tags: string[];
};

type EmailTemplate = {
    id: number;
    uid: string;
    name: string;
    description: string;
    content: EmailTemplateContent;
    status: 'ACTIVE' | 'INACTIVE' | string;
    group?: string;
    group_slug?: string;
    created_at: string;
    updated_at: string;
};

type IndexProps = {
    // New shape: grouped by module name
    emailTemplates: Record<string, EmailTemplate[]>;
};

export default function Index({ emailTemplates }: IndexProps) {
    const activityLogCtl = useModelActivityLog();
    // Determine module tab (prefer single returned module, else default Platform)
    const moduleNames = Object.keys(emailTemplates || {});
    const currentModule = (moduleNames.length === 1 ? moduleNames[0] : 'Platform') as string;
    const settingsTab = (currentModule || 'Platform').toLowerCase();

    const handleToggleTemplate = (templateId: string, currentStatus: string) => {
        const newStatus = currentStatus === 'ACTIVE' ? 0 : 1;
        router.put(
            route('settings.email-templates.email-templates.update-status', { uid: templateId }),
            { status: newStatus },
            {
                preserveScroll: true,
                onError: (errors) => {
                    alert('Failed to update template status');
                    console.error(errors);
                },
            },
        );
    };
    // Convert grouped-by-module to array for rendering
    const modules = Object.entries(emailTemplates || {});
    const handleAllToggle = (group: any) => {
        const status = group.items.every((item: EmailTemplate) => item.status === 'ACTIVE') ? 0 : 1;
        const slug = group?.group_slug;
        router.put(
            route('settings.email-templates.email-template-groups.update-status', { slug }),
            { status },
            {
                preserveScroll: true,
                onError: (errors) => {
                    alert('Failed to update template group status');
                    console.error(errors);
                },
            },
        );
    };
    return (
        <>
            <Head title="Email Settings" />
            <SettingsLayout tab={settingsTab}>
                <Card className="space-y-5 border px-5 py-3">
                    <div className="mb-3 flex items-center justify-between border-b">
                        <HeadingSmall title={`Email Templates `} description="Configure template availability per group." />
                        <Button
                            variant="outline"
                            size="sm"
                            onClick={() =>
                                activityLogCtl.show({
                                    modelClass: 'Setting',
                                    title: 'Email Templates Activity',
                                    action: 'email_templates_updated',
                                })
                            }
                        >
                            <Activity className="mr-1 h-4 w-4" /> Activity
                        </Button>
                    </div>

                    {modules.map(([moduleName, items]) => {
                        // Group each module's templates by 'group'
                        const grouped = (items as EmailTemplate[]).reduce<
                            Record<string, { title: string; items: EmailTemplate[]; group_slug?: string }>
                        >((acc, template) => {
                            const group = template.group || 'General';
                            if (!acc[group]) acc[group] = { title: group, items: [], group_slug: template.group_slug };
                            acc[group].items.push(template);
                            return acc;
                        }, {});
                        // Order group sections by desired order, then alphabetically for others
                        const order: Record<string, number> = {
                            'Authentication and Security': 0,
                            'User And Role Management': 1,
                        };
                        const groups = Object.values(grouped).sort((a, b) => {
                            const oa = order[a.title] ?? 99;
                            const ob = order[b.title] ?? 99;
                            if (oa === ob) return a.title.localeCompare(b.title);
                            return oa - ob;
                        });
                        return (
                            <Card className="" key={moduleName}>
                                <h3 className="pb-2 text-xl font-semibold capitalize">{moduleName}</h3>
                                <div key={moduleName}>
                                    {groups.length > 0 && (
                                        <div className="grid grid-cols-1 gap-2 md:grid-cols-2">
                                            {groups.map((group) => (
                                                <Card
                                                    key={`${moduleName}-${group.title}`}
                                                    className="rounded-lg border border-gray-200 px-0 py-0 shadow-none"
                                                >
                                                    <div className="flex items-center justify-between border-b bg-muted py-3 pr-3">
                                                        <CardHeader className="px-3 py-0">
                                                            <h2 className="text-lg font-semibold">{group.title}</h2>
                                                        </CardHeader>
                                                        <Switch
                                                            checked={group.items.every((item) => item.status === 'ACTIVE')}
                                                            onCheckedChange={() => handleAllToggle(group)}
                                                            className=""
                                                        />
                                                    </div>
                                                    <div className="my-2 grid grid-cols-1 rounded-lg">
                                                        {group.items.map((template, idx) => {
                                                            const isLast = idx === group.items.length - 1;
                                                            return (
                                                                <Card key={template.id} className="border-none p-0">
                                                                    <CardHeader className={`flex flex-col ${!isLast ? 'border-b' : ''} p-3`}>
                                                                        <div className="flex items-center justify-between">
                                                                            <Link
                                                                                title={template.description || 'No content'}
                                                                                href={route('settings.email-templates.edit', { uid: template.uid })}
                                                                                className="flex cursor-pointer items-center gap-1 font-semibold transition-colors hover:text-primary hover:underline"
                                                                            >
                                                                                <span>{template.name}</span>
                                                                                <ExternalLink size={14} />
                                                                            </Link>
                                                                            <Switch
                                                                                checked={template.status === 'ACTIVE'}
                                                                                onCheckedChange={() =>
                                                                                    handleToggleTemplate(template.uid, template.status)
                                                                                }
                                                                            />
                                                                        </div>
                                                                    </CardHeader>
                                                                </Card>
                                                            );
                                                        })}
                                                    </div>
                                                </Card>
                                            ))}
                                        </div>
                                    )}
                                </div>
                            </Card>
                        );
                    })}
                </Card>
            </SettingsLayout>
            <ActivityLogSidebar
                open={activityLogCtl.open}
                onOpenChange={activityLogCtl.setOpen}
                modelClass={activityLogCtl.modelClass}
                modelId={activityLogCtl.modelId}
                title={activityLogCtl.title}
                action={activityLogCtl.action}
                actions={activityLogCtl.actions}
            />
        </>
    );
}

Index.layout = (page: ReactNode) => {
    // Infer module from page props if provided
    // @ts-ignore
    const module = (page as any).props?.module || (page as any).props?.emailTemplates?.queryParams?.module || 'Platform';
    const tab = (module || 'Platform').toLowerCase();
    return (
        <AppLayout
            breadcrumbs={[
                { title: 'Home', href: '/' },
                { title: 'Settings', href: '/settings/global_settings' },
            ]}
            title="Email Settings"
        >
            {/* Clone page with injected tab for SettingsLayout wrapper inside component tree */}
            {page}
        </AppLayout>
    );
};
