import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import {
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuCheckboxItem,
  DropdownMenuRadioItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuShortcut,
} from './dropdown-menu';

describe('DropdownMenu Component', () => {
  it('renders trigger and content', () => {
    render(
      <DropdownMenu>
        <DropdownMenuTrigger>
          <button>Open Menu</button>
        </DropdownMenuTrigger>
        <DropdownMenuContent>
          <DropdownMenuItem>Item 1</DropdownMenuItem>
        </DropdownMenuContent>
      </DropdownMenu>,
    );

    expect(screen.getByText('Open Menu')).toBeInTheDocument();
  });

  it('renders menu items', () => {
    render(
      <DropdownMenu open={true}>
        <DropdownMenuTrigger>
          <button>Open</button>
        </DropdownMenuTrigger>
        <DropdownMenuContent>
          <DropdownMenuItem>Item 1</DropdownMenuItem>
          <DropdownMenuItem>Item 2</DropdownMenuItem>
        </DropdownMenuContent>
      </DropdownMenu>,
    );

    expect(screen.getByText('Item 1')).toBeInTheDocument();
    expect(screen.getByText('Item 2')).toBeInTheDocument();
  });

  it('calls onOpenChange when trigger is clicked', () => {
    const mockOnOpenChange = vi.fn();

    render(
      <DropdownMenu open={false} onOpenChange={mockOnOpenChange}>
        <DropdownMenuTrigger>
          <button>Open</button>
        </DropdownMenuTrigger>
        <DropdownMenuContent>
          <DropdownMenuItem>Item</DropdownMenuItem>
        </DropdownMenuContent>
      </DropdownMenu>,
    );

    const trigger = screen.getByText('Open');
    fireEvent.click(trigger);

    expect(mockOnOpenChange).toHaveBeenCalled();
  });

  it('renders checkbox item', () => {
    const mockOnCheckedChange = vi.fn();

    render(
      <DropdownMenu open={true}>
        <DropdownMenuTrigger>
          <button>Open</button>
        </DropdownMenuTrigger>
        <DropdownMenuContent>
          <DropdownMenuCheckboxItem
            checked={true}
            onCheckedChange={mockOnCheckedChange}
          >
            Checked Item
          </DropdownMenuCheckboxItem>
        </DropdownMenuContent>
      </DropdownMenu>,
    );

    expect(screen.getByText('Checked Item')).toBeInTheDocument();
  });

  it('renders radio item', () => {
    render(
      <DropdownMenu open={true}>
        <DropdownMenuTrigger>
          <button>Open</button>
        </DropdownMenuTrigger>
        <DropdownMenuContent>
          <DropdownMenuRadioItem checked={true} value="option1">
            Radio Item
          </DropdownMenuRadioItem>
        </DropdownMenuContent>
      </DropdownMenu>,
    );

    expect(screen.getByText('Radio Item')).toBeInTheDocument();
  });

  it('renders label', () => {
    render(
      <DropdownMenu open={true}>
        <DropdownMenuTrigger>
          <button>Open</button>
        </DropdownMenuTrigger>
        <DropdownMenuContent>
          <DropdownMenuLabel>Label</DropdownMenuLabel>
        </DropdownMenuContent>
      </DropdownMenu>,
    );

    expect(screen.getByText('Label')).toBeInTheDocument();
  });

  it('renders separator', () => {
    const { container } = render(
      <DropdownMenu open={true}>
        <DropdownMenuTrigger>
          <button>Open</button>
        </DropdownMenuTrigger>
        <DropdownMenuContent>
          <DropdownMenuSeparator />
        </DropdownMenuContent>
      </DropdownMenu>,
    );

    const separator = container.querySelector('.bg-kodo-steel');
    expect(separator).toBeInTheDocument();
  });

  it('renders shortcut', () => {
    render(
      <DropdownMenu open={true}>
        <DropdownMenuTrigger>
          <button>Open</button>
        </DropdownMenuTrigger>
        <DropdownMenuContent>
          <DropdownMenuItem>
            Item
            <DropdownMenuShortcut>⌘K</DropdownMenuShortcut>
          </DropdownMenuItem>
        </DropdownMenuContent>
      </DropdownMenu>,
    );

    expect(screen.getByText('⌘K')).toBeInTheDocument();
  });
});
