package org.jetbrains.dokka

import java.io.File

/**
 * Service for building the outline of the package contents.
 */
public interface OutlineFormatService {
    fun getOutlineFileName(location: Location): File

    public fun appendOutlineHeader(location: Location, node: DocumentationNode, to: StringBuilder)
    public fun appendOutlineLevel(to: StringBuilder, body: () -> Unit)

    /** Appends formatted outline to [StringBuilder](to) using specified [location] */
    public fun appendOutline(location: Location, to: StringBuilder, nodes: Iterable<DocumentationNode>) {
        for (node in nodes) {
            appendOutlineHeader(location, node, to)
            if (node.members.any()) {
                val sortedMembers = node.members.sortedBy { it.name }
                appendOutlineLevel(to) {
                    appendOutline(location, to, sortedMembers)
                }
            }
        }
    }

    fun formatOutline(location: Location, nodes: Iterable<DocumentationNode>): String =
            StringBuilder().apply { appendOutline(location, this, nodes) }.toString()
}