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 AdminCategoryEdit({ category, parentCategories }: { category: Category; parentCategories: Category[] }) {
    const { data, setData, post, processing, errors } = useForm<any>({
        _method: 'PATCH',
        name: category.name,
        parent_id: category.parent_id ? String(category.parent_id) : '',
        sort_order: String(category.sort_order),
        status: category.status,
        description: '',
        meta_title: '',
        meta_description: '',
        image: null as File | null,
        remove_image: false,
    });

    const [preview, setPreview] = useState<string | null>(
        category.image ? `/storage/${category.image}` : null,
    );
    const fileRef = useRef<HTMLInputElement>(null);

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

    const removeImage = () => {
        setData('image', null);
        setData('remove_image', true);
        setPreview(null);
    };

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

    return (
        <AdminLayout title={`Edit: ${category.name}`}>
            <Head title={`Edit ${category.name}`} />
            <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)} />
                            <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" /></SelectTrigger>
                                <SelectContent>
                                    {parentCategories.map((c) => <SelectItem key={c.id} value={String(c.id)}>{c.name}</SelectItem>)}
                                </SelectContent>
                            </Select>
                        </div>

                        {/* Image */}
                        <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={removeImage}
                                        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="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…' : 'Save Changes'}
                </Button>
            </form>
        </AdminLayout>
    );
}
