import { Button } from '@/components/ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Textarea } from '@/components/ui/textarea';
import { Checkbox } from '@/components/ui/checkbox';
import { Label } from '@/components/ui/label';
import AppLayout from '@/layouts/app-layout';
import { type BreadcrumbItem } from '@/types';
import { Head, Link, useForm } from '@inertiajs/react';
import { ArrowLeft, Save, Shield, Key } from 'lucide-react';
import { showLoading, updateToast } from '@/lib/toast';

interface Permission {
    id: number;
    name: string;
    description?: string;
}

interface Props {
    permissions: Permission[];
}

const breadcrumbs: BreadcrumbItem[] = [
    { title: 'Dashboard', href: '/dashboard' },
    { title: 'Roles', href: '/roles' },
    { title: 'Nuevo Rol', href: '/roles/create' },
];

export default function RolesCreate({ permissions }: Props) {
    const { data, setData, post, processing, errors } = useForm({
        name: '',
        description: '',
        guard_name: 'web',
        permissions: [] as number[],
    });

    const handleSubmit = (e: React.FormEvent) => {
        e.preventDefault();

        const toastId = showLoading('Creando rol...');

        post('/roles', {
            onSuccess: () => {
                updateToast(toastId, 'success', 'Rol creado exitosamente');
            },
            onError: () => {
                updateToast(toastId, 'error', 'Error al crear el rol');
            }
        });
    };

    const handlePermissionChange = (permissionId: number, checked: boolean) => {
        if (checked) {
            setData('permissions', [...data.permissions, permissionId]);
        } else {
            setData('permissions', data.permissions.filter(id => id !== permissionId));
        }
    };

    // Agrupar permisos por categoría
    const groupedPermissions = permissions.reduce((groups, permission) => {
        let category = 'General';
        if (permission.name.includes('user')) category = 'Usuarios';
        else if (permission.name.includes('role')) category = 'Roles';
        else if (permission.name.includes('permission')) category = 'Permisos';
        else if (permission.name.includes('project')) category = 'Proyectos';
        else if (permission.name.includes('category')) category = 'Categorías';
        else if (permission.name.includes('institution')) category = 'Instituciones';

        if (!groups[category]) groups[category] = [];
        groups[category].push(permission);
        return groups;
    }, {} as Record<string, Permission[]>);

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Nuevo Rol" />

            <div className="flex h-full flex-1 flex-col gap-6 rounded-xl p-6">
                {/* Header */}
                <div className="flex flex-col gap-4">
                    <div className="flex items-center justify-between">
                        <div className="flex items-start gap-3 flex-1">
                            <div className="p-2 bg-emerald-100 dark:bg-emerald-900/20 rounded-lg flex-shrink-0">
                                <Shield className="w-6 h-6 text-emerald-600 dark:text-emerald-400" />
                            </div>
                            <div className="min-w-0 flex-1">
                                <h1 className="text-xl font-bold text-slate-900 dark:text-white sm:text-2xl">
                                    Nuevo Rol
                                </h1>
                                <p className="text-slate-600 dark:text-slate-400 mt-1 text-sm">
                                    Crea un nuevo rol y asigna permisos
                                </p>
                            </div>
                        </div>
                        <Button variant="outline" asChild className="ml-4 flex-shrink-0">
                            <Link href="/roles">
                                <ArrowLeft className="w-4 h-4 mr-2" />
                                Volver
                            </Link>
                        </Button>
                    </div>
                </div>

                {/* Form */}
                <div className="max-w-4xl mx-auto">
                    <form onSubmit={handleSubmit} className="space-y-6">
                        {/* Información básica */}
                        <Card>
                            <CardHeader>
                                <CardTitle className="text-emerald-700 dark:text-emerald-400">
                                    Información del Rol
                                </CardTitle>
                                <CardDescription>
                                    Completa los datos básicos del rol
                                </CardDescription>
                            </CardHeader>
                            <CardContent className="space-y-6">
                                <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
                                    <div className="space-y-2">
                                        <label htmlFor="name" className="text-sm font-medium text-slate-900 dark:text-white">
                                            Nombre del rol *
                                        </label>
                                        <Input
                                            id="name"
                                            type="text"
                                            value={data.name}
                                            onChange={(e) => setData('name', e.target.value)}
                                            placeholder="Ej: Administrador, Editor, etc."
                                            className={errors.name ? 'border-red-500' : ''}
                                        />
                                        {errors.name && (
                                            <p className="text-sm text-red-600 dark:text-red-400">
                                                {errors.name}
                                            </p>
                                        )}
                                    </div>

                                    <div className="space-y-2">
                                        <label htmlFor="guard_name" className="text-sm font-medium text-slate-900 dark:text-white">
                                            Guard
                                        </label>
                                        <Input
                                            id="guard_name"
                                            type="text"
                                            value={data.guard_name}
                                            onChange={(e) => setData('guard_name', e.target.value)}
                                            placeholder="web"
                                            className={errors.guard_name ? 'border-red-500' : ''}
                                        />
                                        {errors.guard_name && (
                                            <p className="text-sm text-red-600 dark:text-red-400">
                                                {errors.guard_name}
                                            </p>
                                        )}
                                    </div>
                                </div>

                                <div className="space-y-2">
                                    <label htmlFor="description" className="text-sm font-medium text-slate-900 dark:text-white">
                                        Descripción
                                    </label>
                                    <Textarea
                                        id="description"
                                        value={data.description}
                                        onChange={(e) => setData('description', e.target.value)}
                                        placeholder="Describe las responsabilidades de este rol (opcional)"
                                        rows={3}
                                        className={errors.description ? 'border-red-500' : ''}
                                    />
                                    {errors.description && (
                                        <p className="text-sm text-red-600 dark:text-red-400">
                                            {errors.description}
                                        </p>
                                    )}
                                </div>
                            </CardContent>
                        </Card>

                        {/* Permisos */}
                        <Card>
                            <CardHeader>
                                <CardTitle className="text-emerald-700 dark:text-emerald-400 flex items-center gap-2">
                                    <Key className="w-5 h-5" />
                                    Permisos
                                </CardTitle>
                                <CardDescription>
                                    Selecciona los permisos que tendrá este rol
                                </CardDescription>
                            </CardHeader>
                            <CardContent>
                                {Object.keys(groupedPermissions).length > 0 ? (
                                    <div className="space-y-6">
                                        {Object.entries(groupedPermissions).map(([category, categoryPermissions]) => (
                                            <div key={category} className="space-y-3">
                                                <h4 className="font-medium text-slate-900 dark:text-white text-sm">
                                                    {category}
                                                </h4>
                                                <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3">
                                                    {categoryPermissions.map((permission) => (
                                                        <div key={permission.id} className="flex items-center space-x-2 p-3 border rounded-lg hover:bg-slate-50 dark:hover:bg-slate-800">
                                                            <Checkbox
                                                                id={`permission-${permission.id}`}
                                                                checked={data.permissions.includes(permission.id)}
                                                                onCheckedChange={(checked: boolean) =>
                                                                    handlePermissionChange(permission.id, checked)
                                                                }
                                                            />
                                                            <div className="flex-1 min-w-0">
                                                                <Label
                                                                    htmlFor={`permission-${permission.id}`}
                                                                    className="text-sm font-medium text-slate-900 dark:text-white cursor-pointer"
                                                                >
                                                                    {permission.name}
                                                                </Label>
                                                                {permission.description && (
                                                                    <p className="text-xs text-muted-foreground mt-1">
                                                                        {permission.description}
                                                                    </p>
                                                                )}
                                                            </div>
                                                        </div>
                                                    ))}
                                                </div>
                                            </div>
                                        ))}
                                    </div>
                                ) : (
                                    <p className="text-sm text-muted-foreground">
                                        No hay permisos disponibles para asignar.
                                    </p>
                                )}
                                {errors.permissions && (
                                    <p className="text-sm text-red-600 dark:text-red-400 mt-2">
                                        {errors.permissions}
                                    </p>
                                )}
                            </CardContent>
                        </Card>

                        <div className="flex gap-3">
                            <Button
                                type="submit"
                                disabled={processing}
                                className="bg-emerald-600 hover:bg-emerald-700"
                            >
                                <Save className="w-4 h-4 mr-2" />
                                {processing ? 'Guardando...' : 'Guardar Rol'}
                            </Button>
                            <Button variant="outline" asChild>
                                <Link href="/roles">
                                    Cancelar
                                </Link>
                            </Button>
                        </div>
                    </form>
                </div>
            </div>
        </AppLayout>
    );
}