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';
import { type Banner } from '@/types';

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

export default function AdminBannerEdit({ banner }: { banner: Banner }) {
    const { data, setData, post, processing, errors } = useForm<{
        _method: string;
        title: string;
        image: File | null;
        link: string;
        position: string;
        sort_order: number;
        status: boolean;
    }>({
        _method: 'put',
        title: banner.title ?? '',
        image: null,
        link: banner.link ?? '',
        position: banner.position,
        sort_order: banner.sort_order,
        status: banner.status,
    });

    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 removeNewImage = () => {
        setData('image', null);
        setPreview(null);
        if (fileRef.current) fileRef.current.value = '';
    };

    const submit: FormEventHandler = (e) => {
        e.preventDefault();
        post(route('admin.banners.update', banner.id));
    };

    return (
        <AdminLayout title="Edit Banner">
            <Head title="Edit 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" />
                                Edit Banner
                            </CardTitle>
                        </CardHeader>
                        <CardContent className="space-y-4">
                            {/* Current / New Image */}
                            <div className="space-y-1.5">
                                <Label>Banner Image</Label>

                                {/* Current image */}
                                {!preview && banner.image && (
                                    <div className="overflow-hidden rounded-xl border border-slate-200 bg-slate-50 dark:border-slate-600 dark:bg-slate-700">
                                        <img
                                            src={`/storage/${banner.image}`}
                                            alt="Current banner"
                                            className="max-h-52 w-full object-cover"
                                        />
                                        <p className="px-3 py-2 text-xs text-slate-400">Current image — upload a new one to replace it</p>
                                    </div>
                                )}

                                {/* New preview */}
                                {preview && (
                                    <div className="relative overflow-hidden rounded-xl border border-indigo-200 bg-slate-50 dark:border-slate-600 dark:bg-slate-700">
                                        <img src={preview} alt="New preview" className="max-h-52 w-full object-cover" />
                                        <button
                                            type="button"
                                            onClick={removeNewImage}
                                            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>
                                        <p className="px-3 py-2 text-xs text-emerald-600 dark:text-emerald-400">New image selected</p>
                                    </div>
                                )}

                                {/* Upload trigger */}
                                <label className="flex cursor-pointer items-center gap-3 rounded-xl border border-dashed border-slate-200 px-4 py-3 transition-colors hover:border-indigo-300 hover:bg-indigo-50/30 dark:border-slate-600 dark:hover:border-indigo-500 dark:hover:bg-indigo-900/10">
                                    <div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-lg bg-slate-100 dark:bg-slate-700">
                                        <Upload size={15} className="text-indigo-500" />
                                    </div>
                                    <div>
                                        <p className="text-sm font-medium text-slate-700 dark:text-slate-200">
                                            {preview ? 'Change image' : 'Replace image'}
                                        </p>
                                        <p className="text-xs text-slate-400">PNG, JPG, WEBP up to 3MB</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…' : 'Save Changes'}
                        </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>
    );
}
