import { Head, useForm } from '@inertiajs/react';
import { ImagePlus, X } from 'lucide-react';
import { FormEventHandler, useRef, useState } from 'react';

import InputError from '@/components/input-error';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Checkbox } from '@/components/ui/checkbox';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import AdminLayout from '@/layouts/admin-layout';
import { type Category } from '@/types';

export default function AdminCategoryCreate({ parentCategories }: { parentCategories: Category[] }) {
    const { data, setData, post, processing, errors } = useForm<any>({
        name: '', parent_id: '', sort_order: '0', status: true,
        description: '', meta_title: '', meta_description: '',
        image: null as File | null,
    });

    const [preview, setPreview] = useState<string | null>(null);
    const fileRef = useRef<HTMLInputElement>(null);

    const handleImage = (file: File | null) => {
        setData('image', file);
        setPreview(file ? URL.createObjectURL(file) : null);
    };

    const submit: FormEventHandler = (e) => {
        e.preventDefault();
        post(route('admin.categories.store'), { forceFormData: true });
    };

    return (
        <AdminLayout title="Add Category">
            <Head title="Add Category" />
            <form onSubmit={submit} className="max-w-lg space-y-4">
                <Card>
                    <CardHeader><CardTitle className="text-base">Category Details</CardTitle></CardHeader>
                    <CardContent className="space-y-4">
                        <div className="space-y-1.5">
                            <Label>Name *</Label>
                            <Input value={data.name} onChange={(e) => setData('name', e.target.value)} placeholder="Category name" />
                            <InputError message={errors.name} />
                        </div>
                        <div className="space-y-1.5">
                            <Label>Parent Category</Label>
                            <Select value={data.parent_id} onValueChange={(v) => setData('parent_id', v)}>
                                <SelectTrigger aria-label="Parent Category"><SelectValue placeholder="None (top-level)" /></SelectTrigger>
                                <SelectContent>
                                    {parentCategories.map((c) => <SelectItem key={c.id} value={String(c.id)}>{c.name}</SelectItem>)}
                                </SelectContent>
                            </Select>
                        </div>

                        {/* Image upload */}
                        <div className="space-y-1.5">
                            <Label>Category Image</Label>
                            {preview ? (
                                <div className="relative inline-block">
                                    <img src={preview} alt="" className="h-28 w-28 rounded-xl border object-cover" />
                                    <button
                                        type="button"
                                        onClick={() => handleImage(null)}
                                        className="absolute -right-2 -top-2 rounded-full bg-red-500 p-0.5 text-white hover:bg-red-600"
                                    >
                                        <X size={12} />
                                    </button>
                                </div>
                            ) : (
                                <div
                                    onClick={() => fileRef.current?.click()}
                                    className="flex h-28 w-28 cursor-pointer flex-col items-center justify-center gap-1 rounded-xl border-2 border-dashed border-slate-300 text-slate-400 hover:border-indigo-400 hover:bg-indigo-50/30"
                                >
                                    <ImagePlus size={20} className="text-indigo-400" />
                                    <span className="text-xs">Add image</span>
                                </div>
                            )}
                            <input
                                ref={fileRef}
                                type="file"
                                accept="image/*"
                                className="hidden"
                                onChange={(e) => handleImage(e.target.files?.[0] ?? null)}
                            />
                            <InputError message={errors.image} />
                        </div>

                        <div className="space-y-1.5">
                            <Label>Sort Order</Label>
                            <Input type="number" value={data.sort_order} onChange={(e) => setData('sort_order', e.target.value)} />
                        </div>
                        <div className="space-y-1.5">
                            <Label>Description</Label>
                            <textarea rows={3} value={data.description} onChange={(e) => setData('description', e.target.value)} className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" />
                        </div>
                        <div className="flex items-center gap-2">
                            <Checkbox id="status" checked={data.status} onCheckedChange={(v) => setData('status', Boolean(v))} />
                            <Label htmlFor="status">Active</Label>
                        </div>
                    </CardContent>
                </Card>
                <Button type="submit" disabled={processing} className="bg-indigo-600 hover:bg-indigo-700">
                    {processing ? 'Saving…' : 'Create Category'}
                </Button>
            </form>
        </AdminLayout>
    );
}
