import { type ResolvedPos, Slice } from 'prosemirror-model'
import { TextSelection, type Transaction } from 'prosemirror-state'
import { replaceStep, ReplaceStep } from 'prosemirror-transform'

// prettier-ignore
// https://github.com/prosemirror/prosemirror-commands/blob/e607d5abda0fcc399462e6452a82450f4118702d/src/commands.ts#L94
function joinTextblocksAround(tr: Transaction, $cut: ResolvedPos, dispatch?: (tr: Transaction) => void) {
  const before = $cut.nodeBefore!
  let beforeText = before
  let beforePos = $cut.pos - 1
  for (; !beforeText.isTextblock; beforePos--) {
    if (beforeText.type.spec.isolating) return false
    const child = beforeText.lastChild
    if (!child) return false
    beforeText = child
  }
  const after = $cut.nodeAfter!
  let afterText = after
  let afterPos = $cut.pos + 1
  for (; !afterText.isTextblock; afterPos++) {
    if (afterText.type.spec.isolating) return false
    const child = afterText.firstChild
    if (!child) return false
    afterText = child
  }
  const step = replaceStep(tr.doc, beforePos, afterPos, Slice.empty) as ReplaceStep | null
  if (!step || step.from != beforePos ||
      step instanceof ReplaceStep && step.slice.size >= afterPos - beforePos) return false
  if (dispatch) {
    tr.step(step)
    tr.setSelection(TextSelection.create(tr.doc, beforePos))
    dispatch(tr.scrollIntoView())
  }
  return true

}

export { joinTextblocksAround }
