import React, { useState, useMemo } from 'react';
import { Plus } from 'lucide-react';
import { useSharingRules, useRoles, useGroups, useSchemas, useCreateSharingRule, useUpdateSharingRule, useDeleteSharingRule } from '../features/security/securityQueries';
import { SharingRuleList } from '../features/security/components/SharingRuleList';
import { SharingRuleForm } from '../features/security/components/SharingRuleForm';
import { ConfirmationModal } from '@nexuscrm/salesforce-crm-standard-frontend/platform/components/ui';
import { useErrorToast, useSuccessToast } from '@nexuscrm/salesforce-crm-standard-frontend/platform/components/ui';
import { Logger } from '../core/services/Logger';
import { formatApiError } from '@nexuscrm/host-sdk';
import { COMMON_FIELDS } from '../core/constants';
import { isSystemTable } from '../core/constants/SystemObjects';
import type { SharingRule } from '../types';

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

    // Query Hooks
    const { data: rules = [], isLoading: rulesLoading } = useSharingRules();
    const { data: roles = [], isLoading: rolesLoading } = useRoles();
    const { data: groups = [], isLoading: groupsLoading } = useGroups();
    const { data: objects = [], isLoading: objectsLoading } = useSchemas();

    // Filter out system objects (prefixed with _System_) - only user-defined objects allowed
    const userObjects = useMemo(() =>
        objects.filter(obj => !isSystemTable(obj.name ?? '')),
        [objects]
    );

    // Mutations
    const createRuleMutation = useCreateSharingRule();
    const updateRuleMutation = useUpdateSharingRule();
    const deleteRuleMutation = useDeleteSharingRule();

    // UI State
    const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
    const [editingRule, setEditingRule] = useState<SharingRule | null>(null);
    const [deletingRule, setDeletingRule] = useState<SharingRule | null>(null);

    const isLoading = rulesLoading || rolesLoading || groupsLoading || objectsLoading;

    // Handlers
    const handleCreate = async (data: Partial<SharingRule>) => {
        try {
            await createRuleMutation.mutateAsync(data);
            successToast('Sharing rule created successfully');
            setIsCreateModalOpen(false);
        } catch (err: unknown) {
            errorToast(`Failed to create sharing rule: ${formatApiError(err).message}`);
        }
    };

    const handleUpdate = async (data: Partial<SharingRule>) => {
        if (!editingRule) return;
        try {
            await updateRuleMutation.mutateAsync({
                id: editingRule[COMMON_FIELDS.ID] as string,
                data
            });
            successToast('Sharing rule updated successfully');
            setEditingRule(null);
        } catch (err: unknown) {
            errorToast(`Failed to update sharing rule: ${formatApiError(err).message}`);
        }
    };

    const handleDelete = async () => {
        if (!deletingRule) return;
        try {
            await deleteRuleMutation.mutateAsync(deletingRule[COMMON_FIELDS.ID] as string);
            successToast('Sharing rule deleted successfully');
            setDeletingRule(null);
        } catch (err: unknown) {
            Logger.error('[SharingRuleManager] Failed to delete rule', {}, err);
            errorToast('Failed to delete sharing rule');
        }
    };

    const closeFormModal = () => {
        setIsCreateModalOpen(false);
        setEditingRule(null);
    };

    return (
        <div className="max-w-7xl mx-auto p-6">
            <div className="flex items-center justify-end mb-8">
                <button
                    onClick={() => setIsCreateModalOpen(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 Sharing Rule
                </button>
            </div>

            {/* Rule List */}
            <SharingRuleList
                rules={rules}
                roles={roles}
                groups={groups}
                objects={userObjects}
                onEdit={setEditingRule}
                onDelete={setDeletingRule}
                isLoading={isLoading}
            />

            {/* Create/Edit Modal */}
            {(isCreateModalOpen || editingRule) && (
                <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-[100]">
                    <div className="bg-white rounded-xl shadow-2xl w-full max-w-lg mx-4 max-h-[90vh] overflow-y-auto">
                        <div className="p-6 border-b border-slate-200 flex items-center justify-between sticky top-0 bg-white z-10">
                            <h2 className="text-xl font-semibold text-slate-800">
                                {editingRule ? 'Edit Sharing Rule' : 'Create Sharing Rule'}
                            </h2>
                            <button
                                onClick={closeFormModal}
                                className="text-slate-400 hover:text-slate-600 transition-colors"
                            >
                                <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                                    <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
                                </svg>
                            </button>
                        </div>

                        <SharingRuleForm
                            initialData={editingRule}
                            roles={roles}
                            groups={groups}
                            objects={userObjects}
                            onSubmit={editingRule ? handleUpdate : handleCreate}
                            onCancel={closeFormModal}
                            isLoading={createRuleMutation.isPending || updateRuleMutation.isPending}
                        />
                    </div>
                </div>
            )}

            {/* Delete Confirmation */}
            <ConfirmationModal
                isOpen={!!deletingRule}
                onClose={() => setDeletingRule(null)}
                onConfirm={handleDelete}
                title="Delete Sharing Rule"
                message={`Are you sure you want to delete "${deletingRule?.Name}"? Users who rely on this rule will lose access.`}
                confirmLabel="Delete"
                variant="danger"
                loading={deleteRuleMutation.isPending}
            />
        </div>
    );
};
