import { ReactRenderer } from '@tiptap/react'
import tippy from 'tippy.js'
import MentionList from './MentionList'

/**
 * TipTap suggestion configuration for @mentions.
 * Fetches users from /api/search/users?q=... as the user types.
 */
export default {
  items: async ({ query }) => {
    if (!query || query.length < 2) return []

    try {
      const res = await fetch(`/api/search/users?q=${encodeURIComponent(query)}&per_page=6`)
      if (!res.ok) return []
      const json = await res.json()
      return json.data ?? []
    } catch {
      return []
    }
  },

  render: () => {
    let component
    let popup

    return {
      onStart: (props) => {
        component = new ReactRenderer(MentionList, {
          props,
          editor: props.editor,
        })

        if (!props.clientRect) return

        popup = tippy('body', {
          getReferenceClientRect: props.clientRect,
          appendTo: () => document.body,
          content: component.element,
          showOnCreate: true,
          interactive: true,
          trigger: 'manual',
          placement: 'bottom-start',
          theme: 'mention',
          arrow: false,
          offset: [0, 8],
        })
      },

      onUpdate: (props) => {
        component?.updateProps(props)

        if (!props.clientRect) return

        popup?.[0]?.setProps({
          getReferenceClientRect: props.clientRect,
        })
      },

      onKeyDown: (props) => {
        if (props.event.key === 'Escape') {
          popup?.[0]?.hide()
          return true
        }
        return component?.ref?.onKeyDown(props) ?? false
      },

      onExit: () => {
        popup?.[0]?.destroy()
        component?.destroy()
      },
    }
  },
}
