import { Head, Link, router, useForm } from '@inertiajs/react';
import {
    ArrowLeft,
    Megaphone,
    Calendar,
    MessageSquare,
    FileText,
    RefreshCw,
    Sparkles,
} from 'lucide-react';
import * as React from 'react';
import { toast } from 'sonner';
import { TemplatePreview } from '@/components/template-preview';
import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { FileUpload } from '@/components/ui/file-upload';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import {
    Select,
    SelectContent,
    SelectItem,
    SelectTrigger,
    SelectValue,
} from '@/components/ui/select';
import { Textarea } from '@/components/ui/textarea';

interface WabaAccount {
    id: number;
    phone_number: string;
    display_name: string | null;
}

interface TemplateComponent {
    type: string;
    format?: string;
    text?: string;
    buttons?: any[];
}

interface MessageTemplate {
    id: number;
    name: string;
    language: string;
    category: string;
    whatsapp_account_id: number;
    components: TemplateComponent[];
}

interface Group {
    id: number;
    name: string;
    contacts_count: number;
}

interface CampaignCreateProps {
    accounts: WabaAccount[];
    templates: MessageTemplate[];
    groups: Group[];
    timezones: string[];
    defaultTimezone: string;
}

interface ParsedRecipient {
    phone_number: string;
    variables?: string[] | null;
    named_variables?: Record<string, string> | null;
}

