import { Head, Link, router, useForm } from '@inertiajs/react';
import { Edit2, Image, Plus, ToggleLeft, ToggleRight, Trash2 } from 'lucide-react';
import { FormEventHandler } from 'react';

import { Button } from '@/components/ui/button';
import { Card, CardContent } from '@/components/ui/card';
import AdminLayout from '@/layouts/admin-layout';
import { type Banner, type PaginatedData } from '@/types';

const POSITION_LABELS: Record<string, { label: string; color: string }> = {
    hero:    { label: 'Hero',    color: 'bg-indigo-50 text-indigo-700 ring-indigo-200' },
    sidebar: { label: 'Sidebar', color: 'bg-sky-50 text-sky-700 ring-sky-200' },
    footer:  { label: 'Footer',  color: 'bg-slate-100 text-slate-600 ring-slate-200' },
    promo:   { label: 'Promo',   color: 'bg-amber-50 text-amber-700 ring-amber-200' },
};

function DeleteForm({ banner }: { banner: Banner }) {
    const { delete: destroy, processing } = useForm({});

    const submit: FormEventHandler = (e) => {
        e.preventDefault();
        if (!confirm(`Delete banner "${banner.title ?? 'Untitled'}"?`)) return;
        destroy(route('admin.banners.destroy', banner.id));
    };

    return (
        <form onSubmit={submit}>
            <button
                type="submit"
                disabled={processing}
                className="flex h-8 w-8 items-center justify-center rounded-lg text-slate-400 transition-colors hover:bg-red-50 hover:text-red-600 dark:hover:bg-red-900/20 dark:hover:text-red-400"
                title="Delete"
            >
                <Trash2 size={14} />
            </button>
        </form>
    );
}

function ToggleForm({ banner }: { banner: Banner }) {
    const { post, processing } = useForm({});

    return (
        <button
            onClick={() => post(route('admin.banners.toggleStatus', banner.id))}
            disabled={processing}
            title={banner.status ? 'Disable' : 'Enable'}
            className={`transition-colors ${banner.status ? 'text-emerald-500 hover:text-emerald-700' : 'text-slate-300 hover:text-slate-500'}`}
        >
            {banner.status ? <ToggleRight size={22} /> : <ToggleLeft size={22} />}
        </button>
    );
}

