/*
 * SPDX-FileCopyrightText: 2020 The HedgeDoc developers (see AUTHORS file)
 *
 * SPDX-License-Identifier: AGPL-3.0-only
 */

import { ReactElement } from 'react'
import { Node } from 'domhandler'
import { ElementType } from 'domelementtype'
import { processTextNode } from './elementTypes/ProcessTextNode.js'
import { processTagNode } from './elementTypes/ProcessTagNode.js'
import { processStyleNode } from './elementTypes/ProcessStyleNode.js'
import { NodeToReactElementTransformer } from './NodeToReactElementTransformer.js'

/**
 * Converts a htmlparser2 node to a React element
 *
 * @param {Object} node The htmlparser2 node to convert
 * @param {Number} index The index of the current node
 * @param {Function} transform Transform function to apply to children of the node
 * @returns {React.Element}
 */
export function convertNodeToReactElement(
  node: Node,
  index: string | number,
  transform?: NodeToReactElementTransformer,
): ReactElement | string | null {
  switch (node.type) {
    case ElementType.Text:
      return processTextNode(node)
    case ElementType.Tag:
      return processTagNode(node, index, transform)
    case ElementType.Style:
      return processStyleNode(node, index)
    default:
      return null
  }
}