export default function CampaignCreate({
    accounts,
    templates,
    groups,
    timezones,
    defaultTimezone,
}: CampaignCreateProps) {
    const [selectedAccId, setSelectedAccId] = React.useState(
        accounts.length > 0 ? String(accounts[0].id) : '',
    );
    const [selectedTempId, setSelectedTempId] = React.useState('');
    const [messageType, setMessageType] = React.useState<'template' | 'direct'>(
        'template',
    );
    const [targetType, setTargetType] = React.useState<'file' | 'group'>(
        'file',
    );
    const [recipients, setRecipients] = React.useState<ParsedRecipient[]>([]);
    const [detectedVariables, setDetectedVariables] = React.useState<string[]>([]);
    const [syncingTemplates, setSyncingTemplates] = React.useState(false);
    const [parsing, setParsing] = React.useState(false);
    const browserTimezone = React.useMemo(() => {
        return (
            Intl.DateTimeFormat().resolvedOptions().timeZone || defaultTimezone
        );
    }, [defaultTimezone]);

    const { data, setData, post, processing, errors } = useForm({
        name: '',
        whatsapp_account_id: '',
        message_type: 'template',
        message_template_id: '',
        direct_message_body: '',
        scheduled_at: '',
        scheduled_timezone: timezones.includes(browserTimezone)
            ? browserTimezone
            : defaultTimezone,
        contact_group_id: '',
        recipients: [] as any[],
    });

    // Filter templates to only show the ones created for the selected phone number
    const filteredTemplates = React.useMemo(() => {
        if (!selectedAccId) {
            return [];
        }

        return templates.filter(
            (t) => String(t.whatsapp_account_id) === selectedAccId,
        );
    }, [templates, selectedAccId]);

    // Update form state when selected ids change
    React.useEffect(() => {
        setData('whatsapp_account_id', selectedAccId);
    }, [selectedAccId, setData]);

    React.useEffect(() => {
        setData('message_template_id', selectedTempId);
    }, [selectedTempId, setData]);

    React.useEffect(() => {
        setData('message_type', messageType);

        if (messageType === 'direct') {
            setTimeout(() => setSelectedTempId(''), 0);
            setData('message_template_id', '');
        } else {
            setData('direct_message_body', '');
        }
    }, [messageType, setData]);

    React.useEffect(() => {
        if (targetType === 'file') {
            setData('contact_group_id', '');
            setTimeout(() => {
                setRecipients([]);
                setDetectedVariables([]);
            }, 0);
        } else {
            setData('recipients', []);
            setTimeout(() => {
                setRecipients([]);
                setDetectedVariables([]);
            }, 0);
        }
    }, [targetType, setData]);

    const handleSyncTemplates = () => {
        setSyncingTemplates(true);
        router.post(
            '/dashboard/templates/sync',
            {},
            {
                preserveScroll: true,
                onSuccess: () => {
                    toast.success('Status template berhasil disinkronkan dengan Meta!');
                },
                onError: () => {
                    toast.error('Gagal menyinkronkan status template.');
                },
                onFinish: () => setSyncingTemplates(false),
            },
        );
    };

    const handleGroupSelect = (val: string) => {
        setData('contact_group_id', val);
        const selectedGroup = groups.find((g) => String(g.id) === val);

        if (selectedGroup) {
            // Set dummy preview recipient mapping name as first parameter
            setRecipients([
                {
                    phone_number: '+6281234567890',
                    variables: ['[Nama Kontak]'],
                    named_variables: { nama: '[Nama Kontak]' },
                },
            ]);
            setDetectedVariables(['nama']);
        } else {
            setRecipients([]);
            setDetectedVariables([]);
        }
    };

    const activeTemplate = React.useMemo(() => {
        return templates.find((t) => String(t.id) === selectedTempId);
    }, [templates, selectedTempId]);

    // Handle recipient Excel/CSV file upload
    const handleFileSelect = async (file: File | null) => {
        if (!file) {
            setRecipients([]);
            setDetectedVariables([]);
            setData('recipients', []);

            return;
        }

        setParsing(true);
        const formData = new FormData();
        formData.append('file', file);

        try {
            // Get CSRF Token from cookie
            const response = await fetch(
                '/dashboard/campaigns/upload-recipients',
                {
                    method: 'POST',
                    body: formData,
                    headers: {
                        'X-Requested-With': 'XMLHttpRequest',
                    },
                },
            );

            if (!response.ok) {
                const errJson = await response.json().catch(() => null);
                throw new Error(errJson?.error || errJson?.message || 'Gagal memproses file spreadsheet.');
            }

            const resData = await response.json();
            setRecipients(resData.recipients || []);
            setData('recipients', resData.recipients || []);
            setDetectedVariables(resData.variable_columns || []);
            toast.success(`Berhasil memuat ${resData.count} kontak penerima!`);
        } catch (e: any) {
            toast.error(e.message || 'Gagal memproses file kontak penerima.');
            setRecipients([]);
            setDetectedVariables([]);
            setData('recipients', []);
        } finally {
            setParsing(false);
        }
    };

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

        if (targetType === 'file' && recipients.length === 0) {
            toast.error(
                'Silakan unggah file CSV valid yang berisi nomor telepon penerima.',
            );

            return;
        }

        if (targetType === 'group' && !data.contact_group_id) {
            toast.error('Silakan pilih grup kontak penerima.');

            return;
        }

        if (messageType === 'template' && !data.message_template_id) {
            toast.error('Silakan pilih template resmi yang telah disetujui.');

            return;
        }

        if (messageType === 'direct' && !data.direct_message_body.trim()) {
            toast.error('Silakan tulis isi pesan langsung.');

            return;
        }

        post('/dashboard/campaigns', {
            onSuccess: () => {
                toast.success('Kampanye berhasil dibuat / dijadwalkan!');
            },
        });
    };

    // Render preview variable values from the first recipient in list
    const firstRecipientVars = React.useMemo(() => {
        if (recipients.length === 0) {
            return {};
        }

        const first = recipients[0];
        const vars: Record<string, string> = {};

        if (first.variables) {
            first.variables.forEach((val, idx) => {
                vars[String(idx + 1)] = val;
            });
        }

        if (first.named_variables) {
            Object.entries(first.named_variables).forEach(([key, val]) => {
                vars[key] = val;
            });
        }

        return vars;
    }, [recipients]);

    // Simulated direct message preview with replaced variables
    const directMessagePreview = React.useMemo(() => {
        let text = data.direct_message_body;
        if (!text) {
            return 'Tulis pesan langsung untuk melihat simulasi tampilan di sini.';
        }

        if (recipients.length > 0) {
            const first = recipients[0];
            if (first.named_variables) {
                Object.entries(first.named_variables).forEach(([key, val]) => {
                    text = text.replace(
                        new RegExp(`\\{\\{\\s*${key}\\s*\\}\\}`, 'gi'),
                        val || `[${key}]`,
                    );
                    text = text.replace(
                        new RegExp(`\\{${key}\\}`, 'gi'),
                        val || `[${key}]`,
                    );
                });
            }
            if (first.variables) {
                first.variables.forEach((val, idx) => {
                    text = text.replace(
                        new RegExp(`\\{\\{\\s*${idx + 1}\\s*\\}\\}`, 'g'),
                        val || `[var${idx + 1}]`,
                    );
                });
            }
        }

        return text;
    }, [data.direct_message_body, recipients]);

    // Extract template specs for visual mockup preview
    const templateSpecs = React.useMemo(() => {
        if (!activeTemplate) {
            return null;
        }

        const headerComponent = activeTemplate.components.find(
            (c) => c.type === 'HEADER',
        );
        const bodyComponent = activeTemplate.components.find(
            (c) => c.type === 'BODY',
        );
        const footerComponent = activeTemplate.components.find(
            (c) => c.type === 'FOOTER',
        );
        const buttonsComponent = activeTemplate.components.find(
            (c) => c.type === 'BUTTONS',
        );

        return {
            headerType: (headerComponent?.format === 'TEXT'
                ? 'TEXT'
                : 'NONE') as 'TEXT' | 'NONE',
            headerText: headerComponent?.text || '',
            bodyText: bodyComponent?.text || '',
            footerText: footerComponent?.text || '',
            buttons: buttonsComponent?.buttons || [],
        };
    }, [activeTemplate]);

    return (
        <>
            <Head title="Buat Kampanye Siaran" />
            <div className="flex flex-col gap-6 text-left">
                {/* Back Link */}
                <div className="flex items-center">
                    <Button variant="ghost" size="sm" asChild className="-ml-2">
                        <Link
                            href="/dashboard/campaigns"
                            className="inline-flex items-center gap-1"
                        >
                            <ArrowLeft className="h-4 w-4" />
                            <span>Kembali ke Kampanye</span>
                        </Link>
                    </Button>
                </div>

                <div>
                    <h1 className="text-2xl font-bold tracking-tight">
                        Mulai Kampanye Siaran
                    </h1>
                    <p className="text-sm text-muted-foreground">
                        Kirim pesan siaran massal menggunakan template resmi WhatsApp atau pesan teks langsung ke daftar kontak.
                    </p>
                </div>

                <div className="grid items-start gap-6 lg:grid-cols-5">
                    {/* Setup Form */}
                    <Card className="lg:col-span-3">
                        <CardHeader>
                            <div className="flex items-center gap-2">
                                <Megaphone className="h-5 w-5 text-emerald-600" />
                                <CardTitle>Konfigurasi Kampanye</CardTitle>
                            </div>
                            <CardDescription>
                                Masukkan nama kampanye, pilih daftar kontak target, dan tentukan jadwal siaran.
                            </CardDescription>
                        </CardHeader>
                        <CardContent>
                            <form
                                onSubmit={handleFormSubmit}
                                className="space-y-6"
                            >
                                {/* Basic Name & Outbound */}
                                <div className="flex flex-col gap-1.5">
                                    <Label htmlFor="name">Nama Kampanye</Label>
                                    <Input
                                        id="name"
                                        value={data.name}
                                        onChange={(e) =>
                                            setData('name', e.target.value)
                                        }
                                        placeholder="contoh: Promo Diskon Hari Raya"
                                        required
                                    />
                                    {errors.name && (
                                        <span className="text-xs text-rose-500">
                                            {errors.name}
                                        </span>
                                    )}
                                </div>

                                <div className="space-y-4 border-t pt-4">
                                    <div className="flex items-center justify-between">
                                        <h3 className="text-sm font-semibold">
                                            Tipe Pesan
                                        </h3>
                                        <span className="text-xs text-muted-foreground">
                                            Pesan langsung hanya untuk obrolan yang memiliki izin.
                                        </span>
                                    </div>
                                    <div className="grid gap-3 md:grid-cols-2">
                                        <button
                                            type="button"
                                            onClick={() =>
                                                setMessageType('template')
                                            }
                                            className={`flex min-h-20 items-start gap-3 rounded-lg border p-4 text-left transition-all ${
                                                messageType === 'template'
                                                    ? 'border-emerald-500 bg-emerald-50/70 text-emerald-950 dark:bg-emerald-950/20 dark:text-emerald-100'
                                                    : 'bg-background hover:bg-muted/50'
                                            }`}
                                        >
                                            <FileText className="mt-0.5 h-5 w-5 shrink-0" />
                                            <span className="space-y-1">
                                                <span className="block text-sm font-semibold">
                                                    Template Resmi Meta
                                                </span>
                                                <span className="block text-xs text-muted-foreground">
                                                    Terbaik untuk promosi atau kontak di luar jendela obrolan 24 jam.
                                                </span>
                                            </span>
                                        </button>
                                        <button
                                            type="button"
                                            onClick={() =>
                                                setMessageType('direct')
                                            }
                                            className={`flex min-h-20 items-start gap-3 rounded-lg border p-4 text-left transition-all ${
                                                messageType === 'direct'
                                                    ? 'border-emerald-500 bg-emerald-50/70 text-emerald-950 dark:bg-emerald-950/20 dark:text-emerald-100'
                                                    : 'bg-background hover:bg-muted/50'
                                            }`}
                                        >
                                            <MessageSquare className="mt-0.5 h-5 w-5 shrink-0" />
                                            <span className="space-y-1">
                                                <span className="block text-sm font-semibold">
                                                    Pesan Teks Langsung
                                                </span>
                                                <span className="block text-xs text-muted-foreground">
                                                    Pesan teks bebas khusus untuk pelanggan yang telah memiliki sesi aktif.
                                                </span>
                                            </span>
                                        </button>
                                    </div>
                                    {errors.message_type && (
                                        <span className="text-xs text-rose-500">
                                            {errors.message_type}
                                        </span>
                                    )}
                                </div>

                                <div className="grid gap-4 md:grid-cols-2">
                                    <div className="flex flex-col gap-1.5">
                                        <Label htmlFor="whatsapp_account_id">
                                            Saluran Nomor Pengirim
                                        </Label>
                                        <Select
                                            value={selectedAccId}
                                            onValueChange={(val) => {
                                                setSelectedAccId(val);
                                                setSelectedTempId(''); // reset template
                                            }}
                                        >
                                            <SelectTrigger>
                                                <SelectValue placeholder="Pilih Nomor WhatsApp" />
                                            </SelectTrigger>
                                            <SelectContent>
                                                {accounts.map((acc) => (
                                                    <SelectItem
                                                        key={acc.id}
                                                        value={String(acc.id)}
                                                    >
                                                        {acc.display_name
                                                            ? `${acc.display_name} (${acc.phone_number})`
                                                            : acc.phone_number}
                                                    </SelectItem>
                                                ))}
                                            </SelectContent>
                                        </Select>
                                        {errors.whatsapp_account_id && (
                                            <span className="text-xs text-rose-500">
                                                {errors.whatsapp_account_id}
                                            </span>
                                        )}
                                    </div>

                                    {messageType === 'template' ? (
                                        <div className="flex flex-col gap-1.5">
                                            <div className="flex items-center justify-between">
                                                <Label htmlFor="message_template_id">
                                                    Template Pesan (Disetujui)
                                                </Label>
                                                <Button
                                                    type="button"
                                                    variant="ghost"
                                                    size="sm"
                                                    onClick={handleSyncTemplates}
                                                    disabled={syncingTemplates}
                                                    className="h-6 gap-1 px-2 text-xs text-muted-foreground hover:text-foreground"
                                                >
                                                    <RefreshCw
                                                        className={`h-3 w-3 ${syncingTemplates ? 'animate-spin' : ''}`}
                                                    />
                                                    <span>Sinkronkan Status</span>
                                                </Button>
                                            </div>
                                            <Select
                                                value={selectedTempId}
                                                onValueChange={
                                                    setSelectedTempId
                                                }
                                                disabled={
                                                    filteredTemplates.length ===
                                                    0
                                                }
                                            >
                                                <SelectTrigger>
                                                    <SelectValue
                                                        placeholder={
                                                            filteredTemplates.length >
                                                            0
                                                                ? 'Pilih Template'
                                                                : 'Tidak ada template untuk nomor ini'
                                                        }
                                                    />
                                                </SelectTrigger>
                                                <SelectContent>
                                                    {filteredTemplates.map(
                                                        (temp) => (
                                                            <SelectItem
                                                                key={temp.id}
                                                                value={String(
                                                                    temp.id,
                                                                )}
                                                            >
                                                                {temp.name} (
                                                                {temp.language})
                                                            </SelectItem>
                                                        ),
                                                    )}
                                                </SelectContent>
                                            </Select>
                                            {errors.message_template_id && (
                                                <span className="text-xs text-rose-500">
                                                    {errors.message_template_id}
                                                </span>
                                            )}
                                        </div>
                                    ) : (
                                        <div className="flex flex-col gap-1.5">
                                            <div className="flex items-center justify-between">
                                                <Label htmlFor="direct_message_body">
                                                    Isi Pesan Langsung
                                                </Label>
                                                <span className="text-[10px] text-muted-foreground">
                                                    {data.direct_message_body.length}/4096
                                                </span>
                                            </div>
                                            <Textarea
                                                id="direct_message_body"
                                                value={data.direct_message_body}
                                                onChange={(e) =>
                                                    setData(
                                                        'direct_message_body',
                                                        e.target.value,
                                                    )
                                                }
                                                maxLength={4096}
                                                placeholder="Tulis pesan langsung... Contoh: Halo {{nama}}, promo spesial untuk Anda!"
                                                className="min-h-28 resize-y"
                                            />
                                            {detectedVariables.length > 0 ? (
                                                <div className="flex flex-wrap items-center gap-1.5 rounded-md border border-emerald-100 bg-emerald-50/50 p-2 text-xs dark:border-emerald-950 dark:bg-emerald-950/20">
                                                    <span className="text-[11px] font-medium text-emerald-900 dark:text-emerald-300">
                                                        Klik variabel untuk sisipkan:
                                                    </span>
                                                    {detectedVariables.map((v) => (
                                                        <button
                                                            key={v}
                                                            type="button"
                                                            onClick={() => {
                                                                const tag = `{{${v}}}`;
                                                                setData(
                                                                    'direct_message_body',
                                                                    data.direct_message_body
                                                                        ? `${data.direct_message_body} ${tag}`
                                                                        : tag,
                                                                );
                                                            }}
                                                            className="inline-flex items-center rounded border border-emerald-300 bg-white px-1.5 py-0.5 font-mono text-[11px] font-semibold text-emerald-800 shadow-xs hover:bg-emerald-100 dark:border-emerald-700 dark:bg-zinc-900 dark:text-emerald-200"
                                                        >
                                                            {`{{${v}}}`}
                                                        </button>
                                                    ))}
                                                </div>
                                            ) : (
                                                <div className="flex flex-wrap items-center gap-1.5 text-[11px] text-muted-foreground">
                                                    <span>Tips variabel:</span>
                                                    <button
                                                        type="button"
                                                        onClick={() => {
                                                            const tag = '{{nama}}';
                                                            setData(
                                                                'direct_message_body',
                                                                data.direct_message_body
                                                                    ? `${data.direct_message_body} ${tag}`
                                                                    : tag,
                                                            );
                                                        }}
                                                        className="inline-flex items-center rounded border border-zinc-200 bg-zinc-50 px-1.5 py-0.5 font-mono text-[11px] text-zinc-800 hover:bg-zinc-100 dark:border-zinc-800 dark:bg-zinc-900 dark:text-zinc-200"
                                                    >
                                                        {`{{nama}}`}
                                                    </button>
                                                    <span>akan otomatis diganti nama dari Excel/CSV.</span>
                                                </div>
                                            )}
                                            {errors.direct_message_body && (
                                                <span className="text-xs text-rose-500">
                                                    {errors.direct_message_body}
                                                </span>
                                            )}
                                        </div>
                                    )}
                                </div>

                                {/* Target Type and Recipients */}
                                <div className="space-y-4 border-t pt-4">
                                    <div className="flex items-center justify-between">
                                        <h3 className="text-sm font-semibold">
                                            Kontak Target Penerima
                                        </h3>
                                    </div>

                                    {/* Target Tabs */}
                                    <div className="flex w-full gap-2 rounded-lg border bg-zinc-50 p-1 sm:w-fit dark:bg-zinc-900">
                                        <button
                                            type="button"
                                            onClick={() =>
                                                setTargetType('file')
                                            }
                                            className={`flex-1 rounded-md px-3 py-1.5 text-xs font-semibold transition-all sm:flex-initial ${
                                                targetType === 'file'
                                                    ? 'bg-white text-zinc-900 shadow-sm dark:bg-zinc-800 dark:text-white'
                                                    : 'text-muted-foreground hover:text-zinc-900 dark:hover:text-white'
                                            }`}
                                        >
                                            Unggah File Excel / CSV
                                        </button>
                                        <button
                                            type="button"
                                            onClick={() =>
                                                setTargetType('group')
                                            }
                                            className={`flex-1 rounded-md px-3 py-1.5 text-xs font-semibold transition-all sm:flex-initial ${
                                                targetType === 'group'
                                                    ? 'bg-white text-zinc-900 shadow-sm dark:bg-zinc-800 dark:text-white'
                                                    : 'text-muted-foreground hover:text-zinc-900 dark:hover:text-white'
                                            }`}
                                        >
                                            Pilih Grup Kontak
                                        </button>
                                    </div>

                                    {targetType === 'file' ? (
                                        <div className="space-y-3">
                                            <FileUpload
                                                accept=".csv,.xlsx,.xls"
                                                description="Mendukung file Excel (.xlsx, .xls) atau CSV (maksimal 10MB)"
                                                onFileSelect={handleFileSelect}
                                            />
                                            {recipients.length > 0 && (
                                                <div className="flex flex-col gap-2 rounded-lg border border-emerald-100 bg-emerald-50/50 p-3 text-xs dark:border-emerald-900 dark:bg-emerald-950/20">
                                                    <div className="flex items-center justify-between">
                                                        <span>
                                                            Kontak dimuat:{' '}
                                                            <strong className="font-mono text-sm text-emerald-700 dark:text-emerald-400">
                                                                {recipients.length}
                                                            </strong>
                                                        </span>
                                                        <span className="font-medium text-muted-foreground">
                                                            Variabel:{' '}
                                                            {detectedVariables.length > 0
                                                                ? detectedVariables.length
                                                                : recipients[0].variables?.length || 0}{' '}
                                                            kolom
                                                        </span>
                                                    </div>
                                                    {detectedVariables.length > 0 && (
                                                        <div className="flex flex-wrap items-center gap-1.5 border-t border-emerald-100 pt-1.5 dark:border-emerald-900">
                                                            <span className="text-[10px] text-muted-foreground">
                                                                Kolom terdeteksi:
                                                            </span>
                                                            {detectedVariables.map((col) => (
                                                                <span
                                                                    key={col}
                                                                    className="rounded bg-emerald-100 px-1.5 py-0.5 font-mono text-[10px] font-semibold text-emerald-800 dark:bg-emerald-900/60 dark:text-emerald-300"
                                                                >
                                                                    {`{{${col}}}`}
                                                                </span>
                                                            ))}
                                                        </div>
                                                    )}
                                                </div>
                                            )}
                                            {errors.recipients && (
                                                <span className="text-xs text-rose-500">
                                                    {errors.recipients}
                                                </span>
                                            )}
                                        </div>
                                    ) : (
                                        <div className="flex flex-col gap-1.5">
                                            <Label htmlFor="contact_group_id">
                                                Pilih Grup Kontak
                                            </Label>
                                            <Select
                                                value={data.contact_group_id}
                                                onValueChange={
                                                    handleGroupSelect
                                                }
                                            >
                                                <SelectTrigger>
                                                    <SelectValue
                                                        placeholder={
                                                            groups.length > 0
                                                                ? 'Pilih salah satu grup'
                                                                : 'Belum ada grup yang dibuat'
                                                        }
                                                    />
                                                </SelectTrigger>
                                                <SelectContent>
                                                    {groups.map((group) => (
                                                        <SelectItem
                                                            key={group.id}
                                                            value={String(
                                                                group.id,
                                                             )}
                                                        >
                                                            {group.name} (
                                                            {
                                                                group.contacts_count
                                                            }{' '}
                                                            kontak)
                                                        </SelectItem>
                                                    ))}
                                                </SelectContent>
                                            </Select>
                                            {errors.contact_group_id && (
                                                <span className="text-xs text-rose-500">
                                                    {errors.contact_group_id}
                                                </span>
                                            )}
                                            {errors.recipients && (
                                                <span className="text-xs text-rose-500">
                                                    {errors.recipients}
                                                </span>
                                            )}
                                        </div>
                                    )}
                                </div>

                                {/* Scheduling */}
                                <div className="space-y-4 border-t pt-5">
                                    <div className="flex items-center justify-between">
                                        <h3 className="text-sm font-semibold">
                                            Jadwal Siaran
                                        </h3>
                                        <span className="text-xs text-muted-foreground">
                                            Biarkan kosong untuk memulai pengiriman secara manual.
                                        </span>
                                    </div>
                                    <div className="grid gap-4 md:grid-cols-2">
                                        <div className="flex flex-col gap-1.5">
                                            <Label htmlFor="scheduled_at">
                                                Waktu & Tanggal Kirim
                                            </Label>
                                            <div className="relative">
                                                <Calendar className="absolute top-3 left-3 h-4 w-4 text-muted-foreground" />
                                                <Input
                                                    id="scheduled_at"
                                                    type="datetime-local"
                                                    value={data.scheduled_at}
                                                    onChange={(e) =>
                                                        setData(
                                                            'scheduled_at',
                                                            e.target.value,
                                                        )
                                                    }
                                                    className="pl-9"
                                                />
                                            </div>
                                            {errors.scheduled_at && (
                                                <span className="text-xs text-rose-500">
                                                    {errors.scheduled_at}
                                                </span>
                                            )}
                                        </div>
                                        <div className="flex flex-col gap-1.5">
                                            <Label htmlFor="scheduled_timezone">
                                                Zona Waktu
                                            </Label>
                                            <Select
                                                value={data.scheduled_timezone}
                                                onValueChange={(value) =>
                                                    setData(
                                                        'scheduled_timezone',
                                                        value,
                                                    )
                                                }
                                            >
                                                <SelectTrigger id="scheduled_timezone">
                                                    <SelectValue placeholder="Pilih zona waktu" />
                                                </SelectTrigger>
                                                <SelectContent className="max-h-72">
                                                    {timezones.map(
                                                        (timezone) => (
                                                            <SelectItem
                                                                key={timezone}
                                                                value={timezone}
                                                            >
                                                                {timezone}
                                                            </SelectItem>
                                                        ),
                                                    )}
                                                </SelectContent>
                                            </Select>
                                            {errors.scheduled_timezone && (
                                                <span className="text-xs text-rose-500">
                                                    {errors.scheduled_timezone}
                                                </span>
                                            )}
                                        </div>
                                    </div>
                                </div>

                                <div className="flex justify-end gap-2 border-t pt-4">
                                    <Button variant="outline" asChild>
                                        <Link href="/dashboard/campaigns">
                                            Batal
                                        </Link>
                                    </Button>
                                    <Button
                                        type="submit"
                                        disabled={
                                            processing ||
                                            parsing ||
                                            (targetType === 'file'
                                                ? recipients.length === 0
                                                : !data.contact_group_id) ||
                                            (messageType === 'template'
                                                ? !data.message_template_id
                                                : !data.direct_message_body.trim())
                                        }
                                    >
                                        {data.scheduled_at
                                            ? 'Jadwalkan Kampanye'
                                            : 'Buat Kampanye'}
                                    </Button>
                                </div>
                            </form>
                        </CardContent>
                    </Card>

                    {/* Preview Sticky Bubble */}
                    <div className="lg:sticky lg:top-6 lg:col-span-2">
                        <Card>
                            <CardHeader>
                                <CardTitle>Simulasi Pesan Penerima</CardTitle>
                                <CardDescription>
                                    Menampilkan contoh pesan dengan variabel yang dipetakan secara dinamis sesuai kontak pertama.
                                </CardDescription>
                            </CardHeader>
                            <CardContent className="flex justify-center p-4">
                                {messageType === 'direct' ? (
                                    <div className="w-full max-w-sm rounded-lg border bg-[#efeae2] p-4 shadow-sm">
                                        <div className="ml-auto max-w-[86%] rounded-lg bg-[#d9fdd3] px-3 py-2 text-sm shadow-sm">
                                            <p className="break-words whitespace-pre-wrap text-zinc-900">
                                                {directMessagePreview}
                                            </p>
                                        </div>
                                    </div>
                                ) : templateSpecs ? (
                                    <TemplatePreview
                                        name={
                                            activeTemplate?.name ||
                                            'simulasi_kampanye'
                                        }
                                        category={activeTemplate?.category}
                                        language={activeTemplate?.language}
                                        headerType={templateSpecs.headerType}
                                        headerText={templateSpecs.headerText}
                                        bodyText={templateSpecs.bodyText}
                                        footerText={templateSpecs.footerText}
                                        buttons={templateSpecs.buttons}
                                        variables={firstRecipientVars}
                                    />
                                ) : (
                                    <div className="py-24 text-center text-xs text-muted-foreground italic">
                                        Pilih salah satu template untuk melihat simulasi tampilan pesan.
                                    </div>
                                )}
                            </CardContent>
                        </Card>
                    </div>
                </div>
            </div>
        </>
    );
}

CampaignCreate.layout = (page: any) => page;