export default function AdminBannersIndex({ banners }: { banners: PaginatedData<Banner> }) {
    return (
        <AdminLayout title="Banners">
            <Head title="Banners" />

            <div className="mb-6 flex flex-wrap items-center justify-between gap-3">
                <div className="flex items-center gap-2">
                    <Image size={20} className="text-indigo-600 dark:text-indigo-400" />
                    <h1 className="text-lg font-semibold text-slate-800 dark:text-slate-100">Banners &amp; Sliders</h1>
                    <span className="rounded-full bg-slate-100 px-2.5 py-0.5 text-xs font-medium text-slate-600 dark:bg-slate-700 dark:text-slate-300">
                        {banners.total}
                    </span>
                </div>
                <Link href={route('admin.banners.create')}>
                    <Button size="sm" className="bg-indigo-600 hover:bg-indigo-700 shadow-sm">
                        <Plus size={15} className="mr-1.5" />
                        Add Banner
                    </Button>
                </Link>
            </div>

            {banners.data.length === 0 ? (
                <Card className="dark:border-slate-700 dark:bg-slate-800">
                    <CardContent className="flex flex-col items-center justify-center py-20">
                        <div className="mb-4 flex h-16 w-16 items-center justify-center rounded-2xl bg-slate-100 dark:bg-slate-700">
                            <Image size={28} className="text-slate-300 dark:text-slate-500" />
                        </div>
                        <p className="text-sm font-medium text-slate-500">No banners yet</p>
                        <p className="mt-1 text-xs text-slate-400">Add a banner to display on the homepage slider</p>
                        <Link href={route('admin.banners.create')} className="mt-4">
                            <Button size="sm" className="bg-indigo-600 hover:bg-indigo-700">
                                <Plus size={14} className="mr-1.5" />
                                Add First Banner
                            </Button>
                        </Link>
                    </CardContent>
                </Card>
            ) : (
                <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
                    {banners.data.map((banner) => {
                        const pos = POSITION_LABELS[banner.position] ?? { label: banner.position, color: 'bg-slate-100 text-slate-600 ring-slate-200' };
                        return (
                            <div
                                key={banner.id}
                                className="group overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm transition-all duration-200 hover:shadow-md dark:border-slate-700 dark:bg-slate-800"
                            >
                                {/* Image */}
                                <div className="relative aspect-[16/7] overflow-hidden bg-slate-100 dark:bg-slate-700">
                                    <img
                                        src={`/storage/${banner.image}`}
                                        alt={banner.title ?? 'Banner'}
                                        className="h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"
                                        onError={(e) => {
                                            (e.target as HTMLImageElement).src =
                                                'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYwIiBoZWlnaHQ9IjcwIiB2aWV3Qm94PSIwIDAgMTYwIDcwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSIxNjAiIGhlaWdodD0iNzAiIGZpbGw9IiNlMmU4ZjAiLz48dGV4dCB4PSI4MCIgeT0iNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM5NGEzYjgiIGZvbnQtc2l6ZT0iMTIiPk5vIEltYWdlPC90ZXh0Pjwvc3ZnPg==';
                                        }}
                                    />
                                    {/* Status badge */}
                                    <div className="absolute left-2 top-2">
                                        <span
                                            className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-semibold ring-1 ${
                                                banner.status
                                                    ? 'bg-emerald-50 text-emerald-700 ring-emerald-200'
                                                    : 'bg-slate-100 text-slate-500 ring-slate-200'
                                            }`}
                                        >
                                            <span
                                                className={`h-1.5 w-1.5 rounded-full ${banner.status ? 'bg-emerald-500' : 'bg-slate-400'}`}
                                            />
                                            {banner.status ? 'Active' : 'Inactive'}
                                        </span>
                                    </div>
                                    {/* Position badge */}
                                    <div className="absolute right-2 top-2">
                                        <span className={`inline-flex rounded-full px-2 py-0.5 text-[10px] font-semibold ring-1 ${pos.color}`}>
                                            {pos.label}
                                        </span>
                                    </div>
                                </div>

                                {/* Info */}
                                <div className="p-3">
                                    <p className="truncate text-sm font-medium text-slate-800 dark:text-slate-100">
                                        {banner.title || <span className="italic text-slate-400">Untitled</span>}
                                    </p>
                                    {banner.link && (
                                        <p className="mt-0.5 truncate text-xs text-slate-400">{banner.link}</p>
                                    )}
                                    <div className="mt-1 flex items-center gap-1 text-xs text-slate-400">
                                        <span>Sort: {banner.sort_order}</span>
                                    </div>

                                    {/* Actions */}
                                    <div className="mt-3 flex items-center justify-between border-t border-slate-100 pt-2.5 dark:border-slate-700">
                                        <ToggleForm banner={banner} />
                                        <div className="flex items-center gap-1">
                                            <Link
                                                href={route('admin.banners.edit', banner.id)}
                                                className="flex h-8 w-8 items-center justify-center rounded-lg text-slate-400 transition-colors hover:bg-indigo-50 hover:text-indigo-600 dark:hover:bg-indigo-900/20 dark:hover:text-indigo-400"
                                                title="Edit"
                                            >
                                                <Edit2 size={14} />
                                            </Link>
                                            <DeleteForm banner={banner} />
                                        </div>
                                    </div>
                                </div>
                            </div>
                        );
                    })}
                </div>
            )}

            {/* Pagination */}
            {banners.last_page > 1 && (
                <div className="mt-6 flex items-center justify-between">
                    <span className="text-xs text-slate-500 dark:text-slate-400">
                        Showing <strong>{banners.from}</strong>–<strong>{banners.to}</strong> of <strong>{banners.total}</strong>
                    </span>
                    <div className="flex gap-1">
                        {banners.links.map((link, i) => (
                            <button
                                key={i}
                                disabled={!link.url}
                                onClick={() => link.url && router.visit(link.url)}
                                className={`min-w-8 rounded-lg px-2 py-1.5 text-xs font-medium transition ${
                                    link.active
                                        ? 'bg-indigo-600 text-white'
                                        : 'border border-slate-200 text-slate-600 hover:bg-slate-50 disabled:opacity-40 dark:border-slate-600 dark:text-slate-300 dark:hover:bg-slate-700'
                                }`}
                                dangerouslySetInnerHTML={{ __html: link.label }}
                            />
                        ))}
                    </div>
                </div>
            )}
        </AdminLayout>
    );
}
