import React, { useState, useMemo } from 'react';
import { Key, Plus, Trash2, Edit2, Shield } from 'lucide-react';
import { COMMON_FIELDS } from '../core/constants';
import { ConfirmationModal } from '@nexuscrm/salesforce-crm-standard-frontend/platform/components/ui';
import { PermissionEditorModal, PermissionEntity } from '../features/security/components/PermissionEditorModal';
import { PermissionSetFormModal } from '../features/admin/components/PermissionSetFormModal';
import { useErrorToast, useSuccessToast } from '@nexuscrm/salesforce-crm-standard-frontend/platform/components/ui';
import { formatApiError } from '@nexuscrm/host-sdk';
import { PowerList, PowerListColumn } from '@nexuscrm/salesforce-crm-standard-frontend/platform/components/ui';
import { Tooltip } from '@nexuscrm/salesforce-crm-standard-frontend/platform/components/ui';
import { Badge } from '@nexuscrm/salesforce-crm-standard-frontend/platform/components/ui';
import { usePermissionSets, useCreatePermissionSet, useUpdatePermissionSet, useDeletePermissionSet } from '../features/security/permissionSetQueries';
import type { PermissionSet } from '../types';

export const PermissionSetManager: React.FC = () => {
    const errorToast = useErrorToast();
    const successToast = useSuccessToast();

    const { data: permissionSets = [], isLoading: loading } = usePermissionSets();
    const createMutation = useCreatePermissionSet();
    const updateMutation = useUpdatePermissionSet();
    const deleteMutation = useDeletePermissionSet();

    const [showCreateModal, setShowCreateModal] = useState(false);
    const [editingPermSet, setEditingPermSet] = useState<PermissionSet | null>(null);
    const [deletingPermSet, setDeletingPermSet] = useState<PermissionSet | null>(null);
    const [editingPermissions, setEditingPermissions] = useState<PermissionEntity | null>(null);

    const submitting = createMutation.isPending || updateMutation.isPending;

    const handleSave = async (formData: { Name: string; Label: string; Description: string }) => {
        try {
            if (editingPermSet) {
                await updateMutation.mutateAsync({ id: editingPermSet[COMMON_FIELDS.ID] as string, data: formData });
                successToast('Permission Set updated successfully');
                setEditingPermSet(null);
            } else {
                await createMutation.mutateAsync(formData);
                successToast('Permission Set created successfully');
                setShowCreateModal(false);
            }
        } catch (err: unknown) {
            errorToast(`Failed to save permission set: ${formatApiError(err).message}`);
        }
    };

    const handleDelete = async () => {
        if (!deletingPermSet) return;
        try {
            await deleteMutation.mutateAsync(deletingPermSet[COMMON_FIELDS.ID] as string);
            successToast('Permission Set deleted successfully');
            setDeletingPermSet(null);
        } catch (err: unknown) {
            errorToast(`Failed to delete permission set: ${formatApiError(err).message}`);
        }
    };

    const columns: PowerListColumn<PermissionSet>[] = useMemo(() => [
        { key: 'Name', label: 'API Name', minWidth: '140px' },
        { key: 'Label', label: 'Label', minWidth: '140px' },
        {
            key: 'Description', label: 'Description', minWidth: '180px',
            render: (val) => (
                <span className="text-gray-500 dark:text-gray-400 truncate block max-w-xs">
                    {val ? String(val) : '—'}
                </span>
            ),
        },
        {
            key: 'IsCustom', label: 'Type', width: '100px',
            render: (val) => val ? (
                <Badge variant="info">Custom</Badge>
            ) : (
                <Badge variant="neutral">Standard</Badge>
            ),
        },
    ], []);

    const renderActions = (permSet: PermissionSet) => (
        <div className="flex items-center justify-end gap-1">
            <Tooltip content="Permissions" position="top">
                <button
                    onClick={() => setEditingPermissions({ id: permSet[COMMON_FIELDS.ID] as string, name: permSet.Label, type: 'permission_set' })}
                    className="p-1.5 rounded-lg hover:bg-purple-50 dark:hover:bg-purple-900/20 text-purple-600 dark:text-purple-400 transition-colors"
                >
                    <Shield size={16} />
                </button>
            </Tooltip>
            <Tooltip content="Edit" position="top">
                <button
                    onClick={() => setEditingPermSet(permSet)}
                    className="p-1.5 rounded-lg hover:bg-blue-50 dark:hover:bg-blue-900/20 text-blue-600 dark:text-blue-400 transition-colors"
                >
                    <Edit2 size={16} />
                </button>
            </Tooltip>
            <Tooltip content="Delete" position="top">
                <button
                    onClick={() => setDeletingPermSet(permSet)}
                    className="p-1.5 rounded-lg hover:bg-red-50 dark:hover:bg-red-900/20 text-red-600 dark:text-red-400 transition-colors"
                >
                    <Trash2 size={16} />
                </button>
            </Tooltip>
        </div>
    );

    return (
        <div className="max-w-7xl mx-auto p-6">
            <div className="flex items-center justify-between mb-8">
                <div className="flex items-center gap-4">
                    <div className="p-3 bg-amber-100 rounded-lg">
                        <Key className="text-amber-600" size={32} />
                    </div>
                    <div>
                        <h1 className="text-2xl font-bold text-slate-800">Permission Sets</h1>
                        <p className="text-slate-500">Grant additive permissions to users without changing their profile.</p>
                    </div>
                </div>
                <button
                    onClick={() => setShowCreateModal(true)}
                    className="flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 font-medium shadow-sm transition-colors"
                >
                    <Plus size={18} />
                    New Permission Set
                </button>
            </div>

            <PowerList<PermissionSet>
                data={permissionSets}
                columns={columns}
                loading={loading}
                rowKey={(ps) => ps[COMMON_FIELDS.ID] as string}
                searchable
                searchPlaceholder="Search permission sets..."
                defaultSort={{ key: 'Label', direction: 'asc' }}
                emptyIcon={<Key className="w-12 h-12" />}
                emptyTitle="No Permission Sets"
                emptyMessage="Create a permission set to grant additional permissions to users."
                actions={renderActions}
                ariaLabel="Permission sets list"
            />

            {/* Create/Edit Modal */}
            <PermissionSetFormModal
                isOpen={showCreateModal || !!editingPermSet}
                onClose={() => { setShowCreateModal(false); setEditingPermSet(null); }}
                onSave={handleSave}
                initialData={editingPermSet ? { Name: editingPermSet.Name, Label: editingPermSet.Label, Description: editingPermSet.Description || '' } : undefined}
                submitting={submitting}
            />

            {/* Delete Confirmation */}
            <ConfirmationModal
                isOpen={!!deletingPermSet}
                onClose={() => setDeletingPermSet(null)}
                onConfirm={handleDelete}
                title="Delete Permission Set"
                message={`Permanently delete "${deletingPermSet?.Label}" and its permissions? This cannot be undone. Remove user assignments and other references first.`}
                confirmLabel="Delete"
                variant="danger"
            />

            {/* Permission Editor Modal */}
            {editingPermissions && (
                <PermissionEditorModal
                    entity={editingPermissions}
                    onClose={() => setEditingPermissions(null)}
                    onSave={() => {
                        successToast('Permissions saved successfully');
                    }}
                />
            )}
        </div>
    );
};
