import { Form, Head, Link, router } from '@inertiajs/react';
import { useState } from 'react';
import RoleController from '@/actions/App/Http/Controllers/Admin/RoleController';
import { ConfirmDialog } from '@/components/confirm-dialog';
import Heading from '@/components/heading';
import InputError from '@/components/input-error';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { dashboard } from '@/routes';
import { index } from '@/routes/admin/roles';
import {
    PermissionGroupsPicker,
    type PermissionGroup,
} from './permission-groups-picker';

type EditableRole = {
    id: number;
    name: string;
    label: string;
    is_system: boolean;
    is_protected: boolean;
    permissions: string[];
};

export default function RolesEdit({
    role,
    permissions,
    can,
}: {
    role: EditableRole;
    permissions: PermissionGroup[];
    can: { update: boolean; delete: boolean };
}) {
    const [selected, setSelected] = useState<string[]>(role.permissions);
    const readOnly = !can.update || role.is_protected;

    return (
        <>
            <Head title={role.label} />

            <div className="flex h-full flex-1 flex-col gap-6 p-4 md:p-6">
                <Heading
                    title={role.label}
                    description={
                        role.is_protected
                            ? 'Le rôle Super administrateur est protégé et ne peut pas être modifié.'
                            : 'Modifier le rôle et ses permissions par module'
                    }
                />

                <Form
                    {...RoleController.update.form(role.id)}
                    className="mx-auto w-full max-w-3xl space-y-6"
                >
                    {({ processing, errors }) => (
                        <>
                            <div className="grid gap-2">
                                <Label htmlFor="name">Nom technique</Label>
                                <Input
                                    id="name"
                                    name="name"
                                    defaultValue={role.name}
                                    required
                                    disabled={readOnly || role.is_system}
                                    readOnly={readOnly || role.is_system}
                                />
                                {(readOnly || role.is_system) && (
                                    <input
                                        type="hidden"
                                        name="name"
                                        value={role.name}
                                    />
                                )}
                                <InputError message={errors.name} />
                            </div>

                            <PermissionGroupsPicker
                                groups={permissions}
                                selected={selected}
                                onChange={setSelected}
                                disabled={readOnly}
                            />
                            <InputError message={errors.permissions} />

                            <div className="flex flex-wrap gap-3">
                                {!readOnly && (
                                    <Button disabled={processing}>
                                        Enregistrer
                                    </Button>
                                )}
                                <Button variant="outline" asChild>
                                    <Link href={index()}>Retour</Link>
                                </Button>
                                {can.delete && !role.is_system && (
                                    <ConfirmDialog
                                        trigger={
                                            <Button
                                                type="button"
                                                variant="destructive"
                                            >
                                                Supprimer
                                            </Button>
                                        }
                                        title={`Supprimer le rôle ${role.label} ?`}
                                        description="Cette action est irréversible."
                                        confirmLabel="Supprimer"
                                        onConfirm={() => {
                                            router.delete(
                                                RoleController.destroy.url(
                                                    role.id,
                                                ),
                                            );
                                        }}
                                    />
                                )}
                            </div>
                        </>
                    )}
                </Form>
            </div>
        </>
    );
}

RolesEdit.layout = {
    breadcrumbs: [
        { title: 'Tableau de bord', href: dashboard() },
        { title: 'Rôles', href: index() },
        { title: 'Modifier', href: '#' },
    ],
};
