import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import { Toolbar } from './Toolbar';

describe('Toolbar Component', () => {
  const mockOnToolDrag = vi.fn();

  it('renders all tools', () => {
    render(<Toolbar onToolClick={mockOnToolDrag} />);
    // Inputs
    expect(screen.getByText('NO Contact')).toBeInTheDocument();
    expect(screen.getByText('NC Contact')).toBeInTheDocument();
    expect(screen.getByText('One-Shot Rising')).toBeInTheDocument();
    // Outputs
    expect(screen.getByText('Output Coil')).toBeInTheDocument();
    expect(screen.getByText('Set Coil')).toBeInTheDocument();
    // Timers
    expect(screen.getByText('TON Timer')).toBeInTheDocument();
    expect(screen.getByText('RTO Timer')).toBeInTheDocument();
    // Counters
    expect(screen.getByText('CTU Counter')).toBeInTheDocument();
    expect(screen.getByText('CTD Counter')).toBeInTheDocument();
    // Logic
    expect(screen.getByText('AND Gate')).toBeInTheDocument();
    expect(screen.getByText('NAND Gate')).toBeInTheDocument();
    // Control
    expect(screen.getByText('Branch OR')).toBeInTheDocument();
    expect(screen.getByText('Branch AND')).toBeInTheDocument();
    expect(screen.getByText('NoOp')).toBeInTheDocument();
    // Data
    expect(screen.getByText('Math ADD')).toBeInTheDocument();
    expect(screen.getByText('Math SUB')).toBeInTheDocument();
    expect(screen.getByText('Move')).toBeInTheDocument();
    expect(screen.getByText('Scale')).toBeInTheDocument();
    expect(screen.getByText('Compare')).toBeInTheDocument();
  });

  it('sets dataTransfer on drag start', () => {
    render(<Toolbar onToolClick={mockOnToolDrag} />);
    const toolItem = screen.getByText('NO Contact');

    const setData = vi.fn();
    fireEvent.dragStart(toolItem, {
      dataTransfer: {
        setData,
      } as any,
    });

    expect(setData).toHaveBeenCalledWith('text/plain', 'contact-no');
  });
});