import { describe, expect, it, vi } from 'vitest'
import { handleAppKeyboardEvent, type KeyboardActions } from './appKeyboardShortcuts'

function makeActions(): KeyboardActions {
  return {
    activeTabPathRef: { current: '/vault/a.md' },
    multiSelectionCommandRef: { current: null },
    onArchiveNote: vi.fn(),
    onCommandPalette: vi.fn(),
    onCreateNote: vi.fn(),
    onDeleteNote: vi.fn(),
    onFindInNote: vi.fn(),
    onGoBack: vi.fn(),
    onGoForward: vi.fn(),
    onOpenInNewWindow: vi.fn(),
    onOpenSettings: vi.fn(),
    onPastePlainText: vi.fn(),
    onQuickOpen: vi.fn(),
    onReplaceInNote: vi.fn(),
    onSave: vi.fn(),
    onSearch: vi.fn(),
    onSetViewMode: vi.fn(),
    onToggleFavorite: vi.fn(),
    onToggleInspector: vi.fn(),
    onToggleOrganized: vi.fn(),
    onToggleRawEditor: vi.fn(),
    onZoomIn: vi.fn(),
    onZoomOut: vi.fn(),
    onZoomReset: vi.fn(),
  }
}

function commandF(): KeyboardEvent {
  return new KeyboardEvent('keydown', {
    bubbles: true,
    cancelable: true,
    code: 'KeyF',
    key: 'f',
    metaKey: true,
  })
}

function withFocusedElement(element: HTMLElement, test: () => void): void {
  document.body.appendChild(element)
  element.focus()
  try {
    test()
  } finally {
    element.remove()
  }
}

describe('editor find shortcut routing', () => {
  it('runs Cmd+F when focus is inside the editor scope', () => {
    const actions = makeActions()
    const scope = document.createElement('div')
    scope.setAttribute('data-editor-find-scope', 'true')
    const editor = document.createElement('div')
    editor.tabIndex = 0
    scope.appendChild(editor)

    withFocusedElement(scope, () => {
      editor.focus()
      const event = commandF()
      handleAppKeyboardEvent(actions, event)

      expect(event.defaultPrevented).toBe(true)
      expect(actions.onFindInNote).toHaveBeenCalledOnce()
    })
  })

  it('yields Cmd+F outside the editor scope so note-list search can handle it', () => {
    const actions = makeActions()
    const noteList = document.createElement('div')
    noteList.tabIndex = 0

    withFocusedElement(noteList, () => {
      const event = commandF()
      handleAppKeyboardEvent(actions, event)

      expect(event.defaultPrevented).toBe(false)
      expect(actions.onFindInNote).not.toHaveBeenCalled()
    })
  })
})
