import { Head, useForm } from '@inertiajs/react';
import { FormEventHandler } from 'react';

import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import AdminLayout from '@/layouts/admin-layout';
import { type Permission, type Role } from '@/types';

export default function AdminRoleEdit({ role, permissions }: { role: Role; permissions: Permission[] }) {
    const { data, setData, patch, processing, errors } = useForm({
        name: role.name,
        permissions: role.permissions?.map((p) => p.id) ?? [],
    });

    const togglePermission = (id: number) => {
        setData('permissions', data.permissions.includes(id) ? data.permissions.filter((p) => p !== id) : [...data.permissions, id]);
    };

    const submit: FormEventHandler = (e) => {
        e.preventDefault();
        patch(`/admin/roles/${role.id}`);
    };

    // Group permissions by prefix
    const groups: Record<string, Permission[]> = {};
    permissions.forEach((p) => {
        const key = p.name.split('.')[0] ?? 'general';
        if (!groups[key]) { groups[key] = []; }
        groups[key].push(p);
    });

    return (
        <AdminLayout title={`Edit Role: ${role.name}`}>
            <Head title={`Edit ${role.name}`} />
            <form onSubmit={submit} className="max-w-2xl space-y-4">
                <Card>
                    <CardHeader><CardTitle className="text-base">Role Details</CardTitle></CardHeader>
                    <CardContent className="space-y-4">
                        <div className="space-y-1.5">
                            <Label>Role Name *</Label>
                            <Input value={data.name} onChange={(e) => setData('name', e.target.value)} className={errors.name ? 'border-red-400' : ''} />
                            {errors.name && <p className="text-xs text-red-500">{errors.name}</p>}
                        </div>
                    </CardContent>
                </Card>

                {permissions.length > 0 && (
                    <Card>
                        <CardHeader>
                            <div className="flex items-center justify-between">
                                <CardTitle className="text-base">Permissions</CardTitle>
                                <div className="flex gap-2">
                                    <button type="button" onClick={() => setData('permissions', permissions.map((p) => p.id))} className="text-xs text-indigo-600 hover:underline">Select All</button>
                                    <span className="text-slate-300">|</span>
                                    <button type="button" onClick={() => setData('permissions', [])} className="text-xs text-slate-500 hover:underline">Clear</button>
                                </div>
                            </div>
                        </CardHeader>
                        <CardContent>
                            <div className="space-y-4">
                                {Object.entries(groups).map(([group, perms]) => (
                                    <div key={group}>
                                        <div className="mb-2 text-xs font-semibold uppercase tracking-wider text-slate-400 capitalize">{group}</div>
                                        <div className="grid gap-2 sm:grid-cols-2">
                                            {perms.map((p) => (
                                                <label key={p.id} className="flex cursor-pointer items-center gap-2 rounded-lg border p-2.5 hover:bg-slate-50">
                                                    <input type="checkbox" checked={data.permissions.includes(p.id)} onChange={() => togglePermission(p.id)} className="text-indigo-600" />
                                                    <span className="text-sm">{p.name}</span>
                                                </label>
                                            ))}
                                        </div>
                                    </div>
                                ))}
                            </div>
                        </CardContent>
                    </Card>
                )}

                <Button type="submit" disabled={processing} className="bg-indigo-600 hover:bg-indigo-700">
                    {processing ? 'Saving…' : 'Save Changes'}
                </Button>
            </form>
        </AdminLayout>
    );
}
