package org.jetbrains.dokka.base.resolvers.external

import org.jetbrains.dokka.base.resolvers.local.identifierToFilename
import org.jetbrains.dokka.links.DRI


class DokkaExternalLocationProviderFactory : ExternalLocationProviderFactory by ExternalLocationProviderFactoryWithCache(
    object : ExternalLocationProviderFactory {
        override fun getExternalLocationProvider(param: String): ExternalLocationProvider? =
            when (param) {
                "kotlin-website-html", "html" -> DokkaExternalLocationProvider(param, ".html")
                "markdown" -> DokkaExternalLocationProvider(param, ".md")
                else -> null
            }
    }
)

class DokkaExternalLocationProvider(override val param: String, val extension: String) : ExternalLocationProvider {

    override fun DRI.toLocation(): String { // TODO: classes without packages?

        val classNamesChecked = classNames ?: return "${packageName ?: ""}/index$extension"

        val classLink = (listOfNotNull(packageName) + classNamesChecked.split('.')).joinToString(
            "/",
            transform = ::identifierToFilename
        )

        val callableChecked = callable ?: return "$classLink/index$extension"

        return "$classLink/${identifierToFilename(
            callableChecked.name
        )}$extension"
    }
}