'use client';

import AdminLayout from '@admin/layouts/admin/admin-layout';
import HeaderWithBackIcon from '@admin/components/header-with-backicon';
import Form from '@admin/components/form/Form';
import FormField from '@admin/components/form/FormField';
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 * as yup from 'yup';
import { yupResolver } from '@hookform/resolvers/yup';
import { toast } from 'sonner';

export default function Create() {
    const { permissions } = usePage<any>().props;

    // Group permissions by group_name (already grouped from backend)
    const groupedPermissions = permissions || {};

    const schema = yup.object({
        name: yup.string().required('Role name is required'),
        slug: yup.string().required('Role slug is required'),
        permissions: yup.array().of(yup.string()).min(1, 'Select at least one permission'),
    });

    // Local state for selected permissions (using slugs)
    const [selectedPermissions, setSelectedPermissions] = useState<string[]>([]);
    const [roleName, setRoleName] = useState('');
    const [roleSlug, setRoleSlug] = useState('');

    // Generate slug from name
    const generateSlug = (name: string) => {
        return name
            .toLowerCase()
            .trim()
            .replace(/[^a-z0-9\s-]/g, '')
            .replace(/\s+/g, '-')
            .replace(/-+/g, '-')
            .replace(/^-|-$/g, '');
    };

    // Handle name change and auto-generate slug
    const handleNameChange = (value: string) => {
        setRoleName(value);
        setRoleSlug(generateSlug(value));
    };

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

    // Select/Deselect all in a group
    const toggleGroup = (permissions: any[]) => {
        const permissionSlugs = permissions.map(p => p.slug);
        const allSelected = permissionSlugs.every(slug => selectedPermissions.includes(slug));

        if (allSelected) {
            setSelectedPermissions(prev => prev.filter(slug => !permissionSlugs.includes(slug)));
        } else {
            setSelectedPermissions(prev => [...new Set([...prev, ...permissionSlugs])]);
        }
    };

    // Submit form
    const handleSubmit = () => {
        if (!roleName || !roleSlug || selectedPermissions.length === 0) {
            if (!roleName) toast.error('Role name is required');
            else if (!roleSlug) toast.error('Role slug is required');
            else if (selectedPermissions.length === 0) toast.error('Select at least one permission');
            return;
        }

        router.post(route('admin.roles.store'), {
            name: roleName,
            slug: roleSlug,
            permissions: selectedPermissions,
        }, {
            onSuccess: () => toast.success('Role created successfully!'),
            onError: (errors) => {
                console.error('Validation errors:', errors);
                toast.error('Something went wrong.');
            },
        });
    };

    return (
        <>
            <Head title="Create Role" />
            <div className="mx-auto flex w-full flex-1 flex-col gap-4 p-3 sm:gap-6 sm:p-2">
                {/* Header */}
                <div className="flex items-center justify-between">
                    <HeaderWithBackIcon
                        title="Create Role"
                        description="Create a new role and assign permissions"
                    />
                    <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">Create</span>
                    </div>
                </div>

                {/* Form */}
                <div className="bg-white p-4 rounded-lg shadow mt-4">
                    <Form
                        submitHandler={handleSubmit}
                        resolver={yupResolver(schema)}
                        defaultValues={{
                            name: '',
                            slug: '',
                            permissions: [],
                        }}
                    >
                        {/* Role name and slug */}
                        <div className="mb-6 grid gap-4 sm:grid-cols-2">
                            <div>
                                <label htmlFor="name" className="block text-sm font-medium text-gray-700 mb-1">
                                    Role Name
                                </label>
                                <input
                                    type="text"
                                    id="name"
                                    value={roleName}
                                    onChange={(e) => handleNameChange(e.target.value)}
                                    placeholder="Enter role name"
                                    className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
                                />
                            </div>
                            <div>
                                <label htmlFor="slug" className="block text-sm font-medium text-gray-700 mb-1">
                                    Role Slug
                                </label>
                                <input
                                    type="text"
                                    id="slug"
                                    value={roleSlug}
                                    disabled
                                    placeholder="Auto-generated from role name"
                                    className="w-full px-3 py-2 border border-gray-300 rounded-md bg-gray-50 text-gray-700 cursor-not-allowed"
                                />
                            </div>
                        </div>

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

                                return (
                                    <Card key={group} className="border shadow-sm">
                                        <CardHeader className="p-4 pb-3">
                                            <div className="flex items-center justify-between gap-2">
                                                {/* Group Name bold */}
                                                <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(permissions as any[])}
                                                >
                                                    {allSelected ? 'Deselect' : 'Select'}
                                                </Button>
                                            </div>
                                        </CardHeader>
                                        <CardContent className="grid grid-cols-1 gap-2.5 p-4 pt-0">
                                            {(permissions as any[]).map((p: any) => (
                                                <div key={p.slug} className="flex items-center space-x-2">
                                                    <input
                                                        type="checkbox"
                                                        id={`permission-${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={`permission-${p.slug}`}
                                                        className="text-sm font-normal text-gray-700 cursor-pointer"
                                                    >
                                                        {p.name}
                                                    </label>
                                                </div>
                                            ))}
                                        </CardContent>
                                    </Card>
                                );
                            })}
                        </div>

                        {/* Submit */}
                        <div className="flex justify-end mt-4">
                            <Button type="submit" className="bg-blue-600 hover:bg-blue-700">
                                Create Role
                            </Button>
                        </div>
                    </Form>
                </div>
            </div>
        </>
    );
}

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