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 AdminLayout from '@admin/layouts/admin/admin-layout';
import AdminSettingsLayout from '@admin/layouts/admin/admin-settings-layout';
import { Head, Link, router } from '@inertiajs/react';
import { ExternalLink } from 'lucide-react';
import { ReactNode } from 'react';

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 = {
    emailTemplates: Record<string, EmailTemplate[]>;
};

export default function EmailTemplates({ emailTemplates }: IndexProps) {
    const handleToggleTemplate = (templateId: string, currentStatus: string) => {
        const newStatus = currentStatus === 'ACTIVE' ? 0 : 1;
        router.put(
            `/admin/settings/email-templates/${templateId}/status`,
            { status: newStatus },
            {
                preserveScroll: true,
                onError: (errors) => {
                    alert('Failed to update template status');
                    console.error(errors);
                },
            },
        );
    };

    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(
            `/admin/settings/email-templates/groups/${slug}/status`,
            { status },
            {
                preserveScroll: true,
                onError: (errors) => {
                    alert('Failed to update template group status');
                    console.error(errors);
                },
            },
        );
    };

    return (
        <>
            <Head title="Email Templates - Admin" />
            <AdminSettingsLayout activeTab="email-templates">
                <Card className="space-y-5 border px-5 py-4">
                    <div className="mb-3 border-b pb-3">
                        <HeadingSmall title="Email Templates" description="Configure template availability per group" />
                    </div>

                    {modules.map(([moduleName, items]) => {
                        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;
                        }, {});

                        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 key={moduleName}>
                                <h3 className="pb-2 text-xl font-semibold capitalize">{moduleName}</h3>
                                <div>
                                    {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)}
                                                        />
                                                    </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={`/admin/settings/email-templates/${template.uid}/edit`}
                                                                                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>
            </AdminSettingsLayout>
        </>
    );
}

EmailTemplates.layout = (page: ReactNode) => (
    <AdminLayout breadcrumbs={[{ title: 'Settings', href: '/admin/settings/general' }, { title: 'Email Templates', href: '#' }]}>
        {page}
    </AdminLayout>
);
