import { Head, useForm } from '@inertiajs/react';
import { BadgePercent } from 'lucide-react';
import InputError from '@/components/input-error';
import AppLayout from '@/layouts/app-layout';
import type { BreadcrumbItem } from '@/types';

type Course = { id: number; title: string };
type Props = { courses: Course[] };

const breadcrumbs: BreadcrumbItem[] = [
    { title: 'Admin', href: '/admin' },
    { title: 'Kupon', href: '/admin/coupons' },
    { title: 'Buat Kupon', href: '/admin/coupons/create' },
];

export default function AdminCouponsCreate({ courses }: Props) {
    const { data, setData, post, processing, errors } = useForm({
        code: '',
        type: 'percentage' as 'percentage' | 'fixed',
        value: '',
        scope: 'global' as 'global' | 'course',
        is_active: true,
        starts_at: '',
        expires_at: '',
        usage_limit: '',
        per_user_limit: '',
        min_purchase: '',
        course_ids: [] as number[],
    });

    function submit(e: React.FormEvent) {
        e.preventDefault();
        post('/admin/coupons');
    }

    function toggleCourse(id: number) {
        setData('course_ids', data.course_ids.includes(id)
            ? data.course_ids.filter((c) => c !== id)
            : [...data.course_ids, id]);
    }

    return (
        <>
            <Head title="Buat Kupon" />
            <form onSubmit={submit} className="mx-auto max-w-2xl space-y-6">
                <div className="flex items-center gap-3">
                    <div className="flex h-10 w-10 items-center justify-center rounded-xl bg-[#118AB2]/10 text-[#118AB2]">
                        <BadgePercent className="h-5 w-5" />
                    </div>
                    <div>
                        <h1 className="text-xl font-bold text-gray-900">Buat Kupon Baru</h1>
                        <p className="text-sm text-gray-500">Isi semua detail kupon diskon</p>
                    </div>
                </div>

                <div className="rounded-2xl bg-white p-6 shadow-sm space-y-5">
                    <div>
                        <label className="block text-sm font-semibold text-gray-700 mb-1.5">Kode Kupon <span className="text-red-500">*</span></label>
                        <input
                            type="text"
                            value={data.code}
                            onChange={(e) => setData('code', e.target.value.toUpperCase())}
                            placeholder="DISKON50"
                            className="w-full rounded-xl border border-gray-200 px-4 py-2.5 font-mono text-sm uppercase focus:border-[#118AB2] focus:outline-none focus:ring-1 focus:ring-[#118AB2]"
                        />
                        <InputError message={errors.code} className="mt-1" />
                    </div>

                    <div className="grid gap-4 sm:grid-cols-2">
                        <div>
                            <label className="block text-sm font-semibold text-gray-700 mb-1.5">Tipe Diskon <span className="text-red-500">*</span></label>
                            <select
                                value={data.type}
                                onChange={(e) => setData('type', e.target.value as 'percentage' | 'fixed')}
                                className="w-full rounded-xl border border-gray-200 px-4 py-2.5 text-sm focus:border-[#118AB2] focus:outline-none focus:ring-1 focus:ring-[#118AB2]"
                            >
                                <option value="percentage">Persentase (%)</option>
                                <option value="fixed">Nominal (Rp)</option>
                            </select>
                            <InputError message={errors.type} className="mt-1" />
                        </div>
                        <div>
                            <label className="block text-sm font-semibold text-gray-700 mb-1.5">
                                Nilai {data.type === 'percentage' ? '(%)' : '(Rp)'} <span className="text-red-500">*</span>
                            </label>
                            <input
                                type="number"
                                value={data.value}
                                onChange={(e) => setData('value', e.target.value)}
                                min="0"
                                max={data.type === 'percentage' ? 100 : undefined}
                                className="w-full rounded-xl border border-gray-200 px-4 py-2.5 text-sm focus:border-[#118AB2] focus:outline-none focus:ring-1 focus:ring-[#118AB2]"
                            />
                            <InputError message={errors.value} className="mt-1" />
                        </div>
                    </div>

                    <div>
                        <label className="block text-sm font-semibold text-gray-700 mb-1.5">Minimum Pembelian (Rp)</label>
                        <input
                            type="number"
                            value={data.min_purchase}
                            onChange={(e) => setData('min_purchase', e.target.value)}
                            min="0"
                            placeholder="0"
                            className="w-full rounded-xl border border-gray-200 px-4 py-2.5 text-sm focus:border-[#118AB2] focus:outline-none focus:ring-1 focus:ring-[#118AB2]"
                        />
                        <InputError message={errors.min_purchase} className="mt-1" />
                    </div>

                    <div className="grid gap-4 sm:grid-cols-2">
                        <div>
                            <label className="block text-sm font-semibold text-gray-700 mb-1.5">Batas Total Penggunaan</label>
                            <input
                                type="number"
                                value={data.usage_limit}
                                onChange={(e) => setData('usage_limit', e.target.value)}
                                min="1"
                                placeholder="Tidak terbatas"
                                className="w-full rounded-xl border border-gray-200 px-4 py-2.5 text-sm focus:border-[#118AB2] focus:outline-none focus:ring-1 focus:ring-[#118AB2]"
                            />
                            <InputError message={errors.usage_limit} className="mt-1" />
                        </div>
                        <div>
                            <label className="block text-sm font-semibold text-gray-700 mb-1.5">Batas Per User</label>
                            <input
                                type="number"
                                value={data.per_user_limit}
                                onChange={(e) => setData('per_user_limit', e.target.value)}
                                min="1"
                                placeholder="Tidak terbatas"
                                className="w-full rounded-xl border border-gray-200 px-4 py-2.5 text-sm focus:border-[#118AB2] focus:outline-none focus:ring-1 focus:ring-[#118AB2]"
                            />
                            <InputError message={errors.per_user_limit} className="mt-1" />
                        </div>
                    </div>

                    <div className="grid gap-4 sm:grid-cols-2">
                        <div>
                            <label className="block text-sm font-semibold text-gray-700 mb-1.5">Berlaku Mulai</label>
                            <input
                                type="datetime-local"
                                value={data.starts_at}
                                onChange={(e) => setData('starts_at', e.target.value)}
                                className="w-full rounded-xl border border-gray-200 px-4 py-2.5 text-sm focus:border-[#118AB2] focus:outline-none focus:ring-1 focus:ring-[#118AB2]"
                            />
                            <InputError message={errors.starts_at} className="mt-1" />
                        </div>
                        <div>
                            <label className="block text-sm font-semibold text-gray-700 mb-1.5">Berlaku Hingga</label>
                            <input
                                type="datetime-local"
                                value={data.expires_at}
                                onChange={(e) => setData('expires_at', e.target.value)}
                                className="w-full rounded-xl border border-gray-200 px-4 py-2.5 text-sm focus:border-[#118AB2] focus:outline-none focus:ring-1 focus:ring-[#118AB2]"
                            />
                            <InputError message={errors.expires_at} className="mt-1" />
                        </div>
                    </div>

                    <div>
                        <label className="block text-sm font-semibold text-gray-700 mb-1.5">Berlaku Untuk</label>
                        <div className="flex gap-3">
                            {(['global', 'course'] as const).map((s) => (
                                <button
                                    key={s}
                                    type="button"
                                    onClick={() => setData('scope', s)}
                                    className={`flex-1 rounded-xl border-2 py-2.5 text-sm font-semibold transition-colors ${
                                        data.scope === s
                                            ? 'border-[#118AB2] bg-[#118AB2]/5 text-[#118AB2]'
                                            : 'border-gray-200 text-gray-500 hover:border-gray-300'
                                    }`}
                                >
                                    {s === 'global' ? 'Semua Kelas' : 'Kelas Tertentu'}
                                </button>
                            ))}
                        </div>
                        <InputError message={errors.scope} className="mt-1" />
                    </div>

                    {data.scope === 'course' && (
                        <div>
                            <label className="block text-sm font-semibold text-gray-700 mb-2">Pilih Kelas <span className="text-red-500">*</span></label>
                            <div className="max-h-52 overflow-y-auto space-y-1 rounded-xl border border-gray-200 p-3">
                                {courses.map((course) => (
                                    <label key={course.id} className="flex cursor-pointer items-center gap-3 rounded-lg px-2 py-1.5 hover:bg-gray-50">
                                        <input
                                            type="checkbox"
                                            checked={data.course_ids.includes(course.id)}
                                            onChange={() => toggleCourse(course.id)}
                                            className="h-4 w-4 rounded border-gray-300 text-[#118AB2] focus:ring-[#118AB2]"
                                        />
                                        <span className="text-sm text-gray-700">{course.title}</span>
                                    </label>
                                ))}
                            </div>
                            <InputError message={errors['course_ids'] as string} className="mt-1" />
                        </div>
                    )}

                    <div className="flex items-center gap-3">
                        <input
                            type="checkbox"
                            id="is_active"
                            checked={data.is_active}
                            onChange={(e) => setData('is_active', e.target.checked)}
                            className="h-4 w-4 rounded border-gray-300 text-[#118AB2] focus:ring-[#118AB2]"
                        />
                        <label htmlFor="is_active" className="text-sm font-medium text-gray-700">Kupon aktif</label>
                    </div>
                </div>

                <div className="flex justify-end gap-3">
                    <a href="/admin/coupons" className="rounded-xl border border-gray-200 bg-white px-5 py-2.5 text-sm font-semibold text-gray-700 hover:bg-gray-50 transition-colors">
                        Batal
                    </a>
                    <button
                        type="submit"
                        disabled={processing}
                        className="rounded-xl bg-[#118AB2] px-5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-[#0e7a9e] disabled:opacity-50 transition-colors"
                    >
                        {processing ? 'Menyimpan...' : 'Simpan Kupon'}
                    </button>
                </div>
            </form>
        </>
    );
}

AdminCouponsCreate.layout = (page: React.ReactNode) => (
    <AppLayout breadcrumbs={breadcrumbs}>{page}</AppLayout>
);
