import { Head, useForm } from '@inertiajs/react';
import AdminLayout from '@/Layouts/AdminLayout';
import Card from '@/Components/UI/Card';
import Button from '@/Components/UI/Button';
import InputLabel from '@/Components/InputLabel';
import TextInput from '@/Components/TextInput';
import InputError from '@/Components/InputError';

interface ProgrammeData {
    id: number;
    institute_id: number;
    title: string;
    overview: string | null;
    fee: string | null;
    currency: string;
    duration_months: number | null;
    delivery_mode: string;
    sequencing: string;
    status: string;
}

export default function Form({
    programme,
    institutes,
}: {
    programme: ProgrammeData | null;
    institutes: { id: number; name: string }[];
}) {
    const { data, setData, post, put, processing, errors } = useForm({
        institute_id: programme?.institute_id ?? institutes[0]?.id ?? '',
        title: programme?.title ?? '',
        overview: programme?.overview ?? '',
        fee: programme?.fee ?? '',
        currency: programme?.currency ?? 'USD',
        duration_months: programme?.duration_months ?? 6,
        delivery_mode: programme?.delivery_mode ?? 'self_paced',
        sequencing: programme?.sequencing ?? 'locked',
        status: programme?.status ?? 'draft',
    });

    const submit = (e: React.FormEvent) => {
        e.preventDefault();
        if (programme) {
            put(route('admin.programmes.update', programme.id));
        } else {
            post(route('admin.programmes.store'));
        }
    };

    return (
        <AdminLayout>
            <Head title={programme ? 'Edit Programme' : 'New Programme'} />

            <h1 className="text-institute-title text-on-surface">
                {programme ? 'Edit Programme' : 'New Programme'}
            </h1>

            <Card className="mt-6 max-w-2xl">
                <form onSubmit={submit} className="space-y-5">
                    <div>
                        <InputLabel htmlFor="institute_id" value="Institute" />
                        <select
                            id="institute_id"
                            className="mt-1 block w-full rounded border-outline-variant"
                            value={data.institute_id}
                            onChange={(e) => setData('institute_id', Number(e.target.value))}
                        >
                            {institutes.map((institute) => (
                                <option key={institute.id} value={institute.id}>
                                    {institute.name}
                                </option>
                            ))}
                        </select>
                        <InputError message={errors.institute_id} className="mt-1" />
                    </div>

                    <div>
                        <InputLabel htmlFor="title" value="Programme Title" />
                        <TextInput
                            id="title"
                            className="mt-1 block w-full"
                            value={data.title}
                            onChange={(e) => setData('title', e.target.value)}
                        />
                        <InputError message={errors.title} className="mt-1" />
                    </div>

                    <div>
                        <InputLabel htmlFor="overview" value="Overview" />
                        <textarea
                            id="overview"
                            rows={4}
                            className="mt-1 block w-full rounded border-outline-variant"
                            value={data.overview}
                            onChange={(e) => setData('overview', e.target.value)}
                        />
                        <InputError message={errors.overview} className="mt-1" />
                    </div>

                    <div className="grid grid-cols-2 gap-4">
                        <div>
                            <InputLabel htmlFor="fee" value="Fee" />
                            <TextInput
                                id="fee"
                                type="number"
                                className="mt-1 block w-full"
                                value={data.fee}
                                onChange={(e) => setData('fee', e.target.value)}
                            />
                            <InputError message={errors.fee} className="mt-1" />
                        </div>
                        <div>
                            <InputLabel htmlFor="currency" value="Currency" />
                            <TextInput
                                id="currency"
                                className="mt-1 block w-full"
                                value={data.currency}
                                onChange={(e) => setData('currency', e.target.value.toUpperCase())}
                                maxLength={3}
                            />
                            <InputError message={errors.currency} className="mt-1" />
                        </div>
                    </div>

                    <div className="grid grid-cols-3 gap-4">
                        <div>
                            <InputLabel htmlFor="duration_months" value="Duration (months)" />
                            <TextInput
                                id="duration_months"
                                type="number"
                                className="mt-1 block w-full"
                                value={data.duration_months ?? ''}
                                onChange={(e) => setData('duration_months', Number(e.target.value))}
                            />
                            <InputError message={errors.duration_months} className="mt-1" />
                        </div>
                        <div>
                            <InputLabel htmlFor="delivery_mode" value="Delivery Mode" />
                            <select
                                id="delivery_mode"
                                className="mt-1 block w-full rounded border-outline-variant"
                                value={data.delivery_mode}
                                onChange={(e) => setData('delivery_mode', e.target.value)}
                            >
                                <option value="self_paced">Self-Paced</option>
                                <option value="cohort">Cohort</option>
                                <option value="hybrid">Hybrid</option>
                            </select>
                        </div>
                        <div>
                            <InputLabel htmlFor="sequencing" value="Sequencing" />
                            <select
                                id="sequencing"
                                className="mt-1 block w-full rounded border-outline-variant"
                                value={data.sequencing}
                                onChange={(e) => setData('sequencing', e.target.value)}
                            >
                                <option value="locked">Locked</option>
                                <option value="flexible">Flexible</option>
                            </select>
                        </div>
                    </div>

                    <div>
                        <InputLabel htmlFor="status" value="Status" />
                        <select
                            id="status"
                            className="mt-1 block w-full rounded border-outline-variant"
                            value={data.status}
                            onChange={(e) => setData('status', e.target.value)}
                        >
                            {['draft', 'review', 'scheduled', 'published', 'closed', 'archived'].map((status) => (
                                <option key={status} value={status}>
                                    {status}
                                </option>
                            ))}
                        </select>
                        <InputError message={errors.status} className="mt-1" />
                    </div>

                    <Button type="submit" variant="primary" disabled={processing}>
                        {programme ? 'Save Changes' : 'Create Programme'}
                    </Button>
                </form>
            </Card>
        </AdminLayout>
    );
}
