// This program has been developed by students from the bachelor Computer Science at Utrecht
// University within the Software Project course.
// © Copyright Utrecht University (Department of Information and Computing Sciences)
import { jest } from '@jest/globals';
import React from 'react';
import '@testing-library/jest-dom';

/**
 * Mock for @xyflow/react
 * Provides simplified versions of React Flow hooks and components
 */
jest.mock('@xyflow/react', () => ({
  useReactFlow: jest.fn(() => ({
    screenToFlowPosition: jest.fn((pos: any) => pos),
    getNode: jest.fn(),
    getNodes: jest.fn(() => []),
    getEdges: jest.fn(() => []),
    setNodes: jest.fn(),
    setEdges: jest.fn(),
  })),
  ReactFlowProvider: ({ children }: { children: React.ReactNode }) =>
    React.createElement('div', { 'data-testid': 'react-flow-provider' }, children),
  ReactFlow: ({ children, ...props }: any) =>
    React.createElement('div', { 'data-testid': 'react-flow', ...props }, children),
  Handle: ({ type, position, id }: any) =>
    React.createElement('div', { 'data-testid': `handle-${type}-${id}`, 'data-position': position }),
  Panel: ({ children, position }: any) =>
    React.createElement('div', { 'data-testid': 'panel', 'data-position': position }, children),
  Controls: () => React.createElement('div', { 'data-testid': 'controls' }),
  Background: () => React.createElement('div', { 'data-testid': 'background' }),
}));

/**
 * Mock for @neodrag/react
 * Simplifies drag behavior for testing
 */
jest.mock('@neodrag/react', () => ({
  useDraggable: jest.fn((ref: any, options?: any) => {
    // Store the options so we can trigger them in tests
    if (ref && ref.current) {
      (ref.current as any)._dragOptions = options;
    }
  }),
}));