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 CourseData {
    id: number;
    programme_id: number | null;
    code: string | null;
    title: string;
    description: string | null;
    outcomes: string | null;
    facilitator_id: number | null;
    duration_minutes: number | null;
    sequence_position: number | null;
    status: string;
}

export default function Form({
    course,
    programmes,
    facilitators,
}: {
    course: CourseData | null;
    programmes: { id: number; title: string }[];
    facilitators: { id: number; name: string }[];
}) {
    const { data, setData, post, put, processing, errors } = useForm({
        programme_id: course?.programme_id ?? '',
        code: course?.code ?? '',
        title: course?.title ?? '',
        description: course?.description ?? '',
        outcomes: course?.outcomes ?? '',
        facilitator_id: course?.facilitator_id ?? '',
        duration_minutes: course?.duration_minutes ?? 60,
        sequence_position: course?.sequence_position ?? 1,
        status: course?.status ?? 'draft',
    });

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

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

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

            <Card className="mt-6 max-w-2xl">
                <form onSubmit={submit} className="space-y-5">
                    <div>
                        <InputLabel htmlFor="programme_id" value="Programme" />
                        <select
                            id="programme_id"
                            className="mt-1 block w-full rounded border-outline-variant"
                            value={data.programme_id}
                            onChange={(e) => setData('programme_id', e.target.value ? Number(e.target.value) : '')}
                        >
                            <option value="">— Course Bank (unassigned) —</option>
                            {programmes.map((programme) => (
                                <option key={programme.id} value={programme.id}>
                                    {programme.title}
                                </option>
                            ))}
                        </select>
                        <InputError message={errors.programme_id} className="mt-1" />
                    </div>

                    <div className="grid grid-cols-3 gap-4">
                        <div>
                            <InputLabel htmlFor="code" value="Code" />
                            <TextInput
                                id="code"
                                className="mt-1 block w-full"
                                value={data.code}
                                onChange={(e) => setData('code', e.target.value)}
                            />
                        </div>
                        <div className="col-span-2">
                            <InputLabel htmlFor="title" value="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>

                    <div>
                        <InputLabel htmlFor="description" value="Description" />
                        <textarea
                            id="description"
                            rows={3}
                            className="mt-1 block w-full rounded border-outline-variant"
                            value={data.description}
                            onChange={(e) => setData('description', e.target.value)}
                        />
                    </div>

                    <div>
                        <InputLabel htmlFor="outcomes" value="Outcomes" />
                        <textarea
                            id="outcomes"
                            rows={3}
                            className="mt-1 block w-full rounded border-outline-variant"
                            value={data.outcomes}
                            onChange={(e) => setData('outcomes', e.target.value)}
                        />
                    </div>

                    <div>
                        <InputLabel htmlFor="facilitator_id" value="Facilitator" />
                        <select
                            id="facilitator_id"
                            className="mt-1 block w-full rounded border-outline-variant"
                            value={data.facilitator_id}
                            onChange={(e) => setData('facilitator_id', e.target.value ? Number(e.target.value) : '')}
                        >
                            <option value="">— Unassigned —</option>
                            {facilitators.map((facilitator) => (
                                <option key={facilitator.id} value={facilitator.id}>
                                    {facilitator.name}
                                </option>
                            ))}
                        </select>
                    </div>

                    <div className="grid grid-cols-3 gap-4">
                        <div>
                            <InputLabel htmlFor="duration_minutes" value="Duration (mins)" />
                            <TextInput
                                id="duration_minutes"
                                type="number"
                                className="mt-1 block w-full"
                                value={data.duration_minutes ?? ''}
                                onChange={(e) => setData('duration_minutes', Number(e.target.value))}
                            />
                        </div>
                        <div>
                            <InputLabel htmlFor="sequence_position" value="Sequence" />
                            <TextInput
                                id="sequence_position"
                                type="number"
                                className="mt-1 block w-full"
                                value={data.sequence_position ?? ''}
                                onChange={(e) => setData('sequence_position', Number(e.target.value))}
                            />
                        </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>
                        </div>
                    </div>

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