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 CouponData = {
    id: number;
    code: string;
    type: 'percentage' | 'fixed';
    value: number;
    scope: 'global' | 'course';
    is_active: boolean;
    starts_at: string | null;
    expires_at: string | null;
    usage_limit: number | null;
    per_user_limit: number | null;
    min_purchase: number;
    course_ids: number[];
};

type Props = { coupon: CouponData; courses: Course[] };

export default function AdminCouponsEdit({ coupon, courses }: Props) {
    const breadcrumbs: BreadcrumbItem[] = [
        { title: 'Admin', href: '/admin' },
        { title: 'Kupon', href: '/admin/coupons' },
        { title: coupon.code, href: `/admin/coupons/${coupon.id}/edit` },
    ];

    const { data, setData, patch, processing, errors } = useForm({
        code: coupon.code,
        type: coupon.type,
        value: String(coupon.value),
        scope: coupon.scope,
        is_active: coupon.is_active,
        starts_at: coupon.starts_at ? coupon.starts_at.slice(0, 16) : '',
        expires_at: coupon.expires_at ? coupon.expires_at.slice(0, 16) : '',
        usage_limit: coupon.usage_limit !== null ? String(coupon.usage_limit) : '',
        per_user_limit: coupon.per_user_limit !== null ? String(coupon.per_user_limit) : '',
        min_purchase: coupon.min_purchase > 0 ? String(coupon.min_purchase) : '',
        course_ids: coupon.course_ids,
    });

    function submit(e: React.FormEvent) {
        e.preventDefault();
        patch(`/admin/coupons/${coupon.id}`);
    }

    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={`Edit Kupon ${coupon.code}`} />
            <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">Edit Kupon</h1>
                        <p className="font-mono text-sm text-gray-500">{coupon.code}</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</label>
                        <input
                            type="text"
                            value={data.code}
                            onChange={(e) => setData('code', e.target.value.toUpperCase())}
                            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</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>
                        </div>
                        <div>
                            <label className="block text-sm font-semibold text-gray-700 mb-1.5">
                                Nilai {data.type === 'percentage' ? '(%)' : '(Rp)'}
                            </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]"
                        />
                    </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]"
                            />
                        </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]"
                            />
                        </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]"
                            />
                        </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]"
                            />
                        </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>
                    </div>

                    {data.scope === 'course' && (
                        <div>
                            <label className="block text-sm font-semibold text-gray-700 mb-2">Pilih Kelas</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>
                        </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 Perubahan'}
                    </button>
                </div>
            </form>
        </>
    );
}

AdminCouponsEdit.layout = (page: React.ReactNode) => (
    <AppLayout breadcrumbs={[
        { title: 'Admin', href: '/admin' },
        { title: 'Kupon', href: '/admin/coupons' },
        { title: 'Edit', href: '#' },
    ]}>{page}</AppLayout>
);
