import AdminLayout from '@/Layouts/AdminLayout';
import PageHeader from '@/components/admin/PageHeader';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Textarea } from '@/components/ui/textarea';
import { cn } from '@/lib/utils';
import { Head, Link, useForm } from '@inertiajs/react';
import { ArrowLeft, Radio, Save } from 'lucide-react';

// ── Types ─────────────────────────────────────────────────────────────────────

interface AnnouncementData {
    id: string;
    title: string;
    body: string;
    published_at: string | null;
    tags: string;
    status: string;
    created_at: string;
}

interface Props {
    announcement?: AnnouncementData;
}

// ── Page ──────────────────────────────────────────────────────────────────────

export default function AnnouncementForm({ announcement }: Props) {
    const isEdit = !!announcement;

    const { data, setData, post, put, processing, errors } = useForm({
        title: announcement?.title ?? '',
        body: announcement?.body ?? '',
        published_at: announcement?.published_at
            ? announcement.published_at.substring(0, 16)
            : '',
        tags: announcement?.tags ?? '',
    });

    const handleSubmit = (e: React.FormEvent) => {
        e.preventDefault();
        if (isEdit) {
            put(`/admin/announcements/${announcement.id}`);
        } else {
            post('/admin/announcements');
        }
    };

    return (
        <AdminLayout
            title={isEdit ? 'Edit Announcement' : 'New Announcement'}
            breadcrumbs={[
                { label: 'Announcements', href: '/admin/announcements' },
                { label: isEdit ? 'Edit' : 'New' },
            ]}
        >
            <Head title={isEdit ? 'Edit Announcement' : 'New Announcement'} />

            <div className="p-6 lg:p-8">
                <div className="mb-6 flex items-center gap-3">
                    <Link
                        href="/admin/announcements"
                        className="text-muted-foreground hover:text-foreground transition-colors"
                    >
                        <ArrowLeft className="h-4 w-4" />
                    </Link>
                    <PageHeader
                        title={
                            isEdit ? 'Edit Announcement' : 'New Announcement'
                        }
                    />
                </div>

                <form
                    onSubmit={handleSubmit}
                    className="mx-auto max-w-2xl space-y-5"
                >
                    {/* Title */}
                    <div className="space-y-1.5">
                        <label className="text-foreground text-sm font-medium">
                            Title <span className="text-destructive">*</span>
                        </label>
                        <Input
                            value={data.title}
                            onChange={(e) => setData('title', e.target.value)}
                            placeholder="What's new?"
                            className={cn(errors.title && 'border-destructive')}
                        />
                        {errors.title && (
                            <p className="text-destructive text-xs">
                                {errors.title}
                            </p>
                        )}
                    </div>

                    {/* Body */}
                    <div className="space-y-1.5">
                        <label className="text-foreground text-sm font-medium">
                            Body <span className="text-destructive">*</span>
                        </label>
                        <Textarea
                            value={data.body}
                            onChange={(e) => setData('body', e.target.value)}
                            rows={10}
                            placeholder="Describe the feature update or announcement…"
                            className={cn(
                                'resize-y',
                                errors.body && 'border-destructive',
                            )}
                        />
                        {errors.body && (
                            <p className="text-destructive text-xs">
                                {errors.body}
                            </p>
                        )}
                    </div>

                    {/* Tags */}
                    <div className="space-y-1.5">
                        <label className="text-foreground text-sm font-medium">
                            Tags
                        </label>
                        <Input
                            value={data.tags}
                            onChange={(e) => setData('tags', e.target.value)}
                            placeholder="e.g. billing, mobile, api  (comma-separated)"
                        />
                        <p className="text-muted-foreground text-xs">
                            Separate multiple tags with commas.
                        </p>
                    </div>

                    {/* Publish date */}
                    <div className="space-y-1.5">
                        <label className="text-foreground text-sm font-medium">
                            Publish date
                        </label>
                        <Input
                            type="datetime-local"
                            value={data.published_at}
                            onChange={(e) =>
                                setData('published_at', e.target.value)
                            }
                            className={cn(
                                errors.published_at && 'border-destructive',
                            )}
                        />
                        <p className="text-muted-foreground text-xs">
                            Leave blank to save as draft. Set a future time to
                            schedule.
                        </p>
                        {errors.published_at && (
                            <p className="text-destructive text-xs">
                                {errors.published_at}
                            </p>
                        )}
                    </div>

                    {/* Actions */}
                    <div className="border-border flex items-center justify-between border-t pt-5">
                        <Link
                            href="/admin/announcements"
                            className="text-muted-foreground hover:text-foreground text-sm transition-colors"
                        >
                            Cancel
                        </Link>
                        <div className="flex items-center gap-2">
                            {/* Save as draft shortcut */}
                            {data.published_at && (
                                <Button
                                    type="button"
                                    variant="outline"
                                    size="sm"
                                    disabled={processing}
                                    onClick={() => {
                                        setData('published_at', '');
                                        // submit after state settles
                                        setTimeout(() => {
                                            (
                                                document.querySelector(
                                                    'form',
                                                ) as HTMLFormElement
                                            )?.requestSubmit();
                                        }, 0);
                                    }}
                                >
                                    Save as draft
                                </Button>
                            )}
                            <Button
                                type="submit"
                                disabled={processing}
                                size="sm"
                                className="gap-2"
                            >
                                {data.published_at ? (
                                    <>
                                        <Radio className="h-3.5 w-3.5" />
                                        {isEdit ? 'Update' : 'Publish'}
                                    </>
                                ) : (
                                    <>
                                        <Save className="h-3.5 w-3.5" />
                                        Save draft
                                    </>
                                )}
                            </Button>
                        </div>
                    </div>
                </form>
            </div>
        </AdminLayout>
    );
}
