'use client';

import AdminLayout from '@admin/layouts/admin/admin-layout';
import HeaderWithBackIcon from '@admin/components/header-with-backicon';
import { Button } from '@admin/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@admin/components/ui/card';
import { Head, router, usePage } from '@inertiajs/react';
import { ChevronRight } from 'lucide-react';
import { useState } from 'react';
import { toast } from 'sonner';

export default function Edit() {
    const { role, permissions: allPermissions } = usePage<any>().props;

    // All available permissions grouped by group_name (from config via controller)
    const groupedPermissions: Record<string, any[]> = allPermissions || {};

    // Pre-select slugs the role currently has
    const initialSlugs: string[] = (role?.permissions || []).map((p: any) => p.slug);
    const [selectedPermissions, setSelectedPermissions] = useState<string[]>(initialSlugs);

    const togglePermission = (slug: string) => {
        setSelectedPermissions((prev) =>
            prev.includes(slug) ? prev.filter((s) => s !== slug) : [...prev, slug],
        );
    };

    const toggleGroup = (perms: any[]) => {
        const slugs = perms.map((p) => p.slug);
        const allSelected = slugs.every((s) => selectedPermissions.includes(s));
        if (allSelected) {
            setSelectedPermissions((prev) => prev.filter((s) => !slugs.includes(s)));
        } else {
            setSelectedPermissions((prev) => [...new Set([...prev, ...slugs])]);
        }
    };

    const handleSubmit = (e: React.FormEvent) => {
        e.preventDefault();
        router.put(
            route('admin.roles.update', role?.uid),
            {
                name: role?.name,
                slug: role?.slug,
                permissions: selectedPermissions,
            },
            {
                onSuccess: () => toast.success('Role updated successfully!'),
                onError: (errors) => {
                    console.error('Validation errors:', errors);
                    toast.error('Something went wrong.');
                },
            },
        );
    };

    return (
        <>
            <Head title={`Edit Role: ${role?.name}`} />
            <div className="mx-auto flex w-full flex-1 flex-col gap-4 p-3 sm:gap-6 sm:p-2">
                <div className="flex items-center justify-between">
                    <HeaderWithBackIcon
                        title="Edit Role"
                        description={`Update permissions for ${role?.name}`}
                    />
                    <div className="hidden items-center space-x-2 text-sm text-gray-500 sm:flex">
                        <span>Roles</span>
                        <ChevronRight className="h-4 w-4" />
                        <span className="font-medium text-primary">Edit</span>
                    </div>
                </div>

                <form onSubmit={handleSubmit} className="bg-white p-4 rounded-lg shadow mt-4">
                    {/* Role info (read-only) */}
                    <div className="mb-6 grid gap-4 sm:grid-cols-2">
                        <div>
                            <label className="block text-sm font-medium text-gray-700 mb-1">Role Name</label>
                            <input
                                type="text"
                                value={role?.name || ''}
                                readOnly
                                className="w-full px-3 py-2 border border-gray-300 rounded-md bg-gray-50 text-gray-700 cursor-not-allowed"
                            />
                        </div>
                        <div>
                            <label className="block text-sm font-medium text-gray-700 mb-1">Role Slug</label>
                            <input
                                type="text"
                                value={role?.slug || ''}
                                readOnly
                                disabled
                                className="w-full px-3 py-2 border border-gray-300 rounded-md bg-gray-50 text-gray-700 cursor-not-allowed"
                            />
                        </div>
                    </div>

                    {/* All available permissions */}
                    <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
                        {Object.entries(groupedPermissions).map(([group, perms]) => {
                            const slugs = (perms as any[]).map((p) => p.slug);
                            const allSelected = slugs.every((s) => selectedPermissions.includes(s));

                            return (
                                <Card key={group} className="border shadow-sm">
                                    <CardHeader className="p-4 pb-3">
                                        <div className="flex items-center justify-between gap-2">
                                            <CardTitle className="capitalize text-base font-semibold text-gray-800">
                                                {group}
                                            </CardTitle>
                                            <Button
                                                type="button"
                                                size="sm"
                                                variant="ghost"
                                                className="text-blue-600 hover:text-blue-700 hover:bg-blue-50 text-xs h-7 px-2 font-medium"
                                                onClick={() => toggleGroup(perms as any[])}
                                            >
                                                {allSelected ? 'Deselect' : 'Select'}
                                            </Button>
                                        </div>
                                    </CardHeader>
                                    <CardContent className="grid grid-cols-1 gap-2.5 p-4 pt-0">
                                        {(perms as any[]).map((p: any) => (
                                            <div key={p.slug} className="flex items-center space-x-2">
                                                <input
                                                    type="checkbox"
                                                    id={`perm-${p.slug}`}
                                                    checked={selectedPermissions.includes(p.slug)}
                                                    onChange={() => togglePermission(p.slug)}
                                                    className="h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500"
                                                />
                                                <label
                                                    htmlFor={`perm-${p.slug}`}
                                                    className="text-sm font-normal text-gray-700 cursor-pointer"
                                                >
                                                    {p.name}
                                                </label>
                                            </div>
                                        ))}
                                    </CardContent>
                                </Card>
                            );
                        })}
                    </div>

                    <div className="flex justify-end mt-6">
                        <Button type="submit" className="bg-blue-600 hover:bg-blue-700">
                            Update Role
                        </Button>
                    </div>
                </form>
            </div>
        </>
    );
}

Edit.layout = (page: React.ReactNode) => (
    <AdminLayout
        breadcrumbs={[
            { title: 'Dashboard', href: route('admin.dashboard') },
            { title: 'Roles', href: route('admin.roles.index') },
            { title: 'Edit', href: '#' },
        ]}
    >
        {page}
    </AdminLayout>
);
