import { useCallback, useEffect, useRef, useState } from 'react'
import { quote as quoteMd } from '@/lib/md'

export function useQuoteReply ({ text }) {
  const ref = useRef(null)
  const [quote, setQuote] = useState(null)
  const [selection, setSelection] = useState(null)
  const to = useRef(null)

  const onSelectionChange = useCallback(e => {
    clearTimeout(to.current)
    const selection = window.getSelection()
    const selectedText = selection.isCollapsed ? undefined : selection.toString()
    const isSelectedTextInTarget = ref?.current?.contains(selection.anchorNode)

    if ((selection.isCollapsed || !isSelectedTextInTarget || !selectedText)) {
      // selection is collapsed or not in target or empty
      // but on button click we don't want to immediately clear selection
      to.current = setTimeout(() => setSelection(null), 1000)
      return
    }

    setSelection(selectedText)
  }, [ref?.current, setSelection])

  useEffect(() => {
    document.addEventListener('selectionchange', onSelectionChange)
    return () => document.removeEventListener('selectionchange', onSelectionChange)
  }, [])

  const quoteReply = useCallback(({ selectionOnly }) => {
    if (selectionOnly && !selection) return
    const textToQuote = selection || text
    setQuote(quoteMd(textToQuote))
  }, [selection, text])

  const cancelQuote = useCallback(() => {
    setQuote(null)
    setSelection(null)
  }, [setQuote, setSelection])

  return { ref, quote, quoteReply, cancelQuote }
}