import { Head, useForm } from '@inertiajs/react';
import { Image, Upload, 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';

const POSITIONS = [
    { value: 'hero',    label: 'Hero (Main Slider)' },
    { value: 'promo',   label: 'Promo Banner' },
    { value: 'sidebar', label: 'Sidebar' },
    { value: 'footer',  label: 'Footer' },
];

export default function AdminBannerCreate() {
    const { data, setData, post, processing, errors } = useForm<{
        title: string;
        image: File | null;
        link: string;
        position: string;
        sort_order: number;
        status: boolean;
    }>({
        title: '',
        image: null,
        link: '',
        position: 'hero',
        sort_order: 0,
        status: true,
    });

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

    const handleImageChange = (e: React.ChangeEvent<HTMLInputElement>) => {
        const file = e.target.files?.[0];
        if (file) {
            setData('image', file);
            setPreview(URL.createObjectURL(file));
        }
    };

    const removeImage = () => {
        setData('image', null);
        setPreview(null);
        if (fileRef.current) fileRef.current.value = '';
    };

    const submit: FormEventHandler = (e) => {
        e.preventDefault();
        post(route('admin.banners.store'));
    };

    return (
        <AdminLayout title="Add Banner">
            <Head title="Add Banner" />

            <div className="max-w-2xl">
                <form onSubmit={submit} className="space-y-4">
                    <Card className="dark:border-slate-700 dark:bg-slate-800">
                        <CardHeader>
                            <CardTitle className="flex items-center gap-2 text-base">
                                <Image size={16} className="text-indigo-500" />
                                Banner Details
                            </CardTitle>
                        </CardHeader>
                        <CardContent className="space-y-4">
                            {/* Image Upload */}
                            <div className="space-y-1.5">
                                <Label>
                                    Banner Image <span className="text-red-500">*</span>
                                </Label>
                                {preview ? (
                                    <div className="relative overflow-hidden rounded-xl border border-slate-200 bg-slate-50 dark:border-slate-600 dark:bg-slate-700">
                                        <img src={preview} alt="Preview" className="max-h-52 w-full object-cover" />
                                        <button
                                            type="button"
                                            onClick={removeImage}
                                            className="absolute right-2 top-2 flex h-7 w-7 items-center justify-center rounded-full bg-black/50 text-white transition-colors hover:bg-black/70"
                                        >
                                            <X size={14} />
                                        </button>
                                    </div>
                                ) : (
                                    <label className="flex cursor-pointer flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed border-slate-200 bg-slate-50 py-10 transition-colors hover:border-indigo-300 hover:bg-indigo-50/30 dark:border-slate-600 dark:bg-slate-700/50 dark:hover:border-indigo-500">
                                        <div className="flex h-12 w-12 items-center justify-center rounded-xl bg-white shadow-sm dark:bg-slate-600">
                                            <Upload size={20} className="text-indigo-500" />
                                        </div>
                                        <div className="text-center">
                                            <p className="text-sm font-medium text-slate-700 dark:text-slate-200">
                                                Click to upload image
                                            </p>
                                            <p className="mt-0.5 text-xs text-slate-400">PNG, JPG, WEBP up to 3MB</p>
                                            <p className="text-xs text-slate-400">Recommended: 1920×600px (hero)</p>
                                        </div>
                                        <input
                                            ref={fileRef}
                                            type="file"
                                            accept="image/*"
                                            onChange={handleImageChange}
                                            className="sr-only"
                                        />
                                    </label>
                                )}
                                <InputError message={errors.image} />
                            </div>

                            {/* Title */}
                            <div className="space-y-1.5">
                                <Label htmlFor="title">Title (optional)</Label>
                                <Input
                                    id="title"
                                    value={data.title}
                                    onChange={(e) => setData('title', e.target.value)}
                                    placeholder="Banner headline text"
                                    className="dark:border-slate-600 dark:bg-slate-700"
                                />
                                <InputError message={errors.title} />
                            </div>

                            {/* Link */}
                            <div className="space-y-1.5">
                                <Label htmlFor="link">Link URL (optional)</Label>
                                <Input
                                    id="link"
                                    value={data.link}
                                    onChange={(e) => setData('link', e.target.value)}
                                    placeholder="https://example.com or /products"
                                    className="dark:border-slate-600 dark:bg-slate-700"
                                />
                                <InputError message={errors.link} />
                            </div>

                            {/* Position + Sort */}
                            <div className="grid grid-cols-2 gap-3">
                                <div className="space-y-1.5">
                                    <Label>Position</Label>
                                    <Select value={data.position} onValueChange={(v) => setData('position', v)}>
                                        <SelectTrigger className="dark:border-slate-600 dark:bg-slate-700" aria-label="Position">
                                            <SelectValue />
                                        </SelectTrigger>
                                        <SelectContent>
                                            {POSITIONS.map((p) => (
                                                <SelectItem key={p.value} value={p.value}>
                                                    {p.label}
                                                </SelectItem>
                                            ))}
                                        </SelectContent>
                                    </Select>
                                    <InputError message={errors.position} />
                                </div>
                                <div className="space-y-1.5">
                                    <Label htmlFor="sort_order">Sort Order</Label>
                                    <Input
                                        id="sort_order"
                                        type="number"
                                        min={0}
                                        value={data.sort_order}
                                        onChange={(e) => setData('sort_order', Number(e.target.value))}
                                        className="dark:border-slate-600 dark:bg-slate-700"
                                    />
                                    <InputError message={errors.sort_order} />
                                </div>
                            </div>

                            {/* Status */}
                            <div className="flex items-center gap-2.5 rounded-xl border border-slate-100 bg-slate-50 px-4 py-3 dark:border-slate-600 dark:bg-slate-700/50">
                                <Checkbox
                                    id="status"
                                    checked={data.status}
                                    onCheckedChange={(v) => setData('status', Boolean(v))}
                                />
                                <div>
                                    <Label htmlFor="status" className="cursor-pointer text-sm font-medium">
                                        Active
                                    </Label>
                                    <p className="text-xs text-slate-400">Show this banner on the website</p>
                                </div>
                            </div>
                        </CardContent>
                    </Card>

                    <div className="flex items-center gap-3">
                        <Button type="submit" disabled={processing} className="bg-indigo-600 hover:bg-indigo-700 shadow-sm">
                            {processing ? 'Saving…' : 'Create Banner'}
                        </Button>
                        <a
                            href={route('admin.banners.index')}
                            className="text-sm text-slate-500 transition-colors hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-200"
                        >
                            Cancel
                        </a>
                    </div>
                </form>
            </div>
        </AdminLayout>
    );
}
