package org.jetbrains.dokka

import org.jetbrains.dokka.Formats.nameWithOuterClass


abstract class CommonLanguageService : LanguageService {

    protected fun ContentBlock.renderPackage(node: DocumentationNode) {
        keyword("package")
        nbsp()
        identifier(node.name)
    }

    override fun renderName(node: DocumentationNode): String {
        return when (node.kind) {
            NodeKind.Constructor -> node.owner!!.name
            else -> node.name
        }
    }

    override fun renderNameWithOuterClass(node: DocumentationNode): String {
        return when (node.kind) {
            NodeKind.Constructor -> node.owner!!.nameWithOuterClass()
            else -> node.nameWithOuterClass()
        }
    }

    open fun renderModifier(
        block: ContentBlock,
        node: DocumentationNode,
        renderMode: LanguageService.RenderMode,
        nowrap: Boolean = false
    ) = with(block) {
        keyword(node.name)
        if (nowrap) {
            nbsp()
        } else {
            text(" ")
        }
    }

    protected fun renderLinked(
        block: ContentBlock,
        node: DocumentationNode,
        body: ContentBlock.(DocumentationNode) -> Unit
    ) = with(block) {
        val to = node.links.firstOrNull()
        if (to == null)
            body(node)
        else
            link(to) {
                this.body(node)
            }
    }

    protected fun <T> ContentBlock.renderList(
        nodes: List<T>, separator: String = ", ",
        noWrap: Boolean = false, renderItem: (T) -> Unit
    ) {
        if (nodes.none())
            return
        renderItem(nodes.first())
        nodes.drop(1).forEach {
            if (noWrap) {
                symbol(separator.removeSuffix(" "))
                nbsp()
            } else {
                symbol(separator)
            }
            renderItem(it)
        }
    }

    abstract fun showModifierInSummary(node: DocumentationNode): Boolean

    protected fun ContentBlock.renderModifiersForNode(
        node: DocumentationNode,
        renderMode: LanguageService.RenderMode,
        nowrap: Boolean = false
    ) {
        val modifiers = node.details(NodeKind.Modifier)
        for (it in modifiers) {
            if (node.kind == NodeKind.Interface && it.name == "abstract")
                continue
            if (renderMode == LanguageService.RenderMode.SUMMARY && !showModifierInSummary(it)) {
                continue
            }
            renderModifier(this, it, renderMode, nowrap)
        }
    }


}